Merge m-c to inbound, a=merge
authorWes Kocher <wkocher@mozilla.com>
Fri, 23 Dec 2016 14:40:42 -0800
changeset 453717 14d6cee6ce9d13e40a22e33c7940e25c79020e7d
parent 453716 ce7bd0b486c4816cce629c950524e3db3ae3acfd (current diff)
parent 453660 da22155a2dc30dafc93d70f38f6bb8a49248c80f (diff)
child 453718 275c894ee97095e64df89b6a575754e4949c21ae
push id39735
push usermaglione.k@gmail.com
push dateSun, 25 Dec 2016 02:55:47 +0000
reviewersmerge
milestone53.0a1
Merge m-c to inbound, a=merge MozReview-Commit-ID: 3HW7YWDqTBQ
layout/painting/nsDisplayList.cpp
old-configure.in
widget/windows/nsWindow.cpp
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/urlbar/Panel.jsm
@@ -0,0 +1,252 @@
+/* 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/. */
+
+this.EXPORTED_SYMBOLS = [
+  "Panel",
+];
+
+const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
+
+const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
+
+Cu.import("resource://gre/modules/Timer.jsm");
+
+this.Panel = function(panelElt, iframeURL) {
+  this.p = panelElt;
+  this.iframeURL = iframeURL;
+  this._initPanel();
+  this.urlbar.addEventListener("keydown", this);
+  this.urlbar.addEventListener("input", this);
+  this._emitQueue = [];
+};
+
+this.Panel.prototype = {
+
+  get document() {
+    return this.p.ownerDocument;
+  },
+
+  get window() {
+    return this.document.defaultView;
+  },
+
+  get urlbar() {
+    return this.window.gURLBar;
+  },
+
+  iframe: null,
+
+  get iframeDocument() {
+    return this.iframe.contentDocument;
+  },
+
+  get iframeWindow() {
+    return this.iframe.contentWindow;
+  },
+
+  destroy() {
+    this.p.destroyAddonIframe(this);
+    this.urlbar.removeEventListener("keydown", this);
+    this.urlbar.removeEventListener("input", this);
+  },
+
+  _initPanel() {
+    this.iframe = this.p.initAddonIframe(this, {
+      _invalidate: this._invalidate.bind(this),
+    });
+    if (!this.iframe) {
+      // This will be the case when somebody else already owns the iframe.
+      // First consumer wins right now.
+      return;
+    }
+    let onLoad = event => {
+      this.iframe.removeEventListener("load", onLoad, true);
+      this._initIframeContent(event.target.defaultView);
+    };
+    this.iframe.addEventListener("load", onLoad, true);
+    this.iframe.setAttribute("src", this.iframeURL);
+  },
+
+  _initIframeContent(win) {
+    // Clone the urlbar API functions into the iframe window.
+    win = XPCNativeWrapper.unwrap(win);
+    let apiInstance = Cu.cloneInto(iframeAPIPrototype, win, {
+      cloneFunctions: true,
+    });
+    apiInstance._panel = this;
+    Object.defineProperty(win, "urlbar", {
+      get() {
+        return apiInstance;
+      },
+    });
+  },
+
+  // This is called by the popup directly.  It overrides the popup's own
+  // _invalidate method.
+  _invalidate() {
+    this._emit("reset");
+    this._currentIndex = 0;
+    if (this._appendResultTimeout) {
+      this.window.clearTimeout(this._appendResultTimeout);
+    }
+    this._appendCurrentResult();
+  },
+
+  // This emulates the popup's own _appendCurrentResult method, except instead
+  // of appending results to the popup, it emits "result" events to the iframe.
+  _appendCurrentResult() {
+    let controller = this.p.mInput.controller;
+    for (let i = 0; i < this.p.maxResults; i++) {
+      let idx = this._currentIndex;
+      if (idx >= this.p._matchCount) {
+        break;
+      }
+      let url = controller.getValueAt(idx);
+      let action = this.urlbar._parseActionUrl(url);
+      this._emit("result", {
+        url: url,
+        action: action,
+        image: controller.getImageAt(idx),
+        title: controller.getCommentAt(idx),
+        type: controller.getStyleAt(idx),
+        text: controller.searchString.replace(/^\s+/, "").replace(/\s+$/, ""),
+      });
+      this._currentIndex++;
+    }
+    if (this._currentIndex < this.p.matchCount) {
+      this._appendResultTimeout = this.window.setTimeout(() => {
+        this._appendCurrentResult();
+      });
+    }
+  },
+
+  get height() {
+    return this.iframe.getBoundingClientRect().height;
+  },
+
+  set height(val) {
+    this.p.removeAttribute("height");
+    this.iframe.style.height = val + "px";
+  },
+
+  handleEvent(event) {
+    let methName = "_on" + event.type[0].toUpperCase() + event.type.substr(1);
+    this[methName](event);
+  },
+
+  _onKeydown(event) {
+    let emittedEvent = this._emitUrlbarEvent(event);
+    if (emittedEvent && emittedEvent.defaultPrevented) {
+      event.preventDefault();
+      event.stopPropagation();
+    }
+  },
+
+  _onInput(event) {
+    this._emitUrlbarEvent(event);
+  },
+
+  _emitUrlbarEvent(event) {
+    let properties = [
+      "altKey",
+      "code",
+      "ctrlKey",
+      "key",
+      "metaKey",
+      "shiftKey",
+    ];
+    let detail = properties.reduce((memo, prop) => {
+      memo[prop] = event[prop];
+      return memo;
+    }, {});
+    return this._emit(event.type, detail);
+  },
+
+  _emit(eventName, detailObj = null) {
+    this._emitQueue.push({
+      name: eventName,
+      detail: detailObj,
+    });
+    return this._processEmitQueue();
+  },
+
+  _processEmitQueue() {
+    if (!this._emitQueue.length) {
+      return null;
+    }
+
+    // iframe.contentWindow can be undefined right after the iframe is created,
+    // even after a number of seconds have elapsed.  Don't know why.  But that's
+    // entirely the reason for having a queue instead of simply dispatching
+    // events as they're created, unfortunately.
+    if (!this.iframeWindow) {
+      if (!this._processEmitQueueTimer) {
+        this._processEmitQueueTimer = setInterval(() => {
+          this._processEmitQueue();
+        }, 100);
+      }
+      return null;
+    }
+
+    if (this._processEmitQueueTimer) {
+      clearInterval(this._processEmitQueueTimer);
+      delete this._processEmitQueueTimer;
+    }
+
+    let { name, detail } = this._emitQueue.shift();
+    let win = XPCNativeWrapper.unwrap(this.iframeWindow);
+    let event = new this.iframeWindow.CustomEvent(name, {
+      detail: Cu.cloneInto(detail, win),
+      cancelable: true,
+    });
+    this.iframeWindow.dispatchEvent(event);
+
+    // More events may be queued up, so recurse.  Do it after a turn of the
+    // event loop to avoid growing the stack as big as the queue, and to let the
+    // caller handle the returned event first.
+    setTimeout(() => {
+      this._processEmitQueue();
+    }, 100);
+
+    return event;
+  },
+};
+
+
+// This is the consumer API that's cloned into the iframe window.  Be careful of
+// defining static values on this, or even getters and setters (that aren't real
+// functions).  The cloning process means that such values are copied by value,
+// at the time of cloning, which is probably not what you want.  That's why some
+// of these are functions even though it'd be nicer if they were getters and
+// setters.
+let iframeAPIPrototype = {
+
+  getPanelHeight() {
+    return this._panel.height;
+  },
+
+  setPanelHeight(val) {
+    this._panel.height = val;
+  },
+
+  getValue() {
+    return this._panel.urlbar.value;
+  },
+
+  setValue(val) {
+    this._panel.urlbar.value = val;
+  },
+
+  getMaxResults() {
+    return this._panel.p.maxResults;
+  },
+
+  setMaxResults(val) {
+    this._panel.p.maxResults = val;
+  },
+
+  enter() {
+    this._panel.urlbar.handleCommand();
+  },
+};
--- a/browser/base/content/test/urlbar/browser.ini
+++ b/browser/base/content/test/urlbar/browser.ini
@@ -44,16 +44,22 @@ subsuite = clipboard
 [browser_removeUnsafeProtocolsFromURLBarPaste.js]
 subsuite = clipboard
 [browser_search_favicon.js]
 [browser_tabMatchesInAwesomebar.js]
 support-files =
   moz.png
 [browser_tabMatchesInAwesomebar_perwindowpb.js]
 skip-if = os == 'linux' # Bug 1104755
+[browser_urlbarAddonIframe.js]
+support-files =
+  Panel.jsm
+  urlbarAddonIframe.html
+  urlbarAddonIframe.js
+  urlbarAddonIframeContentScript.js
 [browser_urlbarAboutHomeLoading.js]
 [browser_urlbarAutoFillTrimURLs.js]
 [browser_urlbarCopying.js]
 subsuite = clipboard
 support-files =
   authenticate.sjs
 [browser_urlbarDecode.js]
 [browser_urlbarDelete.js]
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/urlbar/browser_urlbarAddonIframe.js
@@ -0,0 +1,220 @@
+"use strict";
+
+// The purpose of this test is to test the urlbar popup's add-on iframe.  It has
+// a few parts:
+//
+// (1) This file, a normal browser mochitest.
+// (2) html/js files that are loaded in the urlbar popup's add-on iframe:
+//     urlbarAddonIframe.{html,js}
+// (3) A content script that mediates between the first two parts:
+//     urlbarAddonIframeContentScript.js
+//
+// The main test file (this file) sends messages to the content script, which
+// forwards them as events to the iframe.  These messages tell the iframe js to
+// do various things like call functions on the urlbar API and expect events.
+// In response, the iframe js dispatches ack events to the content script, which
+// forwards them as messages to the main test file.
+//
+// The content script may not be necessary right now since the iframe is not
+// remote.  But this structure ensures that if the iframe is made remote in the
+// future, then the test won't have to change very much, and ideally not at all.
+//
+// Actually there's one other part:
+//
+// (4) The Panel.jsm that's bundled with add-ons that use the iframe.
+//
+// Panel.jsm defines the API that's made available to add-on scripts running in
+// the iframe.  This API is orthogonal to the add-on iframe itself.  You could
+// load any html/js in the iframe, technically.  But the purpose of the iframe
+// is to support this Panel.jsm API, so that's what this test tests.
+
+const PANEL_JSM_BASENAME = "Panel.jsm";
+const IFRAME_BASENAME = "urlbarAddonIframe.html";
+const CONTENT_SCRIPT_BASENAME = "urlbarAddonIframeContentScript.js";
+
+// The iframe's message manager.
+let gMsgMan;
+
+add_task(function* () {
+  let rootDirURL = getRootDirectory(gTestPath);
+  let jsmURL = rootDirURL + PANEL_JSM_BASENAME;
+  let iframeURL = rootDirURL + IFRAME_BASENAME;
+  let contentScriptURL = rootDirURL + CONTENT_SCRIPT_BASENAME;
+
+  let { Panel } = Cu.import(jsmURL, {});
+  let panel = new Panel(gURLBar.popup, iframeURL);
+  registerCleanupFunction(() => {
+    panel.destroy();
+    Assert.ok(gURLBar.popup._addonIframe === null, "iframe should be gone");
+  });
+
+  let iframe = gURLBar.popup._addonIframe;
+  Assert.ok(!!iframe, "iframe should not be null");
+
+  gMsgMan =
+    iframe.QueryInterface(Ci.nsIFrameLoaderOwner).frameLoader.messageManager;
+  gMsgMan.loadFrameScript(contentScriptURL, false);
+
+  yield promiseIframeLoad();
+
+  // urlbar.getValue
+  let value = "this value set by the test";
+  gURLBar.value = value;
+  let readValue = yield promiseUrlbarFunctionCall("getValue");
+  Assert.equal(readValue, value, "value");
+
+  // urlbar.setValue
+  value = "this value set by the iframe";
+  yield promiseUrlbarFunctionCall("setValue", value);
+  Assert.equal(gURLBar.value, value, "setValue");
+
+  // urlbar.getMaxResults
+  let maxResults = gURLBar.popup.maxResults;
+  Assert.equal(typeof(maxResults), "number", "Sanity check");
+  let readMaxResults = yield promiseUrlbarFunctionCall("getMaxResults");
+  Assert.equal(readMaxResults, maxResults, "getMaxResults");
+
+  // urlbar.setMaxResults
+  let newMaxResults = maxResults + 10;
+  yield promiseUrlbarFunctionCall("setMaxResults", newMaxResults);
+  Assert.equal(gURLBar.popup.maxResults, newMaxResults, "setMaxResults");
+  gURLBar.popup.maxResults = maxResults;
+
+  // urlbar.enter
+  value = "http://mochi.test:8888/";
+  yield promiseUrlbarFunctionCall("setValue", value);
+  Assert.equal(gURLBar.value, value, "setValue");
+  yield promiseUrlbarFunctionCall("enter");
+  let browser = gBrowser.selectedBrowser;
+  yield BrowserTestUtils.browserLoaded(browser);
+  Assert.equal(browser.currentURI.spec, value,
+               "enter should have loaded the URL");
+
+  // input, reset, and result events.  There should always be at least one
+  // result, the heuristic result.
+  value = "test";
+  let promiseValues = yield Promise.all([
+    promiseEvent("input")[1],
+    promiseEvent("reset")[1],
+    promiseEvent("result")[1],
+    promiseAutocompleteResultPopup(value, window, true),
+  ]);
+
+  // Check the heuristic result.
+  let result = promiseValues[2];
+  let engineName = Services.search.currentEngine.name;
+  Assert.equal(result.url,
+               `moz-action:searchengine,{"engineName":"${engineName}","input":"test","searchQuery":"test"}`,
+               "result.url");
+  Assert.ok("action" in result, "result.action");
+  Assert.equal(result.action.type, "searchengine", "result.action.type");
+  Assert.ok("params" in result.action, "result.action.params");
+  Assert.equal(result.action.params.engineName, engineName,
+               "result.action.params.engineName");
+  Assert.equal(typeof(result.image), "string", "result.image");
+  Assert.equal(result.title, engineName, "result.title");
+  Assert.equal(result.type, "action searchengine heuristic", "result.type");
+  Assert.equal(result.text, value, "result.text");
+
+  // keydown event.  promiseEvent sends an async message to the iframe, but
+  // synthesizeKey is sync, so we need to wait until the content JS receives
+  // the message and adds its event listener before synthesizing the key.
+  let keydownPromises = promiseEvent("keydown");
+  yield keydownPromises[0];
+  EventUtils.synthesizeKey("KEY_ArrowDown", {
+    type: "keydown",
+    code: "ArrowDown",
+  });
+  yield keydownPromises[1];
+
+  // urlbar.getPanelHeight
+  let height = iframe.getBoundingClientRect().height;
+  let readHeight = yield promiseUrlbarFunctionCall("getPanelHeight");
+  Assert.equal(readHeight, height, "getPanelHeight");
+
+  // urlbar.setPanelHeight
+  let newHeight = height + 100;
+  yield promiseUrlbarFunctionCall("setPanelHeight", newHeight);
+  yield new Promise(resolve => {
+    // The height change is animated, so give it time to complete.  Again, wait
+    // a sec to be safe.
+    setTimeout(resolve, 1000);
+  });
+  Assert.equal(iframe.getBoundingClientRect().height, newHeight,
+               "setPanelHeight");
+});
+
+function promiseIframeLoad() {
+  let msgName = "TestIframeLoadAck";
+  return new Promise(resolve => {
+    info("Waiting for iframe load ack");
+    gMsgMan.addMessageListener(msgName, function onMsg(msg) {
+      info("Received iframe load ack");
+      gMsgMan.removeMessageListener(msgName, onMsg);
+      resolve();
+    });
+  });
+}
+
+/**
+ * Returns a single promise that's resolved when the content JS has called the
+ * function.
+ */
+function promiseUrlbarFunctionCall(...args) {
+  return promiseMessage("function", args)[0];
+}
+
+/**
+ * Returns two promises in an array.  The first is resolved when the content JS
+ * has added its event listener.  The second is resolved when the content JS
+ * has received the event.
+ */
+function promiseEvent(type) {
+  return promiseMessage("event", type, 2);
+}
+
+let gNextMessageID = 1;
+
+/**
+ * Returns an array of promises, one per ack.  Each is resolved when the content
+ * JS acks the message.  numExpectedAcks is the number of acks you expect.
+ */
+function promiseMessage(type, data, numExpectedAcks = 1) {
+  let testMsgName = "TestMessage";
+  let ackMsgName = "TestMessageAck";
+  let msgID = gNextMessageID++;
+  gMsgMan.sendAsyncMessage(testMsgName, {
+    type: type,
+    messageID: msgID,
+    data: data,
+  });
+  let ackPromises = [];
+  for (let i = 0; i < numExpectedAcks; i++) {
+    let ackIndex = i;
+    ackPromises.push(new Promise(resolve => {
+      info("Waiting for message ack: " + JSON.stringify({
+        type: type,
+        msgID: msgID,
+        ackIndex: ackIndex,
+      }));
+      gMsgMan.addMessageListener(ackMsgName, function onMsg(msg) {
+        // Messages have IDs so that an ack can be correctly paired with the
+        // initial message it's replying to.  It's not an error if the ack's ID
+        // isn't equal to msgID here.  That will happen when multiple messages
+        // have been sent in a single turn of the event loop so that they're all
+        // waiting on acks.  Same goes for ackIndex.
+        if (msg.data.messageID != msgID || msg.data.ackIndex != ackIndex) {
+          return;
+        }
+        info("Received message ack: " + JSON.stringify({
+          type: type,
+          msgID: msg.data.messageID,
+          ackIndex: ackIndex,
+        }));
+        gMsgMan.removeMessageListener(ackMsgName, onMsg);
+        resolve(msg.data.data);
+      });
+    }));
+  }
+  return ackPromises;
+}
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/urlbar/urlbarAddonIframe.html
@@ -0,0 +1,8 @@
+<html>
+  <head>
+    <script src="http://mochi.test:8888/browser/browser/base/content/test/urlbar/urlbarAddonIframe.js"></script>
+  </head>
+  <body>
+    Hello
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/urlbar/urlbarAddonIframe.js
@@ -0,0 +1,52 @@
+// Listen for messages from the test.
+addEventListener("TestEvent", event => {
+  let type = event.detail.type;
+  dump("urlbarAddonIframe.js got TestEvent, type=" + type +
+       " messageID=" + event.detail.messageID + "\n");
+  switch (type) {
+  case "function":
+    callUrlbarFunction(event.detail);
+    break;
+  case "event":
+    expectEvent(event.detail);
+    break;
+  }
+});
+
+// Calls a urlbar API function.
+function callUrlbarFunction(detail) {
+  let args = detail.data;
+  let methodName = args.shift();
+  dump("urlbarAddonIframe.js calling urlbar." + methodName + "\n");
+  let rv = urlbar[methodName](...args);
+  ack(detail, rv);
+}
+
+// Waits for an event of a specified type to happen.
+function expectEvent(detail) {
+  let type = detail.data;
+  dump("urlbarAddonIframe.js expecting event of type " + type + "\n");
+  // Ack that the message was received and an event listener was added.
+  ack(detail, null, 0);
+  addEventListener(type, function onEvent(event) {
+    dump("urlbarAddonIframe.js got event of type " + type + "\n");
+    if (event.type != type) {
+      return;
+    }
+    dump("urlbarAddonIframe.js got expected event\n");
+    removeEventListener(type, onEvent);
+    // Ack that the event was received.
+    ack(detail, event.detail, 1);
+  });
+}
+
+// Sends an ack to the test.
+function ack(originalEventDetail, ackData = null, ackIndex = 0) {
+  dispatchEvent(new CustomEvent("TestEventAck", {
+    detail: {
+      messageID: originalEventDetail.messageID,
+      ackIndex: ackIndex,
+      data: ackData,
+    },
+  }));
+}
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/urlbar/urlbarAddonIframeContentScript.js
@@ -0,0 +1,23 @@
+// Forward messages from the test to the iframe as events.
+addMessageListener("TestMessage", msg => {
+  content.dispatchEvent(new content.CustomEvent("TestEvent", {
+    detail: Components.utils.cloneInto(msg.data, content),
+  }));
+});
+
+// Forward events from the iframe to the test as messages.
+addEventListener("TestEventAck", event => {
+  // The waiveXrays call is copied from the contentSearch.js part of
+  // browser_ContentSearch.js test.  Not sure whether it's necessary here.
+  sendAsyncMessage("TestMessageAck", Components.utils.waiveXrays(event.detail));
+}, true, true);
+
+// Send a message to the test when the iframe is loaded.
+if (content.document.readyState == "complete") {
+  sendAsyncMessage("TestIframeLoadAck");
+} else {
+  addEventListener("load", function onLoad(event) {
+    removeEventListener("load", onLoad);
+    sendAsyncMessage("TestIframeLoadAck");
+  }, true, true);
+}
--- a/browser/base/content/urlbarBindings.xml
+++ b/browser/base/content/urlbarBindings.xml
@@ -1454,28 +1454,33 @@ file, You can obtain one at http://mozil
             return this.input.mController.matchCount > 0 &&
                    this.input.mController
                              .getStyleAt(0)
                              .split(/\s+/).indexOf("heuristic") > 0;
           ]]>
         </getter>
       </property>
 
-      <property name="maxResults" readonly="true">
+      <property name="maxResults">
         <getter>
           <![CDATA[
             if (!this._maxResults) {
               var prefService =
                 Components.classes["@mozilla.org/preferences-service;1"]
                           .getService(Components.interfaces.nsIPrefBranch);
               this._maxResults = prefService.getIntPref("browser.urlbar.maxRichResults");
             }
             return this._maxResults;
           ]]>
         </getter>
+        <setter>
+          <![CDATA[
+            return this._maxResults = parseInt(val);
+          ]]>
+        </setter>
       </property>
 
       <method name="openAutocompletePopup">
         <parameter name="aInput"/>
         <parameter name="aElement"/>
         <body>
           <![CDATA[
           // initially the panel is hidden
@@ -1812,16 +1817,109 @@ file, You can obtain one at http://mozil
           //    disabled), this won't be called, and the selectedIndex will be
           //    the default -1 value. Then handleEnter will know it should not
           //    delay the action, cause a result wont't ever arrive.
           this.input.controller.setInitiallySelectedIndex(0);
           this.overrideValue = null;
         ]]></body>
       </method>
 
+      <field name="_addonIframe">null</field>
+      <field name="_addonIframeOwner">null</field>
+      <field name="_addonIframeOverriddenFunctionsByName">{}</field>
+
+      <!-- These methods must be overridden and properly handled by the API
+           runtime so that it doesn't break the popup.  If any of these methods
+           is not overridden, then initAddonIframe should throw. -->
+      <field name="_addonIframeOverrideFunctionNames">[
+        "_invalidate",
+      ]</field>
+
+      <field name="_addonIframeHiddenAnonids">[
+        "search-suggestions-notification",
+        "richlistbox",
+        "one-off-search-buttons",
+      ]</field>
+      <field name="_addonIframeHiddenDisplaysByAnonid">{}</field>
+
+      <method name="initAddonIframe">
+        <parameter name="owner"/>
+        <parameter name="overrides"/>
+        <body><![CDATA[
+          if (this._addonIframeOwner) {
+            // Another add-on has already requested the iframe.  Return null to
+            // signal to the calling add-on that it should not take over the
+            // popup.  First add-on wins for now.
+            return null;
+          }
+          // Make sure all overrides are provided before doing anything.
+          for (let name of this._addonIframeOverrideFunctionNames) {
+            if (typeof(overrides[name]) != "function") {
+              throw new Error(
+                "Override for method '" + name + "' must be given"
+              );
+            }
+          }
+          // OK, insert the iframe.
+          this._addonIframeOwner = owner;
+          this._addonIframe = this._makeAddonIframe();
+          this._addonIframeOverriddenFunctionsByName = {};
+          for (let name of this._addonIframeOverrideFunctionNames) {
+            this._addonIframeOverriddenFunctionsByName[name] = this[name];
+            this[name] = overrides[name];
+          }
+          return this._addonIframe;
+        ]]></body>
+      </method>
+
+      <method name="destroyAddonIframe">
+        <parameter name="owner"/>
+        <body><![CDATA[
+          if (this._addonIframeOwner != owner) {
+            throw new Error("You're not the iframe owner");
+          }
+          this._addonIframeOwner = null;
+          this._addonIframe.remove();
+          this._addonIframe = null;
+          for (let anonid of this._addonIframeHiddenAnonids) {
+            let child = document.getAnonymousElementByAttribute(
+              this, "anonid", anonid
+            );
+            child.style.display =
+              this._addonIframeHiddenDisplaysByAnonid[anonid];
+          }
+          for (let name in this._addonIframeOverriddenFunctionsByName) {
+            this[name] = this._addonIframeOverriddenFunctionsByName[name];
+          }
+          this._addonIframeOverriddenFunctionsByName = {};
+        ]]></body>
+      </method>
+
+      <method name="_makeAddonIframe">
+        <body><![CDATA[
+          this._addonIframeHiddenDisplaysByAnonid = {};
+          for (let anonid of this._addonIframeHiddenAnonids) {
+            let child = document.getAnonymousElementByAttribute(
+              this, "anonid", anonid
+            );
+            this._addonIframeHiddenDisplaysByAnonid[anonid] =
+              child.style.display;
+            child.style.display = "none";
+          }
+          let XUL_NS =
+            "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
+          let iframe = document.createElementNS(XUL_NS, "iframe");
+          iframe.setAttribute("type", "content");
+          iframe.setAttribute("flex", "1");
+          iframe.style.transition = "height 100ms";
+          this.appendChild(iframe);
+          return iframe;
+        ]]></body>
+      </method>
+
     </implementation>
     <handlers>
 
       <handler event="SelectedOneOffButtonChanged"><![CDATA[
         this._selectedOneOffChanged();
       ]]></handler>
 
       <handler event="mousedown"><![CDATA[
--- a/browser/components/extensions/ext-browserAction.js
+++ b/browser/components/extensions/ext-browserAction.js
@@ -4,19 +4,19 @@
 
 XPCOMUtils.defineLazyModuleGetter(this, "CustomizableUI",
                                   "resource:///modules/CustomizableUI.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "clearTimeout",
                                   "resource://gre/modules/Timer.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "setTimeout",
                                   "resource://gre/modules/Timer.jsm");
 
-XPCOMUtils.defineLazyGetter(this, "colorUtils", () => {
-  return require("devtools/shared/css/color").colorUtils;
-});
+XPCOMUtils.defineLazyServiceGetter(this, "DOMUtils",
+                                   "@mozilla.org/inspector/dom-utils;1",
+                                   "inIDOMUtils");
 
 Cu.import("resource://devtools/shared/event-emitter.js");
 Cu.import("resource://gre/modules/ExtensionUtils.jsm");
 Cu.import("resource://gre/modules/Task.jsm");
 
 var {
   EventManager,
   IconDetails,
@@ -523,17 +523,17 @@ extensions.registerSchemaAPI("browserAct
         let popup = BrowserAction.for(extension).getProperty(tab, "popup");
         return Promise.resolve(popup);
       },
 
       setBadgeBackgroundColor: function(details) {
         let tab = details.tabId !== null ? TabManager.getTab(details.tabId, context) : null;
         let color = details.color;
         if (!Array.isArray(color)) {
-          let col = colorUtils.colorToRGBA(color);
+          let col = DOMUtils.colorToRGBA(color);
           color = col && [col.r, col.g, col.b, Math.round(col.a * 255)];
         }
         BrowserAction.for(extension).setProperty(tab, "badgeBackgroundColor", color);
       },
 
       getBadgeBackgroundColor: function(details, callback) {
         let tab = details.tabId !== null ? TabManager.getTab(details.tabId, context) : null;
 
--- a/browser/components/extensions/ext-utils.js
+++ b/browser/components/extensions/ext-utils.js
@@ -12,20 +12,16 @@ XPCOMUtils.defineLazyModuleGetter(this, 
                                   "resource://gre/modules/Task.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "setTimeout",
                                   "resource://gre/modules/Timer.jsm");
 
 XPCOMUtils.defineLazyServiceGetter(this, "styleSheetService",
                                    "@mozilla.org/content/style-sheet-service;1",
                                    "nsIStyleSheetService");
 
-XPCOMUtils.defineLazyGetter(this, "colorUtils", () => {
-  return require("devtools/shared/css/color").colorUtils;
-});
-
 Cu.import("resource://gre/modules/ExtensionUtils.jsm");
 Cu.import("resource://gre/modules/AppConstants.jsm");
 
 const POPUP_LOAD_TIMEOUT_MS = 200;
 
 const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
 
 var {
--- a/devtools/client/inspector/shared/tooltips-overlay.js
+++ b/devtools/client/inspector/shared/tooltips-overlay.js
@@ -83,17 +83,19 @@ TooltipsOverlay.prototype = {
     this.previewTooltip.startTogglingOnHover(this.view.element,
       this._onPreviewTooltipTargetHover.bind(this));
 
     // MDN CSS help tooltip
     this.cssDocs = new CssDocsTooltip(toolbox.doc);
 
     if (this.isRuleView) {
       // Color picker tooltip
-      this.colorPicker = new SwatchColorPickerTooltip(toolbox.doc, this.view.inspector);
+      this.colorPicker = new SwatchColorPickerTooltip(toolbox.doc,
+                                                      this.view.inspector,
+                                                      this._cssProperties);
       // Cubic bezier tooltip
       this.cubicBezier = new SwatchCubicBezierTooltip(toolbox.doc);
       // Filter editor tooltip
       this.filterEditor = new SwatchFilterTooltip(toolbox.doc,
         this._cssProperties.getValidityChecker(this.view.inspector.panelDoc));
     }
 
     this._isStarted = true;
--- a/devtools/client/shared/output-parser.js
+++ b/devtools/client/shared/output-parser.js
@@ -35,26 +35,31 @@ const CSS_GRID_ENABLED_PREF = "layout.cs
  *
  * @param {Document} document Used to create DOM nodes.
  * @param {Function} supportsTypes - A function that returns a boolean when asked if a css
  *                   property name supports a given css type.
  *                   The function is executed like supportsType("color", CSS_TYPES.COLOR)
  *                   where CSS_TYPES is defined in devtools/shared/css/properties-db.js
  * @param {Function} isValidOnClient - A function that checks if a css property
  *                   name/value combo is valid.
+ * @param {Function} supportsCssColor4ColorFunction - A function for checking
+ *                   the supporting of css-color-4 color function.
  */
-function OutputParser(document, {supportsType, isValidOnClient}) {
+function OutputParser(document,
+                      {supportsType, isValidOnClient, supportsCssColor4ColorFunction}) {
   this.parsed = [];
   this.doc = document;
   this.supportsType = supportsType;
   this.isValidOnClient = isValidOnClient;
   this.colorSwatches = new WeakMap();
   this.angleSwatches = new WeakMap();
   this._onColorSwatchMouseDown = this._onColorSwatchMouseDown.bind(this);
   this._onAngleSwatchMouseDown = this._onAngleSwatchMouseDown.bind(this);
+
+  this.cssColor4 = supportsCssColor4ColorFunction();
 }
 
 OutputParser.prototype = {
   /**
    * Parse a CSS property value given a property name.
    *
    * @param  {String} name
    *         CSS Property Name
@@ -181,47 +186,49 @@ OutputParser.prototype = {
             }
             ++parenDepth;
           } else {
             let functionText = this._collectFunctionText(token, text,
                                                          tokenStream);
 
             if (options.expectCubicBezier && token.text === "cubic-bezier") {
               this._appendCubicBezier(functionText, options);
-            } else if (colorOK() && colorUtils.isValidCSSColor(functionText)) {
+            } else if (colorOK() &&
+                       colorUtils.isValidCSSColor(functionText, this.cssColor4)) {
               this._appendColor(functionText, options);
             } else {
               this._appendTextNode(functionText);
             }
           }
           break;
         }
 
         case "ident":
           if (options.expectCubicBezier &&
               BEZIER_KEYWORDS.indexOf(token.text) >= 0) {
             this._appendCubicBezier(token.text, options);
           } else if (Services.prefs.getBoolPref(CSS_GRID_ENABLED_PREF) &&
                      options.expectDisplay && token.text === "grid" &&
                      text === token.text) {
             this._appendGrid(token.text, options);
-          } else if (colorOK() && colorUtils.isValidCSSColor(token.text)) {
+          } else if (colorOK() &&
+                     colorUtils.isValidCSSColor(token.text, this.cssColor4)) {
             this._appendColor(token.text, options);
           } else if (angleOK(token.text)) {
             this._appendAngle(token.text, options);
           } else {
             this._appendTextNode(text.substring(token.startOffset,
                                                 token.endOffset));
           }
           break;
 
         case "id":
         case "hash": {
           let original = text.substring(token.startOffset, token.endOffset);
-          if (colorOK() && colorUtils.isValidCSSColor(original)) {
+          if (colorOK() && colorUtils.isValidCSSColor(original, this.cssColor4)) {
             this._appendColor(original, options);
           } else {
             this._appendTextNode(original);
           }
           break;
         }
         case "dimension":
           let value = text.substring(token.startOffset, token.endOffset);
@@ -387,17 +394,17 @@ OutputParser.prototype = {
    *
    * @param  {String} color
    *         Color to append
    * @param  {Object} [options]
    *         Options object. For valid options and default values see
    *         _mergeOptions().
    */
   _appendColor: function (color, options = {}) {
-    let colorObj = new colorUtils.CssColor(color);
+    let colorObj = new colorUtils.CssColor(color, this.cssColor4);
 
     if (this._isValidColor(colorObj)) {
       let container = this._createNode("span", {
         "data-color": color
       });
 
       if (options.colorSwatchClass) {
         let swatch = this._createNode("span", {
--- a/devtools/client/shared/test/unit/test_cssColor-03.js
+++ b/devtools/client/shared/test/unit/test_cssColor-03.js
@@ -37,25 +37,25 @@ const CSS_COLOR_4_TESTS = [
   "hsl(240 25% 33%)",
   "hsl(50deg 25% 33% / 0.25)",
   "hsl(60 120% 60% / 0.25)",
   "hSlA(5turn 40% 4%)",
 ];
 
 function run_test() {
   for (let test of OLD_STYLE_TESTS) {
-    let ours = colorUtils.colorToRGBA(test, true);
+    let ours = colorUtils.colorToRGBA(test, false);
     let platform = DOMUtils.colorToRGBA(test);
     deepEqual(ours, platform, "color " + test + " matches DOMUtils");
     ok(ours !== null, "'" + test + "' is a color");
   }
 
   for (let test of CSS_COLOR_4_TESTS) {
-    let oursOld = colorUtils.colorToRGBA(test, true);
-    let oursNew = colorUtils.colorToRGBA(test, false);
+    let oursOld = colorUtils.colorToRGBA(test, false);
+    let oursNew = colorUtils.colorToRGBA(test, true);
     let platform = DOMUtils.colorToRGBA(test);
     notEqual(oursOld, platform, "old style parser for color " + test +
              " should not match DOMUtils");
     ok(oursOld === null, "'" + test + "' is not a color with old parser");
     deepEqual(oursNew, platform, `css-color-4 parser for color ${test} matches DOMUtils`);
     ok(oursNew !== null, "'" + test + "' is a color with css-color-4 parser");
   }
 }
--- a/devtools/client/shared/widgets/tooltip/SwatchColorPickerTooltip.js
+++ b/devtools/client/shared/widgets/tooltip/SwatchColorPickerTooltip.js
@@ -23,28 +23,33 @@ const XHTML_NS = "http://www.w3.org/1999
  * color picker.
  *
  * @param {Document} document
  *        The document to attach the SwatchColorPickerTooltip. This is either the toolbox
  *        document if the tooltip is a popup tooltip or the panel's document if it is an
  *        inline editor.
  * @param {InspectorPanel} inspector
  *        The inspector panel, needed for the eyedropper.
+ * @param {Function} supportsCssColor4ColorFunction
+ *        A function for checking the supporting of css-color-4 color function.
  */
-function SwatchColorPickerTooltip(document, inspector) {
+function SwatchColorPickerTooltip(document,
+                                  inspector,
+                                  {supportsCssColor4ColorFunction}) {
   let stylesheet = "chrome://devtools/content/shared/widgets/spectrum.css";
   SwatchBasedEditorTooltip.call(this, document, stylesheet);
 
   this.inspector = inspector;
 
   // Creating a spectrum instance. this.spectrum will always be a promise that
   // resolves to the spectrum instance
   this.spectrum = this.setColorPickerContent([0, 0, 0, 1]);
   this._onSpectrumColorChange = this._onSpectrumColorChange.bind(this);
   this._openEyeDropper = this._openEyeDropper.bind(this);
+  this.cssColor4 = supportsCssColor4ColorFunction();
 }
 
 SwatchColorPickerTooltip.prototype = Heritage.extend(SwatchBasedEditorTooltip.prototype, {
   /**
    * Fill the tooltip with a new instance of the spectrum color picker widget
    * initialized with the given color, and return the instance of spectrum
    */
   setColorPickerContent: function (color) {
@@ -152,24 +157,24 @@ SwatchColorPickerTooltip.prototype = Her
   },
 
   _onEyeDropperDone: function () {
     this.eyedropperOpen = false;
     this.activeSwatch = null;
   },
 
   _colorToRgba: function (color) {
-    color = new colorUtils.CssColor(color);
+    color = new colorUtils.CssColor(color, this.cssColor4);
     let rgba = color._getRGBATuple();
     return [rgba.r, rgba.g, rgba.b, rgba.a];
   },
 
   _toDefaultType: function (color) {
     let colorObj = new colorUtils.CssColor(color);
-    colorObj.setAuthoredUnitFromColor(this._originalColor);
+    colorObj.setAuthoredUnitFromColor(this._originalColor, this.cssColor4);
     return colorObj.toString();
   },
 
   destroy: function () {
     SwatchBasedEditorTooltip.prototype.destroy.call(this);
     this.inspector = null;
     this.currentSwatchColor = null;
     this.spectrum.off("changed", this._onSpectrumColorChange);
--- a/devtools/server/actors/css-properties.js
+++ b/devtools/server/actors/css-properties.js
@@ -25,18 +25,22 @@ exports.CssPropertiesActor = ActorClassW
 
   destroy() {
     Actor.prototype.destroy.call(this);
   },
 
   getCSSDatabase() {
     const properties = generateCssProperties();
     const pseudoElements = DOMUtils.getCSSPseudoElementNames();
+    const supportedFeature = {
+      // checking for css-color-4 color function support.
+      "css-color-4-color-function": DOMUtils.isValidCSSColor("rgb(1 1 1 / 100%"),
+    };
 
-    return { properties, pseudoElements };
+    return { properties, pseudoElements, supportedFeature };
   }
 });
 
 /**
  * Generate the CSS properties object. Every key is the property name, while
  * the values are objects that contain information about that property.
  *
  * @return {Object}
--- a/devtools/shared/css/color.js
+++ b/devtools/shared/css/color.js
@@ -23,16 +23,20 @@ const SPECIALVALUES = new Set([
 ]);
 
 /**
  * This module is used to convert between various color types.
  *
  * Usage:
  *   let {colorUtils} = require("devtools/shared/css/color");
  *   let color = new colorUtils.CssColor("red");
+ *   // In order to support css-color-4 color function, pass true to the
+ *   // second argument.
+ *   // e.g.
+ *   //   let color = new colorUtils.CssColor("red", true);
  *
  *   color.authored === "red"
  *   color.hasAlpha === false
  *   color.valid === true
  *   color.transparent === false // transparent has a special status.
  *   color.name === "red"        // returns hex when no name available.
  *   color.hex === "#f00"        // returns shortHex when available else returns
  *                                  longHex. If alpha channel is present then we
@@ -53,18 +57,19 @@ const SPECIALVALUES = new Set([
  *   color.toString() === "#f00"; // Outputs the color type determined in the
  *                                   COLOR_UNIT_PREF constant (above).
  *   // Color objects can be reused
  *   color.newColor("green") === "#0f0"; // true
  *
  *   Valid values for COLOR_UNIT_PREF are contained in CssColor.COLORUNIT.
  */
 
-function CssColor(colorValue) {
+function CssColor(colorValue, supportsCssColor4ColorFunction = false) {
   this.newColor(colorValue);
+  this.cssColor4 = supportsCssColor4ColorFunction;
 }
 
 module.exports.colorUtils = {
   CssColor: CssColor,
   rgbToHsl: rgbToHsl,
   setAlpha: setAlpha,
   classifyColor: classifyColor,
   rgbToColorName: rgbToColorName,
@@ -87,16 +92,19 @@ CssColor.prototype = {
   _colorUnit: null,
   _colorUnitUppercase: false,
 
   // The value as-authored.
   authored: null,
   // A lower-cased copy of |authored|.
   lowerCased: null,
 
+  // Whether the value should be parsed using css-color-4 rules.
+  cssColor4: false,
+
   _setColorUnitUppercase: function (color) {
     // Specifically exclude the case where the color is
     // case-insensitive.  This makes it so that "#000" isn't
     // considered "upper case" for the purposes of color cycling.
     this._colorUnitUppercase = (color === color.toUpperCase()) &&
       (color !== color.toLowerCase());
   },
 
@@ -131,17 +139,17 @@ CssColor.prototype = {
   get hasAlpha() {
     if (!this.valid) {
       return false;
     }
     return this._getRGBATuple().a !== 1;
   },
 
   get valid() {
-    return isValidCSSColor(this.authored);
+    return isValidCSSColor(this.authored, this.cssColor4);
   },
 
   /**
    * Return true for all transparent values e.g. rgba(0, 0, 0, 0).
    */
   get transparent() {
     try {
       let tuple = this._getRGBATuple();
@@ -388,17 +396,17 @@ CssColor.prototype = {
     return color;
   },
 
   /**
    * Returns a RGBA 4-Tuple representation of a color or transparent as
    * appropriate.
    */
   _getRGBATuple: function () {
-    let tuple = colorToRGBA(this.authored);
+    let tuple = colorToRGBA(this.authored, this.cssColor4);
 
     tuple.a = parseFloat(tuple.a.toFixed(1));
 
     return tuple;
   },
 
   _hsl: function (maybeAlpha) {
     if (this.lowerCased.startsWith("hsl(") && maybeAlpha === undefined) {
@@ -476,21 +484,23 @@ function roundTo(number, digits) {
  * Takes a color value of any type (hex, hsl, hsla, rgb, rgba)
  * and an alpha value to generate an rgba string with the correct
  * alpha value.
  *
  * @param  {String} colorValue
  *         Color in the form of hex, hsl, hsla, rgb, rgba.
  * @param  {Number} alpha
  *         Alpha value for the color, between 0 and 1.
+ * @param  {Boolean} useCssColor4ColorFunction
+ *         use css-color-4 color function or not.
  * @return {String}
  *         Converted color with `alpha` value in rgba form.
  */
-function setAlpha(colorValue, alpha) {
-  let color = new CssColor(colorValue);
+function setAlpha(colorValue, alpha, useCssColor4ColorFunction = false) {
+  let color = new CssColor(colorValue, useCssColor4ColorFunction);
 
   // Throw if the color supplied is not valid.
   if (!color.valid) {
     throw new Error("Invalid color.");
   }
 
   // If an invalid alpha valid, just set to 1.
   if (!(alpha >= 0 && alpha <= 1)) {
@@ -1044,22 +1054,21 @@ function parseOldStyleRgb(lexer, hasAlph
   return rgba;
 }
 
 /**
  * Convert a string representing a color to an object holding the
  * color's components.  Any valid CSS color form can be passed in.
  *
  * @param {String} name the color
- * @param {Boolean} oldColorFunctionSyntax use old color function syntax or the
- *        css-color-4 syntax
+ * @param {Boolean} useCssColor4ColorFunction use css-color-4 color function or not.
  * @return {Object} an object of the form {r, g, b, a}; or null if the
  *         name was not a valid color
  */
-function colorToRGBA(name, oldColorFunctionSyntax = true) {
+function colorToRGBA(name, useCssColor4ColorFunction = false) {
   name = name.trim().toLowerCase();
 
   if (name in cssColors) {
     let result = cssColors[name];
     return {r: result[0], g: result[1], b: result[2], a: result[3]};
   } else if (name === "transparent") {
     return {r: 0, g: 0, b: 0, a: 0};
   } else if (name === "currentcolor") {
@@ -1084,17 +1093,17 @@ function colorToRGBA(name, oldColorFunct
   if (!func || func.tokenType !== "function" ||
       !expectedFunctions.includes(func.text)) {
     return null;
   }
 
   let hsl = func.text === "hsl" || func.text === "hsla";
 
   let vals;
-  if (oldColorFunctionSyntax) {
+  if (!useCssColor4ColorFunction) {
     let hasAlpha = (func.text === "rgba" || func.text === "hsla");
     vals = hsl ? parseOldStyleHsl(lexer, hasAlpha) : parseOldStyleRgb(lexer, hasAlpha);
   } else {
     vals = hsl ? parseHsl(lexer) : parseRgb(lexer);
   }
 
   if (!vals) {
     return null;
@@ -1105,13 +1114,14 @@ function colorToRGBA(name, oldColorFunct
 
   return {r: vals[0], g: vals[1], b: vals[2], a: vals[3]};
 }
 
 /**
  * Check whether a string names a valid CSS color.
  *
  * @param {String} name The string to check
+ * @param {Boolean} useCssColor4ColorFunction use css-color-4 color function or not.
  * @return {Boolean} True if the string is a CSS color name.
  */
-function isValidCSSColor(name) {
-  return colorToRGBA(name) !== null;
+function isValidCSSColor(name, useCssColor4ColorFunction = false) {
+  return colorToRGBA(name, useCssColor4ColorFunction) !== null;
 }
--- a/devtools/shared/fronts/css-properties.js
+++ b/devtools/shared/fronts/css-properties.js
@@ -42,35 +42,55 @@ var cachedCssProperties = new WeakMap();
 const CssPropertiesFront = FrontClassWithSpec(cssPropertiesSpec, {
   initialize: function (client, { cssPropertiesActor }) {
     Front.prototype.initialize.call(this, client, {actor: cssPropertiesActor});
     this.manage(this);
   }
 });
 
 /**
+ * Query the feature supporting status in the featureSet.
+ *
+ * @param {Hashmap} featureSet the feature set hashmap
+ * @param {String} feature the feature name string
+ * @return {Boolean} has the feature or not
+ */
+function hasFeature(featureSet, feature) {
+  if (feature in featureSet) {
+    return featureSet[feature];
+  }
+  return false;
+}
+
+/**
  * Ask questions to a CSS database. This class does not care how the database
  * gets loaded in, only the questions that you can ask to it.
  * Prototype functions are bound to 'this' so they can be passed around as helper
  * functions.
  *
  * @param {Object} db
  *                 A database of CSS properties
  * @param {Object} inheritedList
  *                 The key is the property name, the value is whether or not
  *                 that property is inherited.
  */
 function CssProperties(db) {
   this.properties = db.properties;
   this.pseudoElements = db.pseudoElements;
 
+  // supported feature
+  this.cssColor4ColorFunction = hasFeature(db.supportedFeature,
+                                           "css-color-4-color-function");
+
   this.isKnown = this.isKnown.bind(this);
   this.isInherited = this.isInherited.bind(this);
   this.supportsType = this.supportsType.bind(this);
   this.isValidOnClient = this.isValidOnClient.bind(this);
+  this.supportsCssColor4ColorFunction =
+    this.supportsCssColor4ColorFunction.bind(this);
 
   // A weakly held dummy HTMLDivElement to test CSS properties on the client.
   this._dummyElements = new WeakMap();
 }
 
 CssProperties.prototype = {
   /**
    * Checks to see if the property is known by the browser. This function has
@@ -176,16 +196,25 @@ CssProperties.prototype = {
     if (this.isKnown(name)) {
       if (this.properties[name] && this.properties[name].subproperties) {
         return this.properties[name].subproperties;
       }
       return [name];
     }
     return [];
   },
+
+  /**
+   * Checking for the css-color-4 color function support.
+   *
+   * @return {Boolean} Return true if the server supports css-color-4 color function.
+   */
+  supportsCssColor4ColorFunction() {
+    return this.cssColor4ColorFunction;
+  },
 };
 
 /**
  * Create a CssProperties object with a fully loaded CSS database. The
  * CssProperties interface can be queried synchronously, but the initialization
  * is potentially async and should be handled up-front when the tool is created.
  *
  * The front is returned only with this function so that it can be destroyed
@@ -291,16 +320,21 @@ function normalizeCssData(db) {
         db.properties[name].subproperties =
           CSS_PROPERTIES_DB.properties[name].subproperties;
       }
     }
   }
 
   reattachCssColorValues(db);
 
+  // If there is no supportedFeature in db, create an empty one.
+  if (!db.supportedFeature) {
+    db.supportedFeature = {};
+  }
+
   return db;
 }
 
 /**
  * Color values are omitted to save on space. Add them back here.
  * @param {Object} The CSS database.
  */
 function reattachCssColorValues(db) {
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -10947,17 +10947,18 @@ nsDocShell::DoURILoad(nsIURI* aURI,
         }
       }
       return rv;
     }
 
     if (aBaseURI) {
         nsCOMPtr<nsIViewSourceChannel> vsc = do_QueryInterface(channel);
         if (vsc) {
-            vsc->SetBaseURI(aBaseURI);
+            rv = vsc->SetBaseURI(aBaseURI);
+            MOZ_ASSERT(NS_SUCCEEDED(rv));
         }
     }
   } else {
     nsAutoCString scheme;
     rv = aURI->GetScheme(scheme);
     NS_ENSURE_SUCCESS(rv, rv);
     bool isViewSource;
     aURI->SchemeIs("view-source", &isViewSource);
--- a/dom/indexedDB/ActorsParent.cpp
+++ b/dom/indexedDB/ActorsParent.cpp
@@ -18960,17 +18960,17 @@ DatabaseMaintenance::DetermineMaintenanc
   // track the values needed for the heuristics below.
   if (schemaVersion < MakeSchemaVersion(18, 0)) {
     *aMaintenanceAction = MaintenanceAction::Nothing;
     return NS_OK;
   }
 
   bool lowDiskSpace = IndexedDatabaseManager::InLowDiskSpaceMode();
 
-  if (QuotaManager::kRunningXPCShellTests) {
+  if (QuotaManager::IsRunningXPCShellTests()) {
     // If we're running XPCShell then we want to test both the low disk space
     // and normal disk space code paths so pick semi-randomly based on the
     // current time.
     lowDiskSpace = ((PR_Now() / PR_USEC_PER_MSEC) % 2) == 0;
   }
 
   // If we're low on disk space then the best we can hope for is that an
   // incremental vacuum might free some space. That is a journaled operation so
--- a/dom/media/platforms/android/MediaCodecDataDecoder.cpp
+++ b/dom/media/platforms/android/MediaCodecDataDecoder.cpp
@@ -124,17 +124,16 @@ public:
   }
 
   bool SupportDecoderRecycling() const override { return mIsCodecSupportAdaptivePlayback; }
 
 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,
--- a/dom/plugins/base/nsNPAPIPluginInstance.cpp
+++ b/dom/plugins/base/nsNPAPIPluginInstance.cpp
@@ -1792,21 +1792,23 @@ nsNPAPIPluginInstance::GetOrCreateAudioC
 NS_IMETHODIMP
 nsNPAPIPluginInstance::WindowVolumeChanged(float aVolume, bool aMuted)
 {
   // We just support mute/unmute
   nsresult rv = SetMuted(aMuted);
   NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "SetMuted failed");
   if (mMuted != aMuted) {
     mMuted = aMuted;
-    AudioChannelService::AudibleState audible = aMuted ?
-      AudioChannelService::AudibleState::eNotAudible :
-      AudioChannelService::AudibleState::eAudible;
-    mAudioChannelAgent->NotifyStartedAudible(audible,
-                                             AudioChannelService::AudibleChangedReasons::eVolumeChanged);
+    if (mAudioChannelAgent) {
+      AudioChannelService::AudibleState audible = aMuted ?
+        AudioChannelService::AudibleState::eNotAudible :
+        AudioChannelService::AudibleState::eAudible;
+      mAudioChannelAgent->NotifyStartedAudible(audible,
+                                               AudioChannelService::AudibleChangedReasons::eVolumeChanged);
+    }
   }
   return rv;
 }
 
 NS_IMETHODIMP
 nsNPAPIPluginInstance::WindowSuspendChanged(nsSuspendedTypes aSuspend)
 {
   // It doesn't support suspended, so we just do something like mute/unmute.
--- a/dom/quota/ActorsParent.cpp
+++ b/dom/quota/ActorsParent.cpp
@@ -101,18 +101,16 @@
 #define GB * 1024ULL MB
 
 namespace mozilla {
 namespace dom {
 namespace quota {
 
 using namespace mozilla::ipc;
 
-const bool QuotaManager::kRunningXPCShellTests = !!PR_GetEnv("XPCSHELL_TEST_PROFILE_DIR");
-
 // We want profiles to be platform-independent so we always need to replace
 // the same characters on every platform. Windows has the most extensive set
 // of illegal characters so we use its FILE_ILLEGAL_CHARACTERS and
 // FILE_PATH_SEPARATOR.
 const char QuotaManager::kReplaceChars[] = CONTROL_CHARACTERS "/:*?\"<>|\\";
 
 namespace {
 
--- a/dom/quota/QuotaManager.h
+++ b/dom/quota/QuotaManager.h
@@ -14,16 +14,18 @@
 #include "mozilla/Mutex.h"
 
 #include "nsClassHashtable.h"
 #include "nsRefPtrHashtable.h"
 
 #include "Client.h"
 #include "PersistenceType.h"
 
+#include "prenv.h"
+
 #define QUOTA_MANAGER_CONTRACTID "@mozilla.org/dom/quota/manager;1"
 
 class mozIStorageConnection;
 class nsIEventTarget;
 class nsIPrincipal;
 class nsIThread;
 class nsITimer;
 class nsIURI;
@@ -108,17 +110,21 @@ public:
 
 private:
   class ShutdownRunnable;
   class ShutdownObserver;
 
 public:
   NS_INLINE_DECL_REFCOUNTING(QuotaManager)
 
-  static const bool kRunningXPCShellTests;
+  static bool IsRunningXPCShellTests()
+  {
+    static bool kRunningXPCShellTests = !!PR_GetEnv("XPCSHELL_TEST_PROFILE_DIR");
+    return kRunningXPCShellTests;
+  }
 
   static const char kReplaceChars[];
 
   static void
   GetOrCreate(nsIRunnable* aCallback);
 
   // Returns a non-owning reference.
   static QuotaManager*
--- a/dom/quota/QuotaManagerService.cpp
+++ b/dom/quota/QuotaManagerService.cpp
@@ -433,38 +433,38 @@ QuotaManagerService::PerformIdleMaintena
 
   // If we're running on battery power then skip all idle maintenance since we
   // would otherwise be doing lots of disk I/O.
   BatteryInformation batteryInfo;
 
 #ifdef MOZ_WIDGET_ANDROID
   // Android XPCShell doesn't load the AndroidBridge that is needed to make
   // GetCurrentBatteryInformation work...
-  if (!QuotaManager::kRunningXPCShellTests)
+  if (!QuotaManager::IsRunningXPCShellTests())
 #endif
   {
     // In order to give the correct battery level, hal must have registered
     // battery observers.
     RegisterBatteryObserver(this);
     GetCurrentBatteryInformation(&batteryInfo);
     UnregisterBatteryObserver(this);
   }
 
   // If we're running XPCShell because we always want to be able to test this
   // code so pretend that we're always charging.
-  if (QuotaManager::kRunningXPCShellTests) {
+  if (QuotaManager::IsRunningXPCShellTests()) {
     batteryInfo.level() = 100;
     batteryInfo.charging() = true;
   }
 
   if (NS_WARN_IF(!batteryInfo.charging())) {
     return;
   }
 
-  if (QuotaManager::kRunningXPCShellTests) {
+  if (QuotaManager::IsRunningXPCShellTests()) {
     // We don't want user activity to impact this code if we're running tests.
     Unused << Observe(nullptr, OBSERVER_TOPIC_IDLE, nullptr);
   } else if (!mIdleObserverRegistered) {
     nsCOMPtr<nsIIdleService> idleService =
       do_GetService(kIdleServiceContractId);
     MOZ_ASSERT(idleService);
 
     MOZ_ALWAYS_SUCCEEDS(
--- a/editor/libeditor/EditorBase.cpp
+++ b/editor/libeditor/EditorBase.cpp
@@ -1196,22 +1196,33 @@ EditorBase::CanPasteTransferable(nsITran
   return NS_ERROR_NOT_IMPLEMENTED;
 }
 
 NS_IMETHODIMP
 EditorBase::SetAttribute(nsIDOMElement* aElement,
                          const nsAString& aAttribute,
                          const nsAString& aValue)
 {
+  if (NS_WARN_IF(aAttribute.IsEmpty())) {
+    return NS_ERROR_FAILURE;
+  }
   nsCOMPtr<Element> element = do_QueryInterface(aElement);
   NS_ENSURE_TRUE(element, NS_ERROR_NULL_POINTER);
   nsCOMPtr<nsIAtom> attribute = NS_Atomize(aAttribute);
 
+  return SetAttribute(element, attribute, aValue);
+}
+
+nsresult
+EditorBase::SetAttribute(Element* aElement,
+                         nsIAtom* aAttribute,
+                         const nsAString& aValue)
+{
   RefPtr<ChangeAttributeTransaction> transaction =
-    CreateTxnForSetAttribute(*element, *attribute, aValue);
+    CreateTxnForSetAttribute(*aElement, *aAttribute, aValue);
   return DoTransaction(transaction);
 }
 
 NS_IMETHODIMP
 EditorBase::GetAttributeValue(nsIDOMElement* aElement,
                               const nsAString& aAttribute,
                               nsAString& aResultValue,
                               bool* aResultIsSet)
@@ -1230,22 +1241,32 @@ EditorBase::GetAttributeValue(nsIDOMElem
   }
   return rv;
 }
 
 NS_IMETHODIMP
 EditorBase::RemoveAttribute(nsIDOMElement* aElement,
                             const nsAString& aAttribute)
 {
+  if (NS_WARN_IF(aAttribute.IsEmpty())) {
+    return NS_ERROR_FAILURE;
+  }
   nsCOMPtr<Element> element = do_QueryInterface(aElement);
   NS_ENSURE_TRUE(element, NS_ERROR_NULL_POINTER);
   nsCOMPtr<nsIAtom> attribute = NS_Atomize(aAttribute);
 
+  return RemoveAttribute(element, attribute);
+}
+
+nsresult
+EditorBase::RemoveAttribute(Element* aElement,
+                            nsIAtom* aAttribute)
+{
   RefPtr<ChangeAttributeTransaction> transaction =
-    CreateTxnForRemoveAttribute(*element, *attribute);
+    CreateTxnForRemoveAttribute(*aElement, *aAttribute);
   return DoTransaction(transaction);
 }
 
 bool
 EditorBase::OutputsMozDirty()
 {
   // Return true for Composer (!eEditorAllowInteraction) or mail
   // (eEditorMailMask), but false for webpages.
@@ -2175,35 +2196,38 @@ EditorBase::EndOperation()
 }
 
 NS_IMETHODIMP
 EditorBase::CloneAttribute(const nsAString& aAttribute,
                            nsIDOMNode* aDestNode,
                            nsIDOMNode* aSourceNode)
 {
   NS_ENSURE_TRUE(aDestNode && aSourceNode, NS_ERROR_NULL_POINTER);
-
-  nsCOMPtr<nsIDOMElement> destElement = do_QueryInterface(aDestNode);
-  nsCOMPtr<nsIDOMElement> sourceElement = do_QueryInterface(aSourceNode);
+  if (NS_WARN_IF(aAttribute.IsEmpty())) {
+    return NS_ERROR_FAILURE;
+  }
+
+  nsCOMPtr<Element> destElement = do_QueryInterface(aDestNode);
+  nsCOMPtr<Element> sourceElement = do_QueryInterface(aSourceNode);
   NS_ENSURE_TRUE(destElement && sourceElement, NS_ERROR_NO_INTERFACE);
 
+  nsCOMPtr<nsIAtom> attribute = NS_Atomize(aAttribute);
+  return CloneAttribute(attribute, destElement, sourceElement);
+}
+
+nsresult
+EditorBase::CloneAttribute(nsIAtom* aAttribute,
+                           Element* aDestElement,
+                           Element* aSourceElement)
+{
   nsAutoString attrValue;
-  bool isAttrSet;
-  nsresult rv = GetAttributeValue(sourceElement,
-                                  aAttribute,
-                                  attrValue,
-                                  &isAttrSet);
-  NS_ENSURE_SUCCESS(rv, rv);
-  if (isAttrSet) {
-    rv = SetAttribute(destElement, aAttribute, attrValue);
-  } else {
-    rv = RemoveAttribute(destElement, aAttribute);
-  }
-
-  return rv;
+  if (aSourceElement->GetAttr(kNameSpaceID_None, aAttribute, attrValue)) {
+    return SetAttribute(aDestElement, aAttribute, attrValue);
+  }
+  return RemoveAttribute(aDestElement, aAttribute);
 }
 
 /**
  * @param aDest     Must be a DOM element.
  * @param aSource   Must be a DOM element.
  */
 NS_IMETHODIMP
 EditorBase::CloneAttributes(nsIDOMNode* aDest,
@@ -2232,39 +2256,37 @@ EditorBase::CloneAttributes(Element* aDe
   // document
   NS_ENSURE_TRUE(GetRoot(), );
   bool destInBody = GetRoot()->Contains(aDest);
 
   // Clear existing attributes
   RefPtr<nsDOMAttributeMap> destAttributes = aDest->Attributes();
   while (RefPtr<Attr> attr = destAttributes->Item(0)) {
     if (destInBody) {
-      RemoveAttribute(static_cast<nsIDOMElement*>(GetAsDOMNode(aDest)),
-                      attr->NodeName());
+      RemoveAttribute(aDest, attr->NodeInfo()->NameAtom());
     } else {
-      ErrorResult ignored;
-      aDest->RemoveAttribute(attr->NodeName(), ignored);
+      aDest->UnsetAttr(kNameSpaceID_None, attr->NodeInfo()->NameAtom(), true);
     }
   }
 
   // Set just the attributes that the source element has
   RefPtr<nsDOMAttributeMap> sourceAttributes = aSource->Attributes();
   uint32_t sourceCount = sourceAttributes->Length();
   for (uint32_t i = 0; i < sourceCount; i++) {
     RefPtr<Attr> attr = sourceAttributes->Item(i);
     nsAutoString value;
     attr->GetValue(value);
     if (destInBody) {
-      SetAttributeOrEquivalent(static_cast<nsIDOMElement*>(GetAsDOMNode(aDest)),
-                               attr->NodeName(), value, false);
+      SetAttributeOrEquivalent(aDest, attr->NodeInfo()->NameAtom(), value,
+                               false);
     } else {
       // The element is not inserted in the document yet, we don't want to put
       // a transaction on the UndoStack
-      SetAttributeOrEquivalent(static_cast<nsIDOMElement*>(GetAsDOMNode(aDest)),
-                               attr->NodeName(), value, true);
+      SetAttributeOrEquivalent(aDest, attr->NodeInfo()->NameAtom(), value,
+                               true);
     }
   }
 }
 
 NS_IMETHODIMP
 EditorBase::ScrollSelectionIntoView(bool aScrollToAnchor)
 {
   nsCOMPtr<nsISelectionController> selCon;
@@ -4585,31 +4607,42 @@ EditorBase::CreateHTMLContent(nsIAtom* a
              "check caller.");
     return nullptr;
   }
 
   return doc->CreateElem(nsDependentAtomString(aTag), nullptr,
                          kNameSpaceID_XHTML);
 }
 
-nsresult
+NS_IMETHODIMP
 EditorBase::SetAttributeOrEquivalent(nsIDOMElement* aElement,
                                      const nsAString& aAttribute,
                                      const nsAString& aValue,
                                      bool aSuppressTransaction)
 {
-  return SetAttribute(aElement, aAttribute, aValue);
-}
-
-nsresult
+  nsCOMPtr<Element> element = do_QueryInterface(aElement);
+  if (NS_WARN_IF(!element)) {
+    return NS_ERROR_NULL_POINTER;
+  }
+  nsCOMPtr<nsIAtom> attribute = NS_Atomize(aAttribute);
+  return SetAttributeOrEquivalent(element, attribute, aValue,
+                                  aSuppressTransaction);
+}
+
+NS_IMETHODIMP
 EditorBase::RemoveAttributeOrEquivalent(nsIDOMElement* aElement,
                                         const nsAString& aAttribute,
                                         bool aSuppressTransaction)
 {
-  return RemoveAttribute(aElement, aAttribute);
+  nsCOMPtr<Element> element = do_QueryInterface(aElement);
+  if (NS_WARN_IF(!element)) {
+    return NS_ERROR_NULL_POINTER;
+  }
+  nsCOMPtr<nsIAtom> attribute = NS_Atomize(aAttribute);
+  return RemoveAttributeOrEquivalent(element, attribute, aSuppressTransaction);
 }
 
 nsresult
 EditorBase::HandleKeyPressEvent(nsIDOMKeyEvent* aKeyEvent)
 {
   // NOTE: When you change this method, you should also change:
   //   * editor/libeditor/tests/test_texteditor_keyevent_handling.html
   //   * editor/libeditor/tests/test_htmleditor_keyevent_handling.html
--- a/editor/libeditor/EditorBase.h
+++ b/editor/libeditor/EditorBase.h
@@ -229,16 +229,29 @@ public:
                                                  nsIAtom* aAttribute = nullptr,
                                                  const nsAString* aValue =
                                                  nullptr);
   nsIContent* SplitNode(nsIContent& aNode, int32_t aOffset,
                         ErrorResult& aResult);
   nsresult JoinNodes(nsINode& aLeftNode, nsINode& aRightNode);
   nsresult MoveNode(nsIContent* aNode, nsINode* aParent, int32_t aOffset);
 
+  nsresult CloneAttribute(nsIAtom* aAttribute, Element* aDestElement,
+                          Element* aSourceElement);
+  nsresult RemoveAttribute(Element* aElement, nsIAtom* aAttribute);
+  virtual nsresult RemoveAttributeOrEquivalent(Element* aElement,
+                                               nsIAtom* aAttribute,
+                                               bool aSuppressTransaction) = 0;
+  nsresult SetAttribute(Element* aElement, nsIAtom* aAttribute,
+                        const nsAString& aValue);
+  virtual nsresult SetAttributeOrEquivalent(Element* aElement,
+                                            nsIAtom* aAttribute,
+                                            const nsAString& aValue,
+                                            bool aSuppressTransaction) = 0;
+
   /**
    * Method to replace certain CreateElementNS() calls.
    *
    * @param aTag        Tag you want.
    */
   already_AddRefed<Element> CreateHTMLContent(nsIAtom* aTag);
 
   /**
--- a/editor/libeditor/HTMLEditRules.cpp
+++ b/editor/libeditor/HTMLEditRules.cpp
@@ -3273,25 +3273,25 @@ HTMLEditRules::WillMakeList(Selection* a
         if (!curNode->IsHTMLElement(itemType)) {
           NS_ENSURE_STATE(mHTMLEditor);
           newBlock = mHTMLEditor->ReplaceContainer(curNode->AsElement(),
                                                    itemType);
           NS_ENSURE_STATE(newBlock);
         }
       }
       NS_ENSURE_STATE(mHTMLEditor);
-      nsCOMPtr<nsIDOMElement> curElement = do_QueryInterface(curNode);
-      NS_NAMED_LITERAL_STRING(typestr, "type");
+      nsCOMPtr<Element> curElement = do_QueryInterface(curNode);
       if (aBulletType && !aBulletType->IsEmpty()) {
-        rv = mHTMLEditor->SetAttribute(curElement, typestr, *aBulletType);
+        rv = mHTMLEditor->SetAttribute(curElement, nsGkAtoms::type,
+                                       *aBulletType);
         if (NS_WARN_IF(NS_FAILED(rv))) {
           return rv;
         }
       } else {
-        rv = mHTMLEditor->RemoveAttribute(curElement, typestr);
+        rv = mHTMLEditor->RemoveAttribute(curElement, nsGkAtoms::type);
         if (NS_WARN_IF(NS_FAILED(rv))) {
           return rv;
         }
       }
       continue;
     }
 
     // if we hit a div clear our prevListItem, insert divs contents
@@ -4802,71 +4802,72 @@ HTMLEditRules::AlignInnerBlocks(nsINode&
  */
 nsresult
 HTMLEditRules::AlignBlockContents(nsIDOMNode* aNode,
                                   const nsAString* alignType)
 {
   nsCOMPtr<nsINode> node = do_QueryInterface(aNode);
   NS_ENSURE_TRUE(node && alignType, NS_ERROR_NULL_POINTER);
   nsCOMPtr<nsIContent> firstChild, lastChild;
-  nsCOMPtr<Element> divNode;
 
   bool useCSS = mHTMLEditor->IsCSSEnabled();
 
   NS_ENSURE_STATE(mHTMLEditor);
   firstChild = mHTMLEditor->GetFirstEditableChild(*node);
   NS_ENSURE_STATE(mHTMLEditor);
   lastChild = mHTMLEditor->GetLastEditableChild(*node);
-  NS_NAMED_LITERAL_STRING(attr, "align");
   if (!firstChild) {
     // this cell has no content, nothing to align
   } else if (firstChild == lastChild &&
              firstChild->IsHTMLElement(nsGkAtoms::div)) {
     // the cell already has a div containing all of its content: just
     // act on this div.
-    nsCOMPtr<nsIDOMElement> divElem = do_QueryInterface(firstChild);
+    RefPtr<Element> divElem = firstChild->AsElement();
     if (useCSS) {
       NS_ENSURE_STATE(mHTMLEditor);
-      nsresult rv = mHTMLEditor->SetAttributeOrEquivalent(divElem, attr,
+      nsresult rv = mHTMLEditor->SetAttributeOrEquivalent(divElem,
+                                                          nsGkAtoms::align,
                                                           *alignType, false);
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return rv;
       }
     } else {
       NS_ENSURE_STATE(mHTMLEditor);
-      nsresult rv = mHTMLEditor->SetAttribute(divElem, attr, *alignType);
+      nsresult rv = mHTMLEditor->SetAttribute(divElem, nsGkAtoms::align,
+                                              *alignType);
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return rv;
       }
     }
   } else {
     // else we need to put in a div, set the alignment, and toss in all the children
     NS_ENSURE_STATE(mHTMLEditor);
-    divNode = mHTMLEditor->CreateNode(nsGkAtoms::div, node, 0);
-    NS_ENSURE_STATE(divNode);
+    RefPtr<Element> divElem = mHTMLEditor->CreateNode(nsGkAtoms::div, node, 0);
+    NS_ENSURE_STATE(divElem);
     // set up the alignment on the div
-    nsCOMPtr<nsIDOMElement> divElem = do_QueryInterface(divNode);
     if (useCSS) {
       NS_ENSURE_STATE(mHTMLEditor);
       nsresult rv =
-        mHTMLEditor->SetAttributeOrEquivalent(divElem, attr, *alignType, false);
+        mHTMLEditor->SetAttributeOrEquivalent(divElem, nsGkAtoms::align,
+                                              *alignType, false);
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return rv;
       }
     } else {
       NS_ENSURE_STATE(mHTMLEditor);
-      nsresult rv = mHTMLEditor->SetAttribute(divElem, attr, *alignType);
+      nsresult rv =
+        mHTMLEditor->SetAttribute(divElem, nsGkAtoms::align, *alignType);
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return rv;
       }
     }
     // tuck the children into the end of the active div
-    while (lastChild && (lastChild != divNode)) {
+    while (lastChild && (lastChild != divElem)) {
       NS_ENSURE_STATE(mHTMLEditor);
-      nsresult rv = mHTMLEditor->MoveNode(lastChild, divNode, 0);
+      nsresult rv = mHTMLEditor->MoveNode(lastChild, divElem, 0);
       NS_ENSURE_SUCCESS(rv, rv);
       NS_ENSURE_STATE(mHTMLEditor);
       lastChild = mHTMLEditor->GetLastEditableChild(*node);
     }
   }
   return NS_OK;
 }
 
@@ -6455,19 +6456,19 @@ HTMLEditRules::SplitParagraph(nsIDOMNode
   NS_ENSURE_STATE(mHTMLEditor);
   if (mHTMLEditor->IsVisBreak(aBRNode)) {
     NS_ENSURE_STATE(mHTMLEditor);
     rv = mHTMLEditor->DeleteNode(aBRNode);
     NS_ENSURE_SUCCESS(rv, rv);
   }
 
   // remove ID attribute on the paragraph we just created
-  nsCOMPtr<nsIDOMElement> rightElt = do_QueryInterface(rightPara);
+  RefPtr<Element> rightElt = rightPara->AsElement();
   NS_ENSURE_STATE(mHTMLEditor);
-  rv = mHTMLEditor->RemoveAttribute(rightElt, NS_LITERAL_STRING("id"));
+  rv = mHTMLEditor->RemoveAttribute(rightElt, nsGkAtoms::id);
   NS_ENSURE_SUCCESS(rv, rv);
 
   // check both halves of para to see if we need mozBR
   rv = InsertMozBRIfNeeded(*leftPara);
   NS_ENSURE_SUCCESS(rv, rv);
   rv = InsertMozBRIfNeeded(*rightPara);
   NS_ENSURE_SUCCESS(rv, rv);
 
@@ -8316,28 +8317,28 @@ HTMLEditRules::RemoveAlignment(nsIDOMNod
       // now remove the CENTER container
       NS_ENSURE_STATE(mHTMLEditor);
       nsCOMPtr<Element> childAsElement = do_QueryInterface(child);
       NS_ENSURE_STATE(childAsElement);
       rv = mHTMLEditor->RemoveContainer(childAsElement);
       NS_ENSURE_SUCCESS(rv, rv);
     } else if (isBlock || HTMLEditUtils::IsHR(child)) {
       // the current node is a block element
-      nsCOMPtr<nsIDOMElement> curElem = do_QueryInterface(child);
+      nsCOMPtr<Element> curElem = do_QueryInterface(child);
       if (HTMLEditUtils::SupportsAlignAttr(child)) {
         // remove the ALIGN attribute if this element can have it
         NS_ENSURE_STATE(mHTMLEditor);
-        rv = mHTMLEditor->RemoveAttribute(curElem, NS_LITERAL_STRING("align"));
+        rv = mHTMLEditor->RemoveAttribute(curElem, nsGkAtoms::align);
         NS_ENSURE_SUCCESS(rv, rv);
       }
       if (useCSS) {
         if (HTMLEditUtils::IsTable(child) || HTMLEditUtils::IsHR(child)) {
           NS_ENSURE_STATE(mHTMLEditor);
           rv = mHTMLEditor->SetAttributeOrEquivalent(curElem,
-                                                     NS_LITERAL_STRING("align"),
+                                                     nsGkAtoms::align,
                                                      aAlignType, false);
           if (NS_WARN_IF(NS_FAILED(rv))) {
             return rv;
           }
         } else {
           nsAutoString dummyCssValue;
           NS_ENSURE_STATE(mHTMLEditor);
           rv = mHTMLEditor->mCSSEditUtils->RemoveCSSInlineStyle(
@@ -8447,31 +8448,27 @@ HTMLEditRules::AlignBlock(Element& aElem
   }
 
   NS_ENSURE_STATE(mHTMLEditor);
   RefPtr<HTMLEditor> htmlEditor(mHTMLEditor);
 
   nsresult rv = RemoveAlignment(aElement.AsDOMNode(), aAlignType,
                                 aContentsOnly == ContentsOnly::yes);
   NS_ENSURE_SUCCESS(rv, rv);
-  NS_NAMED_LITERAL_STRING(attr, "align");
   if (htmlEditor->IsCSSEnabled()) {
     // Let's use CSS alignment; we use margin-left and margin-right for tables
     // and text-align for other block-level elements
     rv = htmlEditor->SetAttributeOrEquivalent(
-                       static_cast<nsIDOMElement*>(aElement.AsDOMNode()),
-                       attr, aAlignType, false);
+                       &aElement, nsGkAtoms::align, aAlignType, false);
     NS_ENSURE_SUCCESS(rv, rv);
   } else {
     // HTML case; this code is supposed to be called ONLY if the element
     // supports the align attribute but we'll never know...
     if (HTMLEditUtils::SupportsAlignAttr(aElement.AsDOMNode())) {
-      rv = htmlEditor->SetAttribute(
-                         static_cast<nsIDOMElement*>(aElement.AsDOMNode()),
-                         attr, aAlignType);
+      rv = htmlEditor->SetAttribute(&aElement, nsGkAtoms::align, aAlignType);
       NS_ENSURE_SUCCESS(rv, rv);
     }
   }
   return NS_OK;
 }
 
 nsresult
 HTMLEditRules::ChangeIndentation(Element& aElement,
--- a/editor/libeditor/HTMLEditor.cpp
+++ b/editor/libeditor/HTMLEditor.cpp
@@ -2591,17 +2591,17 @@ HTMLEditor::CreateElementWithDefaults(co
   } else {
     realTagName = tagName;
   }
   // We don't use editor's CreateElement because we don't want to go through
   // the transaction system
 
   // New call to use instead to get proper HTML element, bug 39919
   nsCOMPtr<nsIAtom> realTagAtom = NS_Atomize(realTagName);
-  nsCOMPtr<Element> newElement = CreateHTMLContent(realTagAtom);
+  RefPtr<Element> newElement = CreateHTMLContent(realTagAtom);
   if (!newElement) {
     return nullptr;
   }
 
   // Mark the new element dirty, so it will be formatted
   ErrorResult rv;
   newElement->SetAttribute(NS_LITERAL_STRING("_moz_dirty"), EmptyString(), rv);
 
@@ -2623,18 +2623,17 @@ HTMLEditor::CreateElementWithDefaults(co
                              NS_LITERAL_STRING("1"), rv);
     if (NS_WARN_IF(rv.Failed())) {
       rv.SuppressException();
       return nullptr;
     }
   } else if (tagName.EqualsLiteral("td")) {
     nsresult rv =
       SetAttributeOrEquivalent(
-        static_cast<nsIDOMElement*>(newElement->AsDOMNode()),
-        NS_LITERAL_STRING("valign"), NS_LITERAL_STRING("top"), true);
+        newElement, nsGkAtoms::valign, NS_LITERAL_STRING("top"), true);
     NS_ENSURE_SUCCESS(rv, nullptr);
   }
   // ADD OTHER TAGS HERE
 
   return newElement.forget();
 }
 
 NS_IMETHODIMP
@@ -4442,103 +4441,93 @@ HTMLEditor::IsEmptyNodeImpl(nsINode* aNo
   }
 
   return NS_OK;
 }
 
 // add to aElement the CSS inline styles corresponding to the HTML attribute
 // aAttribute with its value aValue
 nsresult
-HTMLEditor::SetAttributeOrEquivalent(nsIDOMElement* aElement,
-                                     const nsAString& aAttribute,
+HTMLEditor::SetAttributeOrEquivalent(Element* aElement,
+                                     nsIAtom* aAttribute,
                                      const nsAString& aValue,
                                      bool aSuppressTransaction)
 {
+  MOZ_ASSERT(aElement);
+  MOZ_ASSERT(aAttribute);
+
   nsAutoScriptBlocker scriptBlocker;
 
-  if (IsCSSEnabled() && mCSSEditUtils) {
-    nsCOMPtr<dom::Element> element = do_QueryInterface(aElement);
-    MOZ_ASSERT(element);
-
-    nsCOMPtr<nsIAtom> attribute = NS_Atomize(aAttribute);
-    MOZ_ASSERT(attribute);
-
-    int32_t count =
-      mCSSEditUtils->SetCSSEquivalentToHTMLStyle(element, nullptr,
-                                                 attribute, &aValue,
-                                                 aSuppressTransaction);
-    if (count) {
-      // we found an equivalence ; let's remove the HTML attribute itself if it is set
-      nsAutoString existingValue;
-      bool wasSet = false;
-      nsresult rv =
-        GetAttributeValue(aElement, aAttribute, existingValue, &wasSet);
-      NS_ENSURE_SUCCESS(rv, rv);
-      if (!wasSet) {
-        return NS_OK;
-      }
-      return aSuppressTransaction ?
-               element->UnsetAttr(kNameSpaceID_None, attribute, true) :
-               RemoveAttribute(aElement, aAttribute);
+  if (!IsCSSEnabled() || !mCSSEditUtils) {
+    // we are not in an HTML+CSS editor; let's set the attribute the HTML way
+    return aSuppressTransaction ?
+             aElement->SetAttr(kNameSpaceID_None, aAttribute, aValue, true) :
+             SetAttribute(aElement, aAttribute, aValue);
+  }
+
+  int32_t count =
+    mCSSEditUtils->SetCSSEquivalentToHTMLStyle(aElement, nullptr,
+                                               aAttribute, &aValue,
+                                               aSuppressTransaction);
+  if (count) {
+    // we found an equivalence ; let's remove the HTML attribute itself if it
+    // is set
+    nsAutoString existingValue;
+    if (!aElement->GetAttr(kNameSpaceID_None, aAttribute, existingValue)) {
+      return NS_OK;
     }
 
-    // count is an integer that represents the number of CSS declarations applied to the
-    // element. If it is zero, we found no equivalence in this implementation for the
-    // attribute
-    if (attribute == nsGkAtoms::style) {
-      // if it is the style attribute, just add the new value to the existing style
-      // attribute's value
-      nsAutoString existingValue;
-      bool wasSet = false;
-      nsresult rv = GetAttributeValue(aElement, NS_LITERAL_STRING("style"),
-                                      existingValue, &wasSet);
-      NS_ENSURE_SUCCESS(rv, rv);
-      existingValue.Append(' ');
-      existingValue.Append(aValue);
-      return aSuppressTransaction ?
-        element->SetAttr(kNameSpaceID_None, attribute, existingValue, true) :
-        SetAttribute(aElement, aAttribute, existingValue);
-    }
-
-    // we have no CSS equivalence for this attribute and it is not the style
-    // attribute; let's set it the good'n'old HTML way
     return aSuppressTransaction ?
-             element->SetAttr(kNameSpaceID_None, attribute, aValue, true) :
-             SetAttribute(aElement, aAttribute, aValue);
-  }
-
-  // we are not in an HTML+CSS editor; let's set the attribute the HTML way
-  return aSuppressTransaction ? aElement->SetAttribute(aAttribute, aValue) :
-                                SetAttribute(aElement, aAttribute, aValue);
+             aElement->UnsetAttr(kNameSpaceID_None, aAttribute, true) :
+             RemoveAttribute(aElement, aAttribute);
+  }
+
+  // count is an integer that represents the number of CSS declarations applied
+  // to the element. If it is zero, we found no equivalence in this
+  // implementation for the attribute
+  if (aAttribute == nsGkAtoms::style) {
+    // if it is the style attribute, just add the new value to the existing
+    // style attribute's value
+    nsAutoString existingValue;
+    aElement->GetAttr(kNameSpaceID_None, nsGkAtoms::style, existingValue);
+    existingValue.Append(' ');
+    existingValue.Append(aValue);
+    return aSuppressTransaction ?
+       aElement->SetAttr(kNameSpaceID_None, aAttribute, existingValue, true) :
+      SetAttribute(aElement, aAttribute, existingValue);
+  }
+
+  // we have no CSS equivalence for this attribute and it is not the style
+  // attribute; let's set it the good'n'old HTML way
+  return aSuppressTransaction ?
+           aElement->SetAttr(kNameSpaceID_None, aAttribute, aValue, true) :
+           SetAttribute(aElement, aAttribute, aValue);
 }
 
 nsresult
-HTMLEditor::RemoveAttributeOrEquivalent(nsIDOMElement* aElement,
-                                        const nsAString& aAttribute,
+HTMLEditor::RemoveAttributeOrEquivalent(Element* aElement,
+                                        nsIAtom* aAttribute,
                                         bool aSuppressTransaction)
 {
-  nsCOMPtr<dom::Element> element = do_QueryInterface(aElement);
-  NS_ENSURE_TRUE(element, NS_OK);
-
-  nsCOMPtr<nsIAtom> attribute = NS_Atomize(aAttribute);
-  MOZ_ASSERT(attribute);
+  MOZ_ASSERT(aElement);
+  MOZ_ASSERT(aAttribute);
 
   if (IsCSSEnabled() && mCSSEditUtils) {
     nsresult rv =
       mCSSEditUtils->RemoveCSSEquivalentToHTMLStyle(
-        element, nullptr, attribute, nullptr, aSuppressTransaction);
+        aElement, nullptr, aAttribute, nullptr, aSuppressTransaction);
     NS_ENSURE_SUCCESS(rv, rv);
   }
 
-  if (!element->HasAttr(kNameSpaceID_None, attribute)) {
+  if (!aElement->HasAttr(kNameSpaceID_None, aAttribute)) {
     return NS_OK;
   }
 
   return aSuppressTransaction ?
-    element->UnsetAttr(kNameSpaceID_None, attribute, /* aNotify = */ true) :
+    aElement->UnsetAttr(kNameSpaceID_None, aAttribute, /* aNotify = */ true) :
     RemoveAttribute(aElement, aAttribute);
 }
 
 nsresult
 HTMLEditor::SetIsCSSEnabled(bool aIsCSSPrefChecked)
 {
   if (!mCSSEditUtils) {
     return NS_ERROR_NOT_INITIALIZED;
--- a/editor/libeditor/HTMLEditor.h
+++ b/editor/libeditor/HTMLEditor.h
@@ -116,16 +116,26 @@ public:
   virtual already_AddRefed<dom::EventTarget> GetDOMEventTarget() override;
   virtual Element* GetEditorRoot() override;
   virtual already_AddRefed<nsIContent> FindSelectionRoot(
                                          nsINode *aNode) override;
   virtual bool IsAcceptableInputEvent(nsIDOMEvent* aEvent) override;
   virtual already_AddRefed<nsIContent> GetInputEventTargetContent() override;
   virtual bool IsEditable(nsINode* aNode) override;
   using EditorBase::IsEditable;
+  virtual nsresult RemoveAttributeOrEquivalent(
+                     Element* aElement,
+                     nsIAtom* aAttribute,
+                     bool aSuppressTransaction) override;
+  virtual nsresult SetAttributeOrEquivalent(Element* aElement,
+                                            nsIAtom* aAttribute,
+                                            const nsAString& aValue,
+                                            bool aSuppressTransaction) override;
+  using EditorBase::RemoveAttributeOrEquivalent;
+  using EditorBase::SetAttributeOrEquivalent;
 
   // nsStubMutationObserver overrides
   NS_DECL_NSIMUTATIONOBSERVER_CONTENTAPPENDED
   NS_DECL_NSIMUTATIONOBSERVER_CONTENTINSERTED
   NS_DECL_NSIMUTATIONOBSERVER_CONTENTREMOVED
 
   // nsIHTMLEditor methods
   NS_DECL_NSIHTMLEDITOR
@@ -324,24 +334,16 @@ public:
   virtual bool IsContainer(nsINode* aNode) override;
   virtual bool IsContainer(nsIDOMNode* aNode) override;
 
   /**
    * Make the given selection span the entire document.
    */
   virtual nsresult SelectEntireDocument(Selection* aSelection) override;
 
-  NS_IMETHOD SetAttributeOrEquivalent(nsIDOMElement* aElement,
-                                      const nsAString& aAttribute,
-                                      const nsAString& aValue,
-                                      bool aSuppressTransaction) override;
-  NS_IMETHOD RemoveAttributeOrEquivalent(nsIDOMElement* aElement,
-                                         const nsAString& aAttribute,
-                                         bool aSuppressTransaction) override;
-
   /**
    * Join together any adjacent editable text nodes in the range.
    */
   nsresult CollapseAdjacentTextNodes(nsRange* aRange);
 
   virtual bool AreNodesSameType(nsIContent* aNode1,
                                 nsIContent* aNode2) override;
 
--- a/editor/libeditor/HTMLEditorObjectResizer.cpp
+++ b/editor/libeditor/HTMLEditorObjectResizer.cpp
@@ -905,78 +905,73 @@ HTMLEditor::SetFinalSize(int32_t aX,
 
   int32_t x, y;
   x = left - ((mResizedObjectIsAbsolutelyPositioned) ? mResizedObjectBorderLeft+mResizedObjectMarginLeft : 0);
   y = top - ((mResizedObjectIsAbsolutelyPositioned) ? mResizedObjectBorderTop+mResizedObjectMarginTop : 0);
 
   // we want one transaction only from a user's point of view
   AutoEditBatch batchIt(this);
 
-  NS_NAMED_LITERAL_STRING(widthStr,  "width");
-  NS_NAMED_LITERAL_STRING(heightStr, "height");
-
-  nsCOMPtr<Element> resizedObject = do_QueryInterface(mResizedObject);
-  NS_ENSURE_TRUE(resizedObject, );
   if (mResizedObjectIsAbsolutelyPositioned) {
     if (setHeight) {
-      mCSSEditUtils->SetCSSPropertyPixels(*resizedObject, *nsGkAtoms::top, y);
+      mCSSEditUtils->SetCSSPropertyPixels(*mResizedObject, *nsGkAtoms::top, y);
     }
     if (setWidth) {
-      mCSSEditUtils->SetCSSPropertyPixels(*resizedObject, *nsGkAtoms::left, x);
+      mCSSEditUtils->SetCSSPropertyPixels(*mResizedObject, *nsGkAtoms::left, x);
     }
   }
   if (IsCSSEnabled() || mResizedObjectIsAbsolutelyPositioned) {
     if (setWidth && mResizedObject->HasAttr(kNameSpaceID_None, nsGkAtoms::width)) {
-      RemoveAttribute(static_cast<nsIDOMElement*>(GetAsDOMNode(mResizedObject)), widthStr);
+      RemoveAttribute(mResizedObject, nsGkAtoms::width);
     }
 
     if (setHeight && mResizedObject->HasAttr(kNameSpaceID_None,
                                              nsGkAtoms::height)) {
-      RemoveAttribute(static_cast<nsIDOMElement*>(GetAsDOMNode(mResizedObject)), heightStr);
+      RemoveAttribute(mResizedObject, nsGkAtoms::height);
     }
 
     if (setWidth) {
-      mCSSEditUtils->SetCSSPropertyPixels(*resizedObject, *nsGkAtoms::width,
+      mCSSEditUtils->SetCSSPropertyPixels(*mResizedObject, *nsGkAtoms::width,
                                           width);
     }
     if (setHeight) {
-      mCSSEditUtils->SetCSSPropertyPixels(*resizedObject, *nsGkAtoms::height,
+      mCSSEditUtils->SetCSSPropertyPixels(*mResizedObject, *nsGkAtoms::height,
                                           height);
     }
   } else {
     // we use HTML size and remove all equivalent CSS properties
 
     // we set the CSS width and height to remove it later,
     // triggering an immediate reflow; otherwise, we have problems
     // with asynchronous reflow
     if (setWidth) {
-      mCSSEditUtils->SetCSSPropertyPixels(*resizedObject, *nsGkAtoms::width,
+      mCSSEditUtils->SetCSSPropertyPixels(*mResizedObject, *nsGkAtoms::width,
                                           width);
     }
     if (setHeight) {
-      mCSSEditUtils->SetCSSPropertyPixels(*resizedObject, *nsGkAtoms::height,
+      mCSSEditUtils->SetCSSPropertyPixels(*mResizedObject, *nsGkAtoms::height,
                                           height);
     }
     if (setWidth) {
       nsAutoString w;
       w.AppendInt(width);
-      SetAttribute(static_cast<nsIDOMElement*>(GetAsDOMNode(mResizedObject)), widthStr, w);
+      SetAttribute(mResizedObject, nsGkAtoms::width, w);
     }
     if (setHeight) {
       nsAutoString h;
       h.AppendInt(height);
-      SetAttribute(static_cast<nsIDOMElement*>(GetAsDOMNode(mResizedObject)), heightStr, h);
+      SetAttribute(mResizedObject, nsGkAtoms::height, h);
     }
 
     if (setWidth) {
-      mCSSEditUtils->RemoveCSSProperty(*resizedObject, *nsGkAtoms::width,
+      mCSSEditUtils->RemoveCSSProperty(*mResizedObject, *nsGkAtoms::width,
                                        EmptyString());
     }
     if (setHeight) {
-      mCSSEditUtils->RemoveCSSProperty(*resizedObject, *nsGkAtoms::height,
+      mCSSEditUtils->RemoveCSSProperty(*mResizedObject, *nsGkAtoms::height,
                                        EmptyString());
     }
   }
   // finally notify the listeners if any
   for (auto& listener : mObjectResizeEventListeners) {
     listener->OnEndResizing(static_cast<nsIDOMElement*>(GetAsDOMNode(mResizedObject)),
                             mResizedObjectWidth, mResizedObjectHeight, width,
                             height);
--- a/editor/libeditor/HTMLStyleEditor.cpp
+++ b/editor/libeditor/HTMLStyleEditor.cpp
@@ -726,34 +726,31 @@ HTMLEditor::RemoveStyleInside(nsIContent
        (aProperty == nsGkAtoms::href && HTMLEditUtils::IsLink(&aNode)) ||
        // and for named anchors
        (aProperty == nsGkAtoms::name && HTMLEditUtils::IsNamedAnchor(&aNode)) ||
        // or node is any prop and we asked for that
        (!aProperty && NodeIsProperty(aNode)))) {
     // if we weren't passed an attribute, then we want to
     // remove any matching inlinestyles entirely
     if (!aAttribute || aAttribute->IsEmpty()) {
-      NS_NAMED_LITERAL_STRING(styleAttr, "style");
-      NS_NAMED_LITERAL_STRING(classAttr, "class");
-
       bool hasStyleAttr = aNode.HasAttr(kNameSpaceID_None, nsGkAtoms::style);
       bool hasClassAttr = aNode.HasAttr(kNameSpaceID_None, nsGkAtoms::_class);
       if (aProperty && (hasStyleAttr || hasClassAttr)) {
         // aNode carries inline styles or a class attribute so we can't
         // just remove the element... We need to create above the element
         // a span that will carry those styles or class, then we can delete
         // the node.
-        nsCOMPtr<Element> spanNode =
+        RefPtr<Element> spanNode =
           InsertContainerAbove(&aNode, nsGkAtoms::span);
         NS_ENSURE_STATE(spanNode);
         nsresult rv =
-          CloneAttribute(styleAttr, spanNode->AsDOMNode(), aNode.AsDOMNode());
+          CloneAttribute(nsGkAtoms::style, spanNode, aNode.AsElement());
         NS_ENSURE_SUCCESS(rv, rv);
         rv =
-          CloneAttribute(classAttr, spanNode->AsDOMNode(), aNode.AsDOMNode());
+          CloneAttribute(nsGkAtoms::_class, spanNode, aNode.AsElement());
         NS_ENSURE_SUCCESS(rv, rv);
       }
       nsresult rv = RemoveContainer(&aNode);
       NS_ENSURE_SUCCESS(rv, rv);
     } else {
       // otherwise we just want to eliminate the attribute
       nsCOMPtr<nsIAtom> attribute = NS_Atomize(*aAttribute);
       if (aNode.HasAttr(kNameSpaceID_None, attribute)) {
--- a/editor/libeditor/TextEditRules.cpp
+++ b/editor/libeditor/TextEditRules.cpp
@@ -1420,19 +1420,19 @@ TextEditRules::CreateMozBR(nsIDOMNode* i
   NS_ENSURE_TRUE(inParent, NS_ERROR_NULL_POINTER);
 
   nsCOMPtr<nsIDOMNode> brNode;
   NS_ENSURE_STATE(mTextEditor);
   nsresult rv = mTextEditor->CreateBR(inParent, inOffset, address_of(brNode));
   NS_ENSURE_SUCCESS(rv, rv);
 
   // give it special moz attr
-  nsCOMPtr<nsIDOMElement> brElem = do_QueryInterface(brNode);
+  nsCOMPtr<Element> brElem = do_QueryInterface(brNode);
   if (brElem) {
-    rv = mTextEditor->SetAttribute(brElem, NS_LITERAL_STRING("type"),
+    rv = mTextEditor->SetAttribute(brElem, nsGkAtoms::type,
                                    NS_LITERAL_STRING("_moz"));
     NS_ENSURE_SUCCESS(rv, rv);
   }
 
   if (outBRNode) {
     brNode.forget(outBRNode);
   }
   return NS_OK;
--- a/editor/libeditor/TextEditor.cpp
+++ b/editor/libeditor/TextEditor.cpp
@@ -304,19 +304,19 @@ TextEditor::UpdateMetaCharset(nsIDOMDocu
     originalStart = currentValue.BeginReading(start);
     currentValue.EndReading(end);
     if (!FindInReadable(charsetEquals, start, end,
                         nsCaseInsensitiveStringComparator())) {
       continue;
     }
 
     // set attribute to <original prefix> charset=text/html
-    nsCOMPtr<nsIDOMElement> metaElement = do_QueryInterface(metaNode);
+    RefPtr<Element> metaElement = metaNode->AsElement();
     MOZ_ASSERT(metaElement);
-    rv = EditorBase::SetAttribute(metaElement, NS_LITERAL_STRING("content"),
+    rv = EditorBase::SetAttribute(metaElement, nsGkAtoms::content,
                                   Substring(originalStart, start) +
                                     charsetEquals +
                                     NS_ConvertASCIItoUTF16(aCharacterSet));
     return NS_SUCCEEDED(rv);
   }
   return false;
 }
 
@@ -1613,25 +1613,25 @@ already_AddRefed<EventTarget>
 TextEditor::GetDOMEventTarget()
 {
   nsCOMPtr<EventTarget> copy = mEventTarget;
   return copy.forget();
 }
 
 
 nsresult
-TextEditor::SetAttributeOrEquivalent(nsIDOMElement* aElement,
-                                     const nsAString& aAttribute,
+TextEditor::SetAttributeOrEquivalent(Element* aElement,
+                                     nsIAtom* aAttribute,
                                      const nsAString& aValue,
                                      bool aSuppressTransaction)
 {
   return EditorBase::SetAttribute(aElement, aAttribute, aValue);
 }
 
 nsresult
-TextEditor::RemoveAttributeOrEquivalent(nsIDOMElement* aElement,
-                                        const nsAString& aAttribute,
+TextEditor::RemoveAttributeOrEquivalent(Element* aElement,
+                                        nsIAtom* aAttribute,
                                         bool aSuppressTransaction)
 {
   return EditorBase::RemoveAttribute(aElement, aAttribute);
 }
 
 } // namespace mozilla
--- a/editor/libeditor/TextEditor.h
+++ b/editor/libeditor/TextEditor.h
@@ -58,24 +58,27 @@ public:
   TextEditor();
 
   // nsIPlaintextEditor methods
   NS_DECL_NSIPLAINTEXTEDITOR
 
   // nsIEditorMailSupport overrides
   NS_DECL_NSIEDITORMAILSUPPORT
 
-  // Overrides of EditorBase interface methods
-  NS_IMETHOD SetAttributeOrEquivalent(nsIDOMElement* aElement,
-                                      const nsAString& aAttribute,
-                                      const nsAString& aValue,
-                                      bool aSuppressTransaction) override;
-  NS_IMETHOD RemoveAttributeOrEquivalent(nsIDOMElement* aElement,
-                                         const nsAString& aAttribute,
-                                         bool aSuppressTransaction) override;
+  // Overrides of EditorBase
+  virtual nsresult RemoveAttributeOrEquivalent(
+                     Element* aElement,
+                     nsIAtom* aAttribute,
+                     bool aSuppressTransaction) override;
+  virtual nsresult SetAttributeOrEquivalent(Element* aElement,
+                                            nsIAtom* aAttribute,
+                                            const nsAString& aValue,
+                                            bool aSuppressTransaction) override;
+  using EditorBase::RemoveAttributeOrEquivalent;
+  using EditorBase::SetAttributeOrEquivalent;
 
   NS_IMETHOD Init(nsIDOMDocument* aDoc, nsIContent* aRoot,
                   nsISelectionController* aSelCon, uint32_t aFlags,
                   const nsAString& aValue) override;
 
   NS_IMETHOD GetDocumentIsEmpty(bool* aDocumentIsEmpty) override;
   NS_IMETHOD GetIsDocumentEditable(bool* aIsDocumentEditable) override;
 
--- a/layout/build/nsContentDLF.cpp
+++ b/layout/build/nsContentDLF.cpp
@@ -150,17 +150,17 @@ nsContentDLF::CreateInstance(const char*
   {
     aCommand = "view-source";
 
     // The parser freaks out when it sees the content-type that a
     // view-source channel normally returns.  Get the actual content
     // type of the data.  If it's known, use it; otherwise use
     // text/plain.
     nsAutoCString type;
-    viewSourceChannel->GetOriginalContentType(type);
+    mozilla::Unused << viewSourceChannel->GetOriginalContentType(type);
     bool knownType =
       (!type.EqualsLiteral(VIEWSOURCE_CONTENT_TYPE) &&
         IsTypeInList(type, gHTMLTypes)) ||
       nsContentUtils::IsPlainTextType(type) ||
       IsTypeInList(type, gXMLTypes) ||
       IsTypeInList(type, gSVGTypes) ||
       IsTypeInList(type, gXMLTypes);
 
--- a/layout/painting/nsDisplayList.cpp
+++ b/layout/painting/nsDisplayList.cpp
@@ -7348,22 +7348,19 @@ bool nsDisplayMask::ShouldPaintOnMaskLay
 {
   if (!aManager->IsCompositingCheap()) {
     return false;
   }
 
   nsSVGUtils::MaskUsage maskUsage;
   nsSVGUtils::DetermineMaskUsage(mFrame, mHandleOpacity, maskUsage);
 
-  if (!maskUsage.shouldGenerateMaskLayer && !maskUsage.shouldApplyClipPath &&
-      !maskUsage.shouldGenerateClipMaskLayer) {
-    return false;
-  }
-
-  if (maskUsage.opacity != 1.0 || maskUsage.shouldApplyBasicShape) {
+  // XXX Bug 1323912. nsSVGIntegrationUtils::PaintMask can not handle opacity
+  // correctly. Turn it off before bug fixed.
+  if (maskUsage.opacity != 1.0) {
     return false;
   }
 
   if (!nsSVGIntegrationUtils::IsMaskResourceReady(mFrame)) {
     return false;
   }
 
   if (gfxPrefs::DrawMaskLayer()) {
new file mode 100644
--- /dev/null
+++ b/layout/reftests/svg/paint-on-maskLayer-1c.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<title>Paint clip-path onto mask layer</title>
+<style type="text/css">
+  #inner {
+    width: 200px;
+    height: 200px;
+    box-sizing: border-box;
+    background: blue;
+    /* make clip-path pained on mask layer */
+    border: 1px solid transparent;
+    will-change: transform;
+  }
+
+  #outer {
+    width: 200px;
+    height: 200px;
+    clip-path: inset(0px 100px 100px 0px);
+    /* make it fixed so that inner div has different AGR with outter div */
+    position: fixed;
+  }
+</style>
+<div id="outer">
+  <div id="inner"></div>
+</div>
+
+</html>
\ No newline at end of file
--- a/layout/reftests/svg/reftest.list
+++ b/layout/reftests/svg/reftest.list
@@ -459,8 +459,9 @@ default-preferences
 == clipPath-and-mask-on-outflowElement-01a.html clipPath-on-outflowElement-01-ref.html
 == clipPath-and-mask-on-outflowElement-01b.html clipPath-on-outflowElement-01-ref.html
 
 != nested-mask-mode.svg about:blank
 == mask-empty-size.svg about:blank
 
 == paint-on-maskLayer-1a.html paint-on-maskLayer-1-ref.html
 == paint-on-maskLayer-1b.html paint-on-maskLayer-1-ref.html
+== paint-on-maskLayer-1c.html paint-on-maskLayer-1-ref.html
--- a/layout/svg/nsSVGIntegrationUtils.cpp
+++ b/layout/svg/nsSVGIntegrationUtils.cpp
@@ -739,19 +739,16 @@ nsSVGIntegrationUtils::IsMaskResourceRea
 }
 
 DrawResult
 nsSVGIntegrationUtils::PaintMask(const PaintFramesParams& aParams)
 {
   nsSVGUtils::MaskUsage maskUsage;
   nsSVGUtils::DetermineMaskUsage(aParams.frame, aParams.handleOpacity,
                                  maskUsage);
-  MOZ_ASSERT(maskUsage.shouldGenerateMaskLayer ||
-             maskUsage.shouldApplyClipPath ||
-             maskUsage.shouldGenerateClipMaskLayer);
 
   nsIFrame* frame = aParams.frame;
   if (!ValidateSVGFrame(frame)) {
     return DrawResult::SUCCESS;
   }
 
   if (maskUsage.opacity == 0.0f) {
     return DrawResult::SUCCESS;
@@ -776,33 +773,62 @@ nsSVGIntegrationUtils::PaintMask(const P
     //
     // Create one extra draw target for drawing positioned mask, so that we do
     // not have to copy the content of maskTarget before painting
     // clip-path into it.
     maskTarget = maskTarget->CreateSimilarDrawTarget(maskTarget->GetSize(),
                                                      SurfaceFormat::A8);
   }
 
+  if (maskUsage.shouldApplyBasicShape) {
+    matSR.SetContext(&ctx);
+
+    SetupContextMatrix(firstFrame, aParams, offsetToBoundingBox,
+                       offsetToUserSpace);
+
+    nsCSSClipPathInstance::ApplyBasicShapeClip(ctx, frame);
+    if (!maskUsage.shouldGenerateMaskLayer) {
+      // Only have basic-shape clip-path effect. Fill clipped region by
+      // opaque white.
+      ctx.SetColor(Color(0.0, 0.0, 0.0, 1.0));
+      ctx.Fill();
+      ctx.PopClip();
+
+      return result;
+    }
+  }
+
   // Paint mask onto ctx.
   if (maskUsage.shouldGenerateMaskLayer) {
+    matSR.Restore();
     matSR.SetContext(&ctx);
 
     SetupContextMatrix(frame, aParams, offsetToBoundingBox,
                        offsetToUserSpace);
     nsTArray<nsSVGMaskFrame *> maskFrames = effectProperties.GetMaskFrames();
-    bool opacityApplied = !HasNonSVGMask(maskFrames);
-    result = PaintMaskSurface(aParams, maskTarget,
-                              opacityApplied ? maskUsage.opacity : 1.0,
+    // XXX Bug 1323912.
+    MOZ_ASSERT(maskUsage.opacity == 1.0,
+               "nsSVGIntegrationUtils::PaintMask can not handle opacity now.");
+    result = PaintMaskSurface(aParams, maskTarget, 1.0,
                               firstFrame->StyleContext(), maskFrames,
                               ctx.CurrentMatrix(), offsetToUserSpace);
     if (result != DrawResult::SUCCESS) {
+      if (maskUsage.shouldApplyBasicShape) {
+        ctx.PopClip();
+      }
+
       return result;
     }
   }
 
+  if (maskUsage.shouldApplyBasicShape) {
+    ctx.PopClip();
+    return result;
+  }
+
   // Paint clip-path onto ctx.
   if (maskUsage.shouldGenerateClipMaskLayer || maskUsage.shouldApplyClipPath) {
     matSR.Restore();
     matSR.SetContext(&ctx);
 
     SetupContextMatrix(firstFrame, aParams, offsetToBoundingBox,
                        offsetToUserSpace);
     Matrix clipMaskTransform;
--- a/media/libstagefright/frameworks/av/media/libstagefright/MetaData.cpp
+++ b/media/libstagefright/frameworks/av/media/libstagefright/MetaData.cpp
@@ -22,16 +22,18 @@
 #include <stdlib.h>
 #include <string.h>
 
 #include <media/stagefright/foundation/ADebug.h>
 #include <media/stagefright/foundation/AString.h>
 #include <media/stagefright/foundation/hexdump.h>
 #include <media/stagefright/MetaData.h>
 
+#include "mozilla/Assertions.h"
+
 namespace stagefright {
 
 MetaData::MetaData() {
 }
 
 MetaData::MetaData(const MetaData &from)
     : RefBase(),
       mItems(from.mItems) {
@@ -187,17 +189,20 @@ bool MetaData::findRect(
 
 bool MetaData::setData(
         uint32_t key, uint32_t type, const void *data, size_t size) {
     bool overwrote_existing = true;
 
     ssize_t i = mItems.indexOfKey(key);
     if (i < 0) {
         typed_data item;
+        // TODO: "i" will be negative value when OOM,
+        // we should consider handling this case instead of asserting.
         i = mItems.add(key, item);
+        MOZ_RELEASE_ASSERT(i >= 0, "Item cannot be added due to OOM.");
 
         overwrote_existing = false;
     }
 
     typed_data &item = mItems.editValueAt(i);
 
     item.setData(type, data, size);
 
--- a/mobile/android/base/java/org/mozilla/gecko/activitystream/ActivityStream.java
+++ b/mobile/android/base/java/org/mozilla/gecko/activitystream/ActivityStream.java
@@ -3,28 +3,33 @@
  * 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.activitystream;
 
 import android.content.Context;
 import android.net.Uri;
 import android.os.AsyncTask;
+import android.support.annotation.NonNull;
 import android.text.TextUtils;
 
 import com.keepsafe.switchboard.SwitchBoard;
 
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
 import org.mozilla.gecko.AppConstants;
 import org.mozilla.gecko.Experiments;
 import org.mozilla.gecko.GeckoSharedPrefs;
 import org.mozilla.gecko.preferences.GeckoPreferences;
 import org.mozilla.gecko.util.StringUtils;
 import org.mozilla.gecko.util.publicsuffix.PublicSuffix;
 
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
 
 public class ActivityStream {
     /**
      * List of undesired prefixes for labels based on a URL.
      *
      * This list is by no means complete and is based on those sources:
      * - https://gist.github.com/nchapman/36502ad115e8825d522a66549971a3f0
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/activitystream/ActivityStreamTelemetry.java
@@ -0,0 +1,170 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * 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.activitystream;
+
+import android.support.annotation.NonNull;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.mozilla.gecko.R;
+import org.mozilla.gecko.db.BrowserContract;
+
+import java.util.HashMap;
+
+/**
+ * Telemetry constants and an 'extras' builder specific to Activity Stream.
+ */
+public class ActivityStreamTelemetry {
+    public static class Contract {
+        // Keys
+        public final static String FX_ACCOUNT_PRESENT = "fx_account_present";
+        public final static String ITEM = "item";
+        public final static String SOURCE_TYPE = "source_type";
+        public final static String SOURCE_SUBTYPE = "source_subtype";
+        public final static String ACTION_POSITION = "action_position";
+        public final static String COUNT = "count";
+
+        // Values
+        public final static String TYPE_TOPSITES = "topsites";
+        public final static String TYPE_HIGHLIGHTS = "highlights";
+        public final static String SUBTYPE_PINNED = "pinned";
+        public final static String SUBTYPE_SUGGESTED = "suggested";
+        public final static String SUBTYPE_TOP = "top";
+        public final static String SUBTYPE_VISITED = "visited";
+        public final static String SUBTYPE_BOOKMARKED = "bookmarked";
+        public final static String ITEM_SHARE = "share";
+        public final static String ITEM_ADD_BOOKMARK = "add_bookmark";
+        public final static String ITEM_REMOVE_BOOKMARK = "remove_bookmark";
+        public final static String ITEM_PIN = "pin";
+        public final static String ITEM_UNPIN = "unpin";
+        public final static String ITEM_COPY = "copy";
+        public final static String ITEM_ADD_TO_HOMESCREEN = "homescreen";
+        public final static String ITEM_NEW_TAB = "newtab";
+        public final static String ITEM_DISMISS = "dismiss";
+        public final static String ITEM_DELETE_HISTORY = "delete";
+    }
+
+    /**
+     * A helper class used for composing an 'extras' field. It encapsulates a holder of "global"
+     * key/value pairs which will be present in every 'extras' constructed by this class, and a
+     * static builder which is aware of Activity Stream telemetry needs.
+     */
+    public final static class Extras {
+        private static final HashMap<String, Object> globals = new HashMap<>();
+
+        public static void setGlobal(String key, Object value) {
+            globals.put(key, value);
+        }
+
+        public static Builder builder() {
+            return new Builder();
+        }
+
+        /**
+         * Allows composing a JSON extras blob, which is then "built" into a string representation.
+         */
+        public final static class Builder {
+            private final JSONObject data;
+
+            private Builder() {
+                data = new JSONObject(globals);
+            }
+
+            /**
+             * @param value a {@link JSONObject}, {@link JSONArray}, String, Boolean,
+             *     Integer, Long, Double, {@link JSONObject#NULL}, or {@code null}. May not be
+             *     {@link Double#isNaN() NaNs} or {@link Double#isInfinite()
+             *     infinities}.
+             * @return this object.
+             */
+            public Builder set(@NonNull String key, Object value) {
+                try {
+                    data.put(key, value);
+                } catch (JSONException e) {
+                    throw new IllegalArgumentException("Key can't be null");
+                }
+                return this;
+            }
+
+            /**
+             * Sets extras values describing a context menu interaction based on the menu item ID.
+             *
+             * @param itemId ID of a menu item, which is transformed into a corresponding item
+             *               key/value pair and passed off to {@link this#set(String, Object)}.
+             * @return this object.
+             */
+            public Builder fromMenuItemId(int itemId) {
+                switch (itemId) {
+                    case R.id.share:
+                        this.set(Contract.ITEM, Contract.ITEM_SHARE);
+                        break;
+
+                    case R.id.copy_url:
+                        this.set(Contract.ITEM, Contract.ITEM_COPY);
+                        break;
+
+                    case R.id.add_homescreen:
+                        this.set(Contract.ITEM, Contract.ITEM_ADD_TO_HOMESCREEN);
+                        break;
+
+                    // Our current privacy guidelines do not allow us to write to disk
+                    // Private Browsing-only telemetry that could indicate that PB mode is used.
+                    // See Bug 1325323 for context.
+                    case R.id.open_new_private_tab:
+                    case R.id.open_new_tab:
+                        this.set(Contract.ITEM, Contract.ITEM_NEW_TAB);
+                        break;
+
+                    case R.id.dismiss:
+                        this.set(Contract.ITEM, Contract.ITEM_DISMISS);
+                        break;
+
+                    case R.id.delete:
+                        this.set(Contract.ITEM, Contract.ITEM_DELETE_HISTORY);
+                        break;
+                }
+                return this;
+            }
+
+            public Builder forHighlightSource(Utils.HighlightSource source) {
+                switch (source) {
+                    case VISITED:
+                        this.set(Contract.SOURCE_SUBTYPE, Contract.SUBTYPE_VISITED);
+                        break;
+                    case BOOKMARKED:
+                        this.set(Contract.SOURCE_SUBTYPE, Contract.SUBTYPE_BOOKMARKED);
+                        break;
+                    default:
+                        throw new IllegalStateException("Unknown highlight source: " + source);
+                }
+                return this;
+            }
+
+            public Builder forTopSiteType(int type) {
+                switch (type) {
+                    case BrowserContract.TopSites.TYPE_PINNED:
+                        this.set(Contract.SOURCE_SUBTYPE, Contract.SUBTYPE_PINNED);
+                        break;
+                    case BrowserContract.TopSites.TYPE_SUGGESTED:
+                        this.set(Contract.SOURCE_SUBTYPE, Contract.SUBTYPE_SUGGESTED);
+                        break;
+                    case BrowserContract.TopSites.TYPE_TOP:
+                        this.set(Contract.SOURCE_SUBTYPE, Contract.SUBTYPE_TOP);
+                        break;
+                    // While we also have a "blank" type, it is not used by Activity Stream.
+                    default:
+                        throw new IllegalStateException("Unknown top site type: " + type);
+                }
+                return this;
+            }
+
+            public String build() {
+                return data.toString();
+            }
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/activitystream/Utils.java
@@ -0,0 +1,32 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * 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.activitystream;
+
+import android.database.Cursor;
+
+import org.mozilla.gecko.db.BrowserContract;
+
+/**
+ * Various util methods and constants that are shared by different parts of Activity Stream.
+ */
+public class Utils {
+    public enum HighlightSource {
+        VISITED,
+        BOOKMARKED
+    }
+
+    public static HighlightSource highlightSource(final Cursor cursor) {
+        if (-1 != cursor.getLong(cursor.getColumnIndexOrThrow(BrowserContract.Combined.BOOKMARK_ID))) {
+            return HighlightSource.BOOKMARKED;
+        }
+
+        if (-1 != cursor.getLong(cursor.getColumnIndexOrThrow(BrowserContract.Combined.HISTORY_ID))) {
+            return HighlightSource.VISITED;
+        }
+
+        throw new IllegalArgumentException("Unknown highlight source.");
+    }
+}
--- a/mobile/android/base/java/org/mozilla/gecko/db/BrowserContract.java
+++ b/mobile/android/base/java/org/mozilla/gecko/db/BrowserContract.java
@@ -601,16 +601,17 @@ public class BrowserContract {
 
         public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "topsites");
     }
 
     public static final class Highlights {
         public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "highlights");
 
         public static final String DATE = "date";
+        public static final String METADATA = "metadata";
     }
 
     @RobocopTarget
     public static final class SearchHistory implements CommonColumns, HistoryColumns {
         private SearchHistory() {}
 
         public static final String CONTENT_TYPE = "vnd.android.cursor.dir/searchhistory";
         public static final String QUERY = "query";
--- a/mobile/android/base/java/org/mozilla/gecko/db/BrowserProvider.java
+++ b/mobile/android/base/java/org/mozilla/gecko/db/BrowserProvider.java
@@ -1187,21 +1187,26 @@ public class BrowserProvider extends Sha
         // Select recent bookmarks that have not been visited much
         final String bookmarksQuery = "SELECT * FROM (SELECT " +
                 "-1 AS " + Combined.HISTORY_ID + ", " +
                 DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks._ID) + " AS " + Combined.BOOKMARK_ID + ", " +
                 DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.PARENT) + " AS " + Bookmarks.PARENT + ", " +
                 DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.POSITION) + " AS " + Bookmarks.POSITION + ", " +
                 DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.URL) + ", " +
                 DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.TITLE) + ", " +
-                DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.DATE_CREATED) + " AS " + Highlights.DATE + " " +
+                DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.DATE_CREATED) + " AS " + Highlights.DATE + ", " +
+                DBUtils.qualifyColumn(PageMetadata.TABLE_NAME, PageMetadata.JSON) + " AS " + Highlights.METADATA + " " +
                 "FROM " + Bookmarks.TABLE_NAME + " " +
                 "LEFT JOIN " + History.TABLE_NAME + " ON " +
                     DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.URL) + " = " +
                     DBUtils.qualifyColumn(History.TABLE_NAME, History.URL) + " " +
+                // 1:1 relationship (Metadata is added via INSERT OR REPLACE)
+                "LEFT JOIN " + PageMetadata.TABLE_NAME + " ON " +
+                    DBUtils.qualifyColumn(History.TABLE_NAME, History.GUID) + " = " +
+                    DBUtils.qualifyColumn(PageMetadata.TABLE_NAME, PageMetadata.HISTORY_GUID) + " " +
                 "WHERE " + DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.DATE_CREATED) + " > " + threeDaysAgo + " " +
                 "AND (" + DBUtils.qualifyColumn(History.TABLE_NAME, History.VISITS) + " <= 3 " +
                   "OR " + DBUtils.qualifyColumn(History.TABLE_NAME, History.VISITS) + " IS NULL) " +
                 "AND " + DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.IS_DELETED)  + " = 0 " +
                 "AND " + DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.TYPE) + " = " + Bookmarks.TYPE_BOOKMARK + " " +
                 "AND " + DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.PARENT) + " >= " + Bookmarks.FIXED_ROOT_ID + " " +
                 "AND " + DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.URL) + " NOT IN (SELECT " + ActivityStreamBlocklist.URL + " FROM " + ActivityStreamBlocklist.TABLE_NAME + " )" +
                 "ORDER BY " + DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.DATE_CREATED) + " DESC " +
@@ -1213,21 +1218,26 @@ public class BrowserProvider extends Sha
         // Select recent history that has not been visited much.
         final String historyQuery = "SELECT * FROM (SELECT " +
                 DBUtils.qualifyColumn(History.TABLE_NAME, History._ID) + " AS " + Combined.HISTORY_ID + ", " +
                 "-1 AS " + Combined.BOOKMARK_ID + ", " +
                 DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.PARENT) + " AS " + Bookmarks.PARENT + ", " +
                 DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.POSITION) + " AS " + Bookmarks.POSITION + ", " +
                 DBUtils.qualifyColumn(History.TABLE_NAME, History.URL) + ", " +
                 DBUtils.qualifyColumn(History.TABLE_NAME, History.TITLE) + ", " +
-                DBUtils.qualifyColumn(History.TABLE_NAME, History.DATE_LAST_VISITED) + " AS " + Highlights.DATE + " " +
+                DBUtils.qualifyColumn(History.TABLE_NAME, History.DATE_LAST_VISITED) + " AS " + Highlights.DATE + ", " +
+                DBUtils.qualifyColumn(PageMetadata.TABLE_NAME, PageMetadata.JSON) + " AS " + Highlights.METADATA + " " +
                 "FROM " + History.TABLE_NAME + " " +
                 "LEFT JOIN " + Bookmarks.TABLE_NAME + " ON " +
                     DBUtils.qualifyColumn(History.TABLE_NAME, History.URL) + " = " +
                     DBUtils.qualifyColumn(Bookmarks.TABLE_NAME, Bookmarks.URL) + " " +
+                // 1:1 relationship (Metadata is added via INSERT OR REPLACE)
+                "LEFT JOIN " + PageMetadata.TABLE_NAME + " ON " +
+                    DBUtils.qualifyColumn(History.TABLE_NAME, History.GUID) + " = " +
+                    DBUtils.qualifyColumn(PageMetadata.TABLE_NAME, PageMetadata.HISTORY_GUID) + " " +
                 "WHERE " + DBUtils.qualifyColumn(History.TABLE_NAME, History.DATE_LAST_VISITED) + " < " + last30Minutes + " " +
                 "AND " + DBUtils.qualifyColumn(History.TABLE_NAME, History.VISITS) + " <= 3 " +
                 "AND " + DBUtils.qualifyColumn(History.TABLE_NAME, History.TITLE) + " NOT NULL AND " + DBUtils.qualifyColumn(History.TABLE_NAME, History.TITLE) + " != '' " +
                 "AND " + DBUtils.qualifyColumn(History.TABLE_NAME, History.IS_DELETED) + " = 0 " +
                 "AND " + DBUtils.qualifyColumn(History.TABLE_NAME, History.URL) + " NOT IN (SELECT " + ActivityStreamBlocklist.URL + " FROM " + ActivityStreamBlocklist.TABLE_NAME + " )" +
                 // TODO: Implement domain black list (bug 1298786)
                 // TODO: Group by host (bug 1298785)
                 "ORDER BY " + DBUtils.qualifyColumn(History.TABLE_NAME, History.DATE_LAST_VISITED) + " DESC " +
--- a/mobile/android/base/java/org/mozilla/gecko/home/activitystream/ActivityStream.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/activitystream/ActivityStream.java
@@ -6,30 +6,27 @@
 
 import android.content.Context;
 import android.content.res.Resources;
 import android.database.Cursor;
 import android.os.Bundle;
 import android.support.v4.app.LoaderManager;
 import android.support.v4.content.ContextCompat;
 import android.support.v4.content.Loader;
-import android.support.v4.graphics.ColorUtils;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.util.TypedValue;
 import android.widget.FrameLayout;
 
 import org.mozilla.gecko.R;
+import org.mozilla.gecko.activitystream.ActivityStreamTelemetry;
 import org.mozilla.gecko.db.BrowserDB;
+import org.mozilla.gecko.fxa.FirefoxAccounts;
 import org.mozilla.gecko.home.HomePager;
 import org.mozilla.gecko.home.activitystream.topsites.TopSitesPagerAdapter;
-import org.mozilla.gecko.util.ContextUtils;
 import org.mozilla.gecko.widget.RecyclerViewClickSupport;
 
 public class ActivityStream extends FrameLayout {
     private final StreamRecyclerAdapter adapter;
 
     private static final int LOADER_ID_HIGHLIGHTS = 0;
     private static final int LOADER_ID_TOPSITES = 1;
 
@@ -57,16 +54,21 @@ public class ActivityStream extends Fram
 
         RecyclerViewClickSupport.addTo(rv)
                 .setOnItemClickListener(adapter);
 
         final Resources resources = getResources();
         desiredTileWidth = resources.getDimensionPixelSize(R.dimen.activity_stream_desired_tile_width);
         desiredTilesHeight = resources.getDimensionPixelSize(R.dimen.activity_stream_desired_tile_height);
         tileMargin = resources.getDimensionPixelSize(R.dimen.activity_stream_base_margin);
+
+        ActivityStreamTelemetry.Extras.setGlobal(
+                ActivityStreamTelemetry.Contract.FX_ACCOUNT_PRESENT,
+                FirefoxAccounts.firefoxAccountsExist(context)
+        );
     }
 
     void setOnUrlOpenListeners(HomePager.OnUrlOpenListener onUrlOpenListener, HomePager.OnUrlOpenInBackgroundListener onUrlOpenInBackgroundListener) {
         adapter.setOnUrlOpenListeners(onUrlOpenListener, onUrlOpenInBackgroundListener);
     }
 
     public void load(LoaderManager lm) {
         CursorLoaderCallbacks callbacks = new CursorLoaderCallbacks();
--- a/mobile/android/base/java/org/mozilla/gecko/home/activitystream/StreamItem.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/activitystream/StreamItem.java
@@ -9,26 +9,33 @@ import android.content.SharedPreferences
 import android.content.res.Resources;
 import android.database.Cursor;
 import android.graphics.Color;
 import android.support.annotation.Nullable;
 import android.support.v4.view.ViewPager;
 import android.support.v7.widget.RecyclerView;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
+import android.util.Log;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewStub;
 import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import org.json.JSONException;
+import org.json.JSONObject;
 import org.mozilla.gecko.GeckoSharedPrefs;
 import org.mozilla.gecko.R;
+import org.mozilla.gecko.Telemetry;
+import org.mozilla.gecko.TelemetryContract;
+import org.mozilla.gecko.activitystream.Utils;
 import org.mozilla.gecko.activitystream.ActivityStream.LabelCallback;
+import org.mozilla.gecko.activitystream.ActivityStreamTelemetry;
 import org.mozilla.gecko.db.BrowserContract;
 import org.mozilla.gecko.home.HomePager;
 import org.mozilla.gecko.home.activitystream.menu.ActivityStreamContextMenu;
 import org.mozilla.gecko.home.activitystream.topsites.CirclePageIndicator;
 import org.mozilla.gecko.home.activitystream.topsites.TopSitesPagerAdapter;
 import org.mozilla.gecko.icons.IconCallback;
 import org.mozilla.gecko.icons.IconResponse;
 import org.mozilla.gecko.icons.Icons;
@@ -37,16 +44,18 @@ import org.mozilla.gecko.util.ViewUtil;
 import org.mozilla.gecko.util.TouchTargetUtil;
 import org.mozilla.gecko.widget.FaviconView;
 
 import java.util.concurrent.Future;
 
 import static org.mozilla.gecko.activitystream.ActivityStream.extractLabel;
 
 public abstract class StreamItem extends RecyclerView.ViewHolder {
+    private static final String LOGTAG = "GeckoStreamItem";
+
     public StreamItem(View itemView) {
         super(itemView);
     }
 
     public static class HighlightsTitle extends StreamItem {
         public static final int LAYOUT_ID = R.layout.activity_stream_main_highlightstitle;
 
         public HighlightsTitle(final View itemView) {
@@ -130,27 +139,25 @@ public abstract class StreamItem extends
             layoutParams.height = tilesHeight + tilesMargin + textHeight;
             topSitesPager.setLayoutParams(layoutParams);
         }
     }
 
     public static class HighlightItem extends StreamItem implements IconCallback {
         public static final int LAYOUT_ID = R.layout.activity_stream_card_history_item;
 
-        enum HighlightSource {
-            VISITED,
-            BOOKMARKED
-        }
-
         String title;
         String url;
+        JSONObject metadata;
 
         @Nullable Boolean isPinned;
         @Nullable Boolean isBookmarked;
 
+        Utils.HighlightSource source;
+
         final FaviconView vIconView;
         final TextView vLabel;
         final TextView vTimeSince;
         final TextView vSourceView;
         final TextView vPageView;
         final ImageView vSourceIconView;
 
         private Future<IconResponse> ongoingIconLoad;
@@ -175,62 +182,80 @@ public abstract class StreamItem extends
             menuButton.setImageDrawable(
                     DrawableUtil.tintDrawable(menuButton.getContext(), R.drawable.menu, Color.LTGRAY));
 
             TouchTargetUtil.ensureTargetHitArea(menuButton, itemView);
 
             menuButton.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
+                    ActivityStreamTelemetry.Extras.Builder extras = ActivityStreamTelemetry.Extras.builder()
+                        .set(ActivityStreamTelemetry.Contract.SOURCE_TYPE, ActivityStreamTelemetry.Contract.TYPE_HIGHLIGHTS)
+                        .forHighlightSource(source);
+
                     ActivityStreamContextMenu.show(v.getContext(),
                             menuButton,
+                            extras,
                             ActivityStreamContextMenu.MenuMode.HIGHLIGHT,
                             title, url, isBookmarked, isPinned,
                             onUrlOpenListener, onUrlOpenInBackgroundListener,
                             vIconView.getWidth(), vIconView.getHeight());
+
+                    Telemetry.sendUIEvent(
+                            TelemetryContract.Event.SHOW,
+                            TelemetryContract.Method.CONTEXT_MENU,
+                            extras.build()
+                    );
                 }
             });
 
             ViewUtil.enableTouchRipple(menuButton);
         }
 
         public void bind(Cursor cursor, int tilesWidth, int tilesHeight) {
-
             final long time = cursor.getLong(cursor.getColumnIndexOrThrow(BrowserContract.Highlights.DATE));
             final String ago = DateUtils.getRelativeTimeSpanString(time, System.currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS, 0).toString();
 
             title = cursor.getString(cursor.getColumnIndexOrThrow(BrowserContract.History.TITLE));
             url = cursor.getString(cursor.getColumnIndexOrThrow(BrowserContract.Combined.URL));
+            source = Utils.highlightSource(cursor);
+
+            try {
+                final String rawMetadata = cursor.getString(cursor.getColumnIndexOrThrow(BrowserContract.Highlights.METADATA));
+                if (rawMetadata != null) {
+                    metadata = new JSONObject(rawMetadata);
+                }
+            } catch (JSONException e) {
+                Log.w(LOGTAG, "JSONException while parsing page metadata", e);
+            }
 
             vLabel.setText(title);
             vTimeSince.setText(ago);
 
             ViewGroup.LayoutParams layoutParams = vIconView.getLayoutParams();
             layoutParams.width = tilesWidth - tilesMargin;
             layoutParams.height = tilesHeight;
             vIconView.setLayoutParams(layoutParams);
 
-            final HighlightSource source = highlightSource(cursor);
-
-            updateStateForSource(source, cursor);
+            updateStateForSource(source);
             updateUiForSource(source);
-            updatePage(url);
+            updatePage(metadata, url);
 
             if (ongoingIconLoad != null) {
                 ongoingIconLoad.cancel(true);
             }
 
             ongoingIconLoad = Icons.with(itemView.getContext())
                     .pageUrl(url)
                     .skipNetwork()
                     .build()
                     .execute(this);
         }
 
-        private void updateStateForSource(HighlightSource source, Cursor cursor) {
+        private void updateStateForSource(Utils.HighlightSource source) {
             // We can only be certain of bookmark state if an item is a bookmark item.
             // Otherwise, due to the underlying highlights query, we have to look up states when
             // menus are displayed.
             switch (source) {
                 case BOOKMARKED:
                     isBookmarked = true;
                     isPinned = null;
                     break;
@@ -238,57 +263,55 @@ public abstract class StreamItem extends
                     isBookmarked = null;
                     isPinned = null;
                     break;
                 default:
                     throw new IllegalArgumentException("Unknown source: " + source);
             }
         }
 
-        private void updateUiForSource(HighlightSource source) {
+        private void updateUiForSource(Utils.HighlightSource source) {
             switch (source) {
                 case BOOKMARKED:
                     vSourceView.setText(R.string.activity_stream_highlight_label_bookmarked);
                     vSourceView.setVisibility(View.VISIBLE);
                     vSourceIconView.setImageResource(R.drawable.ic_as_bookmarked);
                     break;
                 case VISITED:
                     vSourceView.setText(R.string.activity_stream_highlight_label_visited);
                     vSourceView.setVisibility(View.VISIBLE);
                     vSourceIconView.setImageResource(R.drawable.ic_as_visited);
                     break;
                 default:
                     vSourceView.setVisibility(View.INVISIBLE);
                     vSourceIconView.setImageResource(0);
                     break;
             }
-
-            // TODO Why?
-            // vSourceView.setText(vSourceView.getText());
         }
 
-        private void updatePage(final String url) {
+        private void updatePage(final JSONObject metadata, final String url) {
+            // First try to set the provider name from the page's metadata.
+
+            try {
+                if (metadata != null && metadata.has("provider")) {
+                    vPageView.setText(metadata.getString("provider"));
+                    return;
+                }
+            } catch (JSONException e) {
+                // Broken JSON? Continue with fallback.
+            }
+
+            // If there's no provider name available then let's try to extract one from the URL.
+
             extractLabel(itemView.getContext(), url, false, new LabelCallback() {
                 @Override
                 public void onLabelExtracted(String label) {
                     vPageView.setText(TextUtils.isEmpty(label) ? url : label);
                 }
             });
         }
 
         @Override
         public void onIconResponse(IconResponse response) {
             vIconView.updateImage(response);
         }
     }
-
-    private static HighlightItem.HighlightSource highlightSource(final Cursor cursor) {
-        if (-1 != cursor.getLong(cursor.getColumnIndexOrThrow(BrowserContract.Combined.BOOKMARK_ID))) {
-            return HighlightItem.HighlightSource.BOOKMARKED;
-        }
-
-        if (-1 != cursor.getLong(cursor.getColumnIndexOrThrow(BrowserContract.Combined.HISTORY_ID))) {
-            return HighlightItem.HighlightSource.VISITED;
-        }
-
-        throw new IllegalArgumentException("Unknown highlight source.");
-    }
 }
--- a/mobile/android/base/java/org/mozilla/gecko/home/activitystream/StreamRecyclerAdapter.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/activitystream/StreamRecyclerAdapter.java
@@ -8,16 +8,18 @@ package org.mozilla.gecko.home.activitys
 import android.database.Cursor;
 import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
 import org.mozilla.gecko.Telemetry;
 import org.mozilla.gecko.TelemetryContract;
+import org.mozilla.gecko.activitystream.ActivityStreamTelemetry;
+import org.mozilla.gecko.activitystream.Utils;
 import org.mozilla.gecko.db.BrowserContract;
 import org.mozilla.gecko.home.HomePager;
 import org.mozilla.gecko.home.activitystream.StreamItem.HighlightItem;
 import org.mozilla.gecko.home.activitystream.StreamItem.WelcomePanel;
 import org.mozilla.gecko.home.activitystream.StreamItem.HighlightsTitle;
 import org.mozilla.gecko.home.activitystream.StreamItem.TopPanel;
 import org.mozilla.gecko.widget.RecyclerViewClickSupport;
 
@@ -108,25 +110,35 @@ public class StreamRecyclerAdapter exten
 
     @Override
     public void onItemClicked(RecyclerView recyclerView, int position, View v) {
         if (getItemViewType(position) != HighlightItem.LAYOUT_ID) {
             // Headers (containing topsites and/or the highlights title) do their own click handling as needed
             return;
         }
 
-        highlightsCursor.moveToPosition(
-                translatePositionToCursor(position));
+        int actualPosition = translatePositionToCursor(position);
+        highlightsCursor.moveToPosition(actualPosition);
 
         final String url = highlightsCursor.getString(
                 highlightsCursor.getColumnIndexOrThrow(BrowserContract.Combined.URL));
 
         onUrlOpenListener.onUrlOpen(url, EnumSet.of(HomePager.OnUrlOpenListener.Flags.ALLOW_SWITCH_TO_TAB));
 
-        Telemetry.sendUIEvent(TelemetryContract.Event.LOAD_URL, TelemetryContract.Method.LIST_ITEM, "as_highlights");
+        ActivityStreamTelemetry.Extras.Builder extras = ActivityStreamTelemetry.Extras.builder()
+                .forHighlightSource(Utils.highlightSource(highlightsCursor))
+                .set(ActivityStreamTelemetry.Contract.SOURCE_TYPE, ActivityStreamTelemetry.Contract.TYPE_HIGHLIGHTS)
+                .set(ActivityStreamTelemetry.Contract.ACTION_POSITION, actualPosition)
+                .set(ActivityStreamTelemetry.Contract.COUNT, highlightsCursor.getCount());
+
+        Telemetry.sendUIEvent(
+                TelemetryContract.Event.LOAD_URL,
+                TelemetryContract.Method.LIST_ITEM,
+                extras.build()
+        );
     }
 
     @Override
     public int getItemCount() {
         final int highlightsCount;
 
         if (highlightsCursor != null) {
             highlightsCount = highlightsCursor.getCount();
--- a/mobile/android/base/java/org/mozilla/gecko/home/activitystream/menu/ActivityStreamContextMenu.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/activitystream/menu/ActivityStreamContextMenu.java
@@ -13,16 +13,17 @@ import android.support.design.widget.Nav
 import android.view.MenuItem;
 import android.view.View;
 
 import org.mozilla.gecko.GeckoAppShell;
 import org.mozilla.gecko.IntentHelper;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.Telemetry;
 import org.mozilla.gecko.TelemetryContract;
+import org.mozilla.gecko.activitystream.ActivityStreamTelemetry;
 import org.mozilla.gecko.annotation.RobocopTarget;
 import org.mozilla.gecko.db.BrowserDB;
 import org.mozilla.gecko.home.HomePager;
 import org.mozilla.gecko.reader.SavedReaderViewHelper;
 import org.mozilla.gecko.util.Clipboard;
 import org.mozilla.gecko.util.HardwareUtils;
 import org.mozilla.gecko.util.ThreadUtils;
 import org.mozilla.gecko.util.UIAsyncTask;
@@ -33,44 +34,48 @@ import java.util.EnumSet;
 public abstract class ActivityStreamContextMenu
         implements NavigationView.OnNavigationItemSelectedListener {
 
     public enum MenuMode {
         HIGHLIGHT,
         TOPSITE
     }
 
-    final Context context;
+    private final Context context;
 
-    final String title;
-    final String url;
+    private final String title;
+    private final String url;
+
+    private final ActivityStreamTelemetry.Extras.Builder telemetryExtraBuilder;
 
     // We might not know bookmarked/pinned states, so we allow for null values.
+    // If we aren't told what these are in the constructor, we look them up in postInit.
     private @Nullable Boolean isBookmarked;
     private @Nullable Boolean isPinned;
 
-    final HomePager.OnUrlOpenListener onUrlOpenListener;
-    final HomePager.OnUrlOpenInBackgroundListener onUrlOpenInBackgroundListener;
-
+    private final HomePager.OnUrlOpenListener onUrlOpenListener;
+    private final HomePager.OnUrlOpenInBackgroundListener onUrlOpenInBackgroundListener;
 
     public abstract MenuItem getItemByID(int id);
 
     public abstract void show();
 
     public abstract void dismiss();
 
-    final MenuMode mode;
+    private final MenuMode mode;
 
     /* package-private */ ActivityStreamContextMenu(final Context context,
+                                                    final ActivityStreamTelemetry.Extras.Builder telemetryExtraBuilder,
                                                     final MenuMode mode,
                                                     final String title, @NonNull final String url,
                                                     @Nullable final Boolean isBookmarked, @Nullable final Boolean isPinned,
                                                     HomePager.OnUrlOpenListener onUrlOpenListener,
                                                     HomePager.OnUrlOpenInBackgroundListener onUrlOpenInBackgroundListener) {
         this.context = context;
+        this.telemetryExtraBuilder = telemetryExtraBuilder;
 
         this.mode = mode;
 
         this.title = title;
         this.url = url;
         this.isBookmarked = isBookmarked;
         this.isPinned = isPinned;
         this.onUrlOpenListener = onUrlOpenListener;
@@ -78,17 +83,17 @@ public abstract class ActivityStreamCont
     }
 
     /**
      * Must be called before the menu is shown.
      * <p/>
      * Your implementation must be ready to return items from getItemByID() before postInit() is
      * called, i.e. you should probably inflate your menu items before this call.
      */
-    protected void postInit() {
+    /* package-local */ void postInit() {
         final MenuItem bookmarkItem = getItemByID(R.id.bookmark);
         if (Boolean.TRUE.equals(this.isBookmarked)) {
             bookmarkItem.setTitle(R.string.bookmark_remove);
         }
 
         final MenuItem pinItem = getItemByID(R.id.pin);
         if (Boolean.TRUE.equals(this.isPinned)) {
             pinItem.setTitle(R.string.contextmenu_top_sites_unpin);
@@ -101,167 +106,184 @@ public abstract class ActivityStreamCont
             final MenuItem dismissItem = getItemByID(R.id.dismiss);
             dismissItem.setVisible(false);
         }
 
         if (isBookmarked == null) {
             // Disable the bookmark item until we know its bookmark state
             bookmarkItem.setEnabled(false);
 
-            (new UIAsyncTask.WithoutParams<Void>(ThreadUtils.getBackgroundHandler()) {
+            (new UIAsyncTask.WithoutParams<Boolean>(ThreadUtils.getBackgroundHandler()) {
                 @Override
-                protected Void doInBackground() {
-                    isBookmarked = BrowserDB.from(context).isBookmark(context.getContentResolver(), url);
-                    return null;
+                protected Boolean doInBackground() {
+                    return BrowserDB.from(context).isBookmark(context.getContentResolver(), url);
                 }
 
                 @Override
-                protected void onPostExecute(Void aVoid) {
-                    if (isBookmarked) {
+                protected void onPostExecute(Boolean hasBookmark) {
+                    if (hasBookmark) {
                         bookmarkItem.setTitle(R.string.bookmark_remove);
                     }
 
+                    isBookmarked = hasBookmark;
                     bookmarkItem.setEnabled(true);
                 }
             }).execute();
         }
 
         if (isPinned == null) {
             // Disable the pin item until we know its pinned state
             pinItem.setEnabled(false);
 
-            (new UIAsyncTask.WithoutParams<Void>(ThreadUtils.getBackgroundHandler()) {
+            (new UIAsyncTask.WithoutParams<Boolean>(ThreadUtils.getBackgroundHandler()) {
                 @Override
-                protected Void doInBackground() {
-                    isPinned = BrowserDB.from(context).isPinnedForAS(context.getContentResolver(), url);
-                    return null;
+                protected Boolean doInBackground() {
+                    return BrowserDB.from(context).isPinnedForAS(context.getContentResolver(), url);
                 }
 
                 @Override
-                protected void onPostExecute(Void aVoid) {
-                    if (isPinned) {
+                protected void onPostExecute(Boolean hasPin) {
+                    if (hasPin) {
                         pinItem.setTitle(R.string.contextmenu_top_sites_unpin);
                     }
 
+                    isPinned = hasPin;
                     pinItem.setEnabled(true);
                 }
             }).execute();
         }
 
         // Only show the "remove from history" item if a page actually has history
         final MenuItem deleteHistoryItem = getItemByID(R.id.delete);
         deleteHistoryItem.setVisible(false);
 
-        (new UIAsyncTask.WithoutParams<Void>(ThreadUtils.getBackgroundHandler()) {
-            boolean hasHistory;
-
+        (new UIAsyncTask.WithoutParams<Boolean>(ThreadUtils.getBackgroundHandler()) {
             @Override
-            protected Void doInBackground() {
+            protected Boolean doInBackground() {
                 final Cursor cursor = BrowserDB.from(context).getHistoryForURL(context.getContentResolver(), url);
+                // It's tempting to throw here, but crashing because of a (hopefully) inconsequential
+                // oddity is somewhat questionable.
+                if (cursor == null) {
+                    return false;
+                }
                 try {
-                    if (cursor != null &&
-                            cursor.getCount() == 1) {
-                        hasHistory = true;
-                    } else {
-                        hasHistory = false;
-                    }
+                    return cursor.getCount() == 1;
                 } finally {
                     cursor.close();
                 }
-                return null;
             }
 
             @Override
-            protected void onPostExecute(Void aVoid) {
-                if (hasHistory) {
-                    deleteHistoryItem.setVisible(true);
-                }
+            protected void onPostExecute(Boolean hasHistory) {
+                deleteHistoryItem.setVisible(hasHistory);
             }
         }).execute();
     }
 
 
     @Override
     public boolean onNavigationItemSelected(MenuItem item) {
+        final int menuItemId = item.getItemId();
+
+        // Sets extra telemetry which doesn't require additional state information.
+        // Pin and bookmark items are handled separately below, since they do require state
+        // information to handle correctly.
+        telemetryExtraBuilder.fromMenuItemId(menuItemId);
+
         switch (item.getItemId()) {
             case R.id.share:
+                // NB: Generic menu item action event will be sent at the end of this function.
+                // We have a seemingly duplicate telemetry event here because we want to emit
+                // a concrete event in case it is used by other queries to estimate feature usage.
                 Telemetry.sendUIEvent(TelemetryContract.Event.SHARE, TelemetryContract.Method.LIST, "as_contextmenu");
 
                 IntentHelper.openUriExternal(url, "text/plain", "", "", Intent.ACTION_SEND, title, false);
                 break;
 
             case R.id.bookmark:
+                final TelemetryContract.Event telemetryEvent;
+                final String telemetryExtra;
+                SavedReaderViewHelper rch = SavedReaderViewHelper.getSavedReaderViewHelper(context);
+                final boolean isReaderViewPage = rch.isURLCached(url);
+
+                // While isBookmarked is nullable, behaviour of postInit - disabling 'bookmark' item
+                // until we know value of isBookmarked - guarantees that it will be set when we get here.
+                if (isBookmarked) {
+                    telemetryEvent = TelemetryContract.Event.UNSAVE;
+
+                    if (isReaderViewPage) {
+                        telemetryExtra = "as_bookmark_reader";
+                    } else {
+                        telemetryExtra = "as_bookmark";
+                    }
+                    telemetryExtraBuilder.set(ActivityStreamTelemetry.Contract.ITEM, ActivityStreamTelemetry.Contract.ITEM_REMOVE_BOOKMARK);
+                } else {
+                    telemetryEvent = TelemetryContract.Event.SAVE;
+                    telemetryExtra = "as_bookmark";
+                    telemetryExtraBuilder.set(ActivityStreamTelemetry.Contract.ITEM, ActivityStreamTelemetry.Contract.ITEM_ADD_BOOKMARK);
+                }
+                // NB: Generic menu item action event will be sent at the end of this function.
+                // We have a seemingly duplicate telemetry event here because we want to emit
+                // a concrete event in case it is used by other queries to estimate feature usage.
+                Telemetry.sendUIEvent(telemetryEvent, TelemetryContract.Method.CONTEXT_MENU, telemetryExtra);
+
                 ThreadUtils.postToBackgroundThread(new Runnable() {
                     @Override
                     public void run() {
                         final BrowserDB db = BrowserDB.from(context);
 
-                        final TelemetryContract.Event telemetryEvent;
-                        final String telemetryExtra;
                         if (isBookmarked) {
                             db.removeBookmarksWithURL(context.getContentResolver(), url);
 
-                            SavedReaderViewHelper rch = SavedReaderViewHelper.getSavedReaderViewHelper(context);
-                            final boolean isReaderViewPage = rch.isURLCached(url);
-
-                            telemetryEvent = TelemetryContract.Event.UNSAVE;
-
-                            if (isReaderViewPage) {
-                                telemetryExtra = "as_bookmark_reader";
-                            } else {
-                                telemetryExtra = "as_bookmark";
-                            }
                         } else {
                             // We only store raw URLs in history (and bookmarks), hence we won't ever show about:reader
                             // URLs in AS topsites or highlights. Therefore we don't need to do any special about:reader handling here.
                             db.addBookmark(context.getContentResolver(), title, url);
-
-                            telemetryEvent = TelemetryContract.Event.SAVE;
-                            telemetryExtra = "as_bookmark";
                         }
-
-                        Telemetry.sendUIEvent(telemetryEvent, TelemetryContract.Method.CONTEXT_MENU, telemetryExtra);
                     }
                 });
                 break;
 
             case R.id.pin:
+                // While isPinned is nullable, behaviour of postInit - disabling 'pin' item
+                // until we know value of isPinned - guarantees that it will be set when we get here.
+                if (isPinned) {
+                    telemetryExtraBuilder.set(ActivityStreamTelemetry.Contract.ITEM, ActivityStreamTelemetry.Contract.ITEM_UNPIN);
+                } else {
+                    telemetryExtraBuilder.set(ActivityStreamTelemetry.Contract.ITEM, ActivityStreamTelemetry.Contract.ITEM_PIN);
+                }
+
                 ThreadUtils.postToBackgroundThread(new Runnable() {
                     @Override
                     public void run() {
                         final BrowserDB db = BrowserDB.from(context);
 
                         if (isPinned) {
                             db.unpinSiteForAS(context.getContentResolver(), url);
                         } else {
                             db.pinSiteForAS(context.getContentResolver(), url, title);
                         }
                     }
                 });
+                break;
 
             case R.id.copy_url:
                 Clipboard.setText(url);
                 break;
 
             case R.id.add_homescreen:
                 GeckoAppShell.createShortcut(title, url);
-
-                Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.CONTEXT_MENU, "as_add_to_launcher");
                 break;
 
             case R.id.open_new_tab:
                 onUrlOpenInBackgroundListener.onUrlOpenInBackground(url, EnumSet.noneOf(HomePager.OnUrlOpenInBackgroundListener.Flags.class));
-
-                Telemetry.sendUIEvent(TelemetryContract.Event.LOAD_URL, TelemetryContract.Method.CONTEXT_MENU, "as_new_tab");
                 break;
 
             case R.id.open_new_private_tab:
                 onUrlOpenInBackgroundListener.onUrlOpenInBackground(url, EnumSet.of(HomePager.OnUrlOpenInBackgroundListener.Flags.PRIVATE));
-
-                Telemetry.sendUIEvent(TelemetryContract.Event.LOAD_URL, TelemetryContract.Method.CONTEXT_MENU, "as_private_tab");
                 break;
 
             case R.id.dismiss:
                 ThreadUtils.postToBackgroundThread(new Runnable() {
                     @Override
                     public void run() {
                         BrowserDB.from(context)
                                 .blockActivityStreamSite(context.getContentResolver(),
@@ -280,42 +302,48 @@ public abstract class ActivityStreamCont
                     }
                 });
                 break;
 
             default:
                 throw new IllegalArgumentException("Menu item with ID=" + item.getItemId() + " not handled");
         }
 
+        Telemetry.sendUIEvent(
+                TelemetryContract.Event.ACTION,
+                TelemetryContract.Method.CONTEXT_MENU,
+                telemetryExtraBuilder.build()
+        );
+
         dismiss();
         return true;
     }
 
 
     @RobocopTarget
     public static ActivityStreamContextMenu show(Context context,
-                                                      View anchor,
+                                                      View anchor, ActivityStreamTelemetry.Extras.Builder telemetryExtraBuilder,
                                                       final MenuMode menuMode,
                                                       final String title, @NonNull final String url,
                                                       @Nullable final Boolean isBookmarked, @Nullable final Boolean isPinned,
                                                       HomePager.OnUrlOpenListener onUrlOpenListener,
                                                       HomePager.OnUrlOpenInBackgroundListener onUrlOpenInBackgroundListener,
                                                       final int tilesWidth, final int tilesHeight) {
         final ActivityStreamContextMenu menu;
 
         if (!HardwareUtils.isTablet()) {
             menu = new BottomSheetContextMenu(context,
-                    menuMode,
+                    telemetryExtraBuilder, menuMode,
                     title, url, isBookmarked, isPinned,
                     onUrlOpenListener, onUrlOpenInBackgroundListener,
                     tilesWidth, tilesHeight);
         } else {
             menu = new PopupContextMenu(context,
                     anchor,
-                    menuMode,
+                    telemetryExtraBuilder, menuMode,
                     title, url, isBookmarked, isPinned,
                     onUrlOpenListener, onUrlOpenInBackgroundListener);
         }
 
         menu.show();
         return menu;
     }
 }
--- a/mobile/android/base/java/org/mozilla/gecko/home/activitystream/menu/BottomSheetContextMenu.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/activitystream/menu/BottomSheetContextMenu.java
@@ -2,27 +2,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.home.activitystream.menu;
 
 import android.content.Context;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.design.widget.BottomSheetBehavior;
 import android.support.design.widget.BottomSheetDialog;
 import android.support.design.widget.NavigationView;
 import android.view.LayoutInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.TextView;
 
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.activitystream.ActivityStream;
+import org.mozilla.gecko.activitystream.ActivityStreamTelemetry;
 import org.mozilla.gecko.home.HomePager;
 import org.mozilla.gecko.icons.IconCallback;
 import org.mozilla.gecko.icons.IconResponse;
 import org.mozilla.gecko.icons.Icons;
 import org.mozilla.gecko.widget.FaviconView;
 
 import static org.mozilla.gecko.activitystream.ActivityStream.extractLabel;
 
@@ -30,24 +30,26 @@ import static org.mozilla.gecko.activity
         extends ActivityStreamContextMenu {
 
 
     private final BottomSheetDialog bottomSheetDialog;
 
     private final NavigationView navigationView;
 
     public BottomSheetContextMenu(final Context context,
+                                  final ActivityStreamTelemetry.Extras.Builder telemetryExtraBuilder,
                                   final MenuMode mode,
                                   final String title, @NonNull final String url,
                                   @Nullable final Boolean isBookmarked, @Nullable final Boolean isPinned,
                                   HomePager.OnUrlOpenListener onUrlOpenListener,
                                   HomePager.OnUrlOpenInBackgroundListener onUrlOpenInBackgroundListener,
                                   final int tilesWidth, final int tilesHeight) {
 
         super(context,
+                telemetryExtraBuilder,
                 mode,
                 title,
                 url,
                 isBookmarked,
                 isPinned,
                 onUrlOpenListener,
                 onUrlOpenInBackgroundListener);
 
--- a/mobile/android/base/java/org/mozilla/gecko/home/activitystream/menu/PopupContextMenu.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/activitystream/menu/PopupContextMenu.java
@@ -11,36 +11,40 @@ import android.support.annotation.NonNul
 import android.support.annotation.Nullable;
 import android.support.design.widget.NavigationView;
 import android.view.LayoutInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.widget.PopupWindow;
 
 import org.mozilla.gecko.R;
+import org.mozilla.gecko.activitystream.ActivityStream;
+import org.mozilla.gecko.activitystream.ActivityStreamTelemetry;
 import org.mozilla.gecko.home.HomePager;
 
 /* package-private */ class PopupContextMenu
         extends ActivityStreamContextMenu {
 
     private final PopupWindow popupWindow;
     private final NavigationView navigationView;
 
     private final View anchor;
 
     public PopupContextMenu(final Context context,
                             View anchor,
+                            final ActivityStreamTelemetry.Extras.Builder telemetryExtraBuilder,
                             final MenuMode mode,
                             final String title,
                             @NonNull final String url,
                             @Nullable final Boolean isBookmarked,
                             @Nullable final Boolean isPinned,
                             HomePager.OnUrlOpenListener onUrlOpenListener,
                             HomePager.OnUrlOpenInBackgroundListener onUrlOpenInBackgroundListener) {
         super(context,
+                telemetryExtraBuilder,
                 mode,
                 title,
                 url,
                 isBookmarked,
                 isPinned,
                 onUrlOpenListener,
                 onUrlOpenInBackgroundListener);
 
--- a/mobile/android/base/java/org/mozilla/gecko/home/activitystream/topsites/TopSitesCard.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/activitystream/topsites/TopSitesCard.java
@@ -12,16 +12,17 @@ import android.view.View;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.TextView;
 
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.Telemetry;
 import org.mozilla.gecko.TelemetryContract;
 import org.mozilla.gecko.activitystream.ActivityStream;
+import org.mozilla.gecko.activitystream.ActivityStreamTelemetry;
 import org.mozilla.gecko.db.BrowserContract;
 import org.mozilla.gecko.home.HomePager;
 import org.mozilla.gecko.home.activitystream.menu.ActivityStreamContextMenu;
 import org.mozilla.gecko.icons.IconCallback;
 import org.mozilla.gecko.icons.IconResponse;
 import org.mozilla.gecko.icons.Icons;
 import org.mozilla.gecko.util.DrawableUtil;
 import org.mozilla.gecko.util.ViewUtil;
@@ -98,31 +99,44 @@ class TopSitesCard extends RecyclerView.
         final int tintColor = !response.hasColor() || response.getColor() == Color.WHITE ? Color.LTGRAY : Color.WHITE;
 
         menuButton.setImageDrawable(
                 DrawableUtil.tintDrawable(menuButton.getContext(), R.drawable.menu, tintColor));
     }
 
     @Override
     public void onClick(View clickedView) {
+        ActivityStreamTelemetry.Extras.Builder extras = ActivityStreamTelemetry.Extras.builder()
+                .set(ActivityStreamTelemetry.Contract.SOURCE_TYPE, ActivityStreamTelemetry.Contract.TYPE_TOPSITES)
+                .forTopSiteType(type);
+
         if (clickedView == itemView) {
             onUrlOpenListener.onUrlOpen(url, EnumSet.noneOf(HomePager.OnUrlOpenListener.Flags.class));
 
-            Telemetry.sendUIEvent(TelemetryContract.Event.LOAD_URL, TelemetryContract.Method.LIST_ITEM, "as_top_sites");
+            Telemetry.sendUIEvent(
+                    TelemetryContract.Event.LOAD_URL,
+                    TelemetryContract.Method.LIST_ITEM,
+                    extras.build()
+            );
         } else if (clickedView == menuButton) {
             ActivityStreamContextMenu.show(clickedView.getContext(),
                     menuButton,
+                    extras,
                     ActivityStreamContextMenu.MenuMode.TOPSITE,
                     title.getText().toString(), url,
 
                     isBookmarked, isPinned(type),
 
                     onUrlOpenListener, onUrlOpenInBackgroundListener,
                     faviconView.getWidth(), faviconView.getHeight());
 
-            Telemetry.sendUIEvent(TelemetryContract.Event.SHOW, TelemetryContract.Method.CONTEXT_MENU, "as_top_sites");
+            Telemetry.sendUIEvent(
+                    TelemetryContract.Event.SHOW,
+                    TelemetryContract.Method.CONTEXT_MENU,
+                    extras.build()
+            );
         }
     }
 
-    private static boolean isPinned(int type) {
+    private boolean isPinned(int type) {
         return type == BrowserContract.TopSites.TYPE_PINNED;
     }
 }
--- a/mobile/android/base/moz.build
+++ b/mobile/android/base/moz.build
@@ -330,16 +330,18 @@ gbjar = add_java_jar('gecko-browser')
 gbjar.sources += ['java/org/mozilla/gecko/' + x for x in [
     'AboutPages.java',
     'AccountsHelper.java',
     'ActionBarTextSelection.java',
     'ActionModeCompat.java',
     'ActionModeCompatView.java',
     'ActivityHandlerHelper.java',
     'activitystream/ActivityStream.java',
+    'activitystream/ActivityStreamTelemetry.java',
+    'activitystream/Utils.java',
     'adjust/AdjustBrowserAppDelegate.java',
     'animation/AnimationUtils.java',
     'animation/HeightChangeAnimation.java',
     'animation/PropertyAnimator.java',
     'animation/Rotate3DAnimation.java',
     'animation/ViewHelper.java',
     'ANRReporter.java',
     'BootReceiver.java',
new file mode 100644
--- /dev/null
+++ b/mobile/android/docs/activitystreamtelemetry.rst
@@ -0,0 +1,147 @@
+.. -*- Mode: rst; fill-column: 80; -*-
+
+==============
+Activity Stream UI Telemetry
+==============
+Building on top of UI Telemetry, Activity Stream records additional information about events and user context in which they occur.
+The ``extras`` field is used for that purpose; additional information is structured as JSON blobs.
+
+Session
+=======
+Activity Stream events are recorded as part of the "activitystream.1" session.
+
+Global extras
+=============
+A concept of a "global" extra is meant to support recording certain context information with every event that is being sent, regardless of its type.
+
+``fx_account_present``, values: true, false
+Indicates if Firefox Account is currently enabled.
+
+Extra information available for various event types
+===================================================
+Top Site interactions
+---------------------
+Two event types are recorded:
+
+1) User clicked on a Top Site: event="loadurl.1", method="listitem"
+2) User clicked on the menu button: event="show.1", method="contextmenu"
+
+For each event, in addition to global extras, the following information is recorded:
+
+extras: {
+    ...
+    "source_type": "topsites",
+    "source_subtype": "pinned"/"suggested"/"top"
+}
+
+Subtype indicates a reason an item which is being interacted with appeared in the Top Sites:
+- "pinned": a pinned top site, specifically a non-positioned "Activity Stream pinned" site
+- "suggested": a suggested top site, one of the default ones displayed when there's not enough browsing history available
+- "top": a frecency-based top site, based on browsing history. Neither "pinned" nor "suggested".
+
+Highlight interactions
+----------------------
+Two event types are recorded:
+
+1) User clicked on a Highlight: event="loadurl.1", method="listitem"
+2) User clicked on the menu button: event="show.1", method="contextmenu"
+
+For both event types, in addition to global extras, the following information is recorded:
+
+extras: {
+    ...
+    "source_type": "highlights",
+    "source_subtype": "visited"/"bookmarked"
+}
+
+Subtype indicates reason an item being which is being interacted with appeared in the Highlights:
+- "visited": a website has been visited recently
+- "bookmarked": a website has been bookmarked recently
+
+For "loadurl.1" event, the following extra information is also recorded:
+
+extras: {
+    ...
+    "action_position": number, /* 0-based index of a highlight being interacted with */
+    "count": number, /* total number of highlights displayed */
+}
+
+Context Menu interactions
+-------------------------
+Every interaction with a context menu item is recorded using: event="action.1", method="contextmenu"
+
+For all interactions, in addition to global extras, the following information is recorded:
+
+extras: {
+    ...
+    "item": string, /* name of a menu item */
+    "source_type": "topsites"/"highlights",
+    "source_subtype": string, /* depending on type, one of: "pinned", "suggested", "top", "visited", "bookmarked" */
+}
+
+Possible values for "item" key (names of menu items), in no particular order:
+- "share"
+- "add_bookmark"
+- "remove_bookmark"
+- "pin"
+- "unpin"
+- "copy"
+- "homescreen"
+- "newtab" (private tab actions are collapsed into "newtab" telemetry due to our privacy guidelines)
+- "dismiss"
+- "delete"
+
+Full Examples
+=============
+Following examples of events are here to provide a better feel for the overall shape of telemetry data being recorded.
+
+1) User with an active Firefox Account clicked on a menu item for a "visited highlight":
+``
+session="activitystream.1"
+event="show.1"
+method="contextmenu"
+extras="{
+    'fx_account_present': true,
+    'source_type': 'highlights',
+    'source_subtype': 'visited'
+}"
+``
+
+2) User with no active Firefox Account clicked on a second highlight (recent bookmark), with total of 7 highlights being displayed:
+``
+session="activitystream.1"
+event="loadurl.1"
+method="listitem"
+extras="{
+    'fx_account_present': false,
+    'source_type': 'highlights',
+    'source_subtype': 'bookmarked'
+    'action_position': 1,
+    'count': 7
+}"
+``
+
+3) User with an active Firefox Account clicked on a pinned top site:
+``
+session="activitystream.1"
+event="loadurl.1"
+method="listitem"
+extras="{
+    'fx_account_present': true,
+    'source_type': 'topsites',
+    'source_subtype': 'pinned'
+}"
+``
+
+4) User with an active Firefox Account clicked on a "share" context menu item, which was displayed for a regular top site:
+``
+session="activitystream.1"
+event="action.1"
+method="contextmenu"
+extras="{
+    'fx_account_present': true,
+    'source_type': 'topsites',
+    'source_subtype': 'top',
+    'item': 'share'
+}"
+``
\ No newline at end of file
--- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testActivityStreamContextMenu.java
+++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testActivityStreamContextMenu.java
@@ -5,16 +5,18 @@
 package org.mozilla.gecko.tests;
 
 import android.view.MenuItem;
 import android.view.View;
 
 import com.robotium.solo.Condition;
 
 import org.mozilla.gecko.R;
+import org.mozilla.gecko.activitystream.ActivityStream;
+import org.mozilla.gecko.activitystream.ActivityStreamTelemetry;
 import org.mozilla.gecko.db.BrowserDB;
 import org.mozilla.gecko.home.activitystream.menu.ActivityStreamContextMenu;
 
 /**
  * This test is unfortunately closely coupled to the current implementation, however it is still
  * useful in that it tests the bookmark/history/pinned state specific menu items for correctness.
  */
 public class testActivityStreamContextMenu extends BaseTest {
@@ -56,17 +58,18 @@ public class testActivityStreamContextMe
 
     /**
      * Test that the menu shows the expected menu items for a given URL, and that these items have
      * the correct state.
      */
     private void testMenuForUrl(final String url, final Boolean isBookmarkedKnownState, final boolean isBookmarked, final Boolean isPinnedKnownState, final boolean isPinned, final boolean isVisited) {
         final View anchor = new View(getActivity());
 
-        final ActivityStreamContextMenu menu = ActivityStreamContextMenu.show(getActivity(), anchor, ActivityStreamContextMenu.MenuMode.HIGHLIGHT, "foobar", url, isBookmarkedKnownState, isPinnedKnownState, null, null, 100, 100);
+        final ActivityStreamContextMenu menu = ActivityStreamContextMenu.show(
+                getActivity(), anchor, ActivityStreamTelemetry.Extras.builder(), ActivityStreamContextMenu.MenuMode.HIGHLIGHT, "foobar", url, isBookmarkedKnownState, isPinnedKnownState, null, null, 100, 100);
 
         final int expectedBookmarkString;
         if (isBookmarked) {
             expectedBookmarkString = R.string.bookmark_remove;
         } else {
             expectedBookmarkString = R.string.bookmark;
         }
 
--- a/netwerk/base/nsNetUtil.cpp
+++ b/netwerk/base/nsNetUtil.cpp
@@ -2156,18 +2156,20 @@ NS_IsSrcdocChannel(nsIChannel *aChannel)
   bool isSrcdoc;
   nsCOMPtr<nsIInputStreamChannel> isr = do_QueryInterface(aChannel);
   if (isr) {
     isr->GetIsSrcdocChannel(&isSrcdoc);
     return isSrcdoc;
   }
   nsCOMPtr<nsIViewSourceChannel> vsc = do_QueryInterface(aChannel);
   if (vsc) {
-    vsc->GetIsSrcdocChannel(&isSrcdoc);
-    return isSrcdoc;
+    nsresult rv = vsc->GetIsSrcdocChannel(&isSrcdoc);
+    if (NS_SUCCEEDED(rv)) {
+      return isSrcdoc;
+    }
   }
   return false;
 }
 
 nsresult
 NS_ShouldSecureUpgrade(nsIURI* aURI,
                        nsILoadInfo* aLoadInfo,
                        nsIPrincipal* aChannelResultPrincipal,
--- a/netwerk/protocol/viewsource/nsIViewSourceChannel.idl
+++ b/netwerk/protocol/viewsource/nsIViewSourceChannel.idl
@@ -13,26 +13,26 @@ interface nsIViewSourceChannel : nsIChan
      *
      * nsIViewSourceChannel returns a content type of
      * "application/x-view-source" if you ask it for the contentType
      * attribute.
      *
      * However, callers interested in finding out or setting the
      * actual content type can utilize this attribute.
      */
-    attribute ACString originalContentType;
+    [must_use] attribute ACString originalContentType;
 
     /**
      * Whether the channel was created to view the source of a srcdoc document.
      */
-    readonly attribute boolean isSrcdocChannel;
+    [must_use] readonly attribute boolean isSrcdocChannel;
 
     /**
      * Set to indicate the base URI.  If this channel is a srcdoc channel, it
      * returns the base URI provided by the embedded channel.  It is used to
      * provide an indication of the base URI in circumstances where it isn't
      * otherwise recoverable.  Returns null when it isn't set and isn't a
      * srcdoc channel.
      */
-    attribute nsIURI baseURI;
+    [must_use] attribute nsIURI baseURI;
 };
 
 
--- a/netwerk/protocol/viewsource/nsViewSourceChannel.h
+++ b/netwerk/protocol/viewsource/nsViewSourceChannel.h
@@ -43,22 +43,22 @@ public:
     NS_FORWARD_SAFE_NSIFORMPOSTACTIONCHANNEL(mPostChannel)
     NS_FORWARD_SAFE_NSIHTTPCHANNELINTERNAL(mHttpChannelInternal)
 
     // nsViewSourceChannel methods:
     nsViewSourceChannel()
         : mIsDocument(false)
         , mOpened(false) {}
 
-    nsresult Init(nsIURI* uri);
+    MOZ_MUST_USE nsresult Init(nsIURI* uri);
 
-    nsresult InitSrcdoc(nsIURI* aURI,
-                        nsIURI* aBaseURI,
-                        const nsAString &aSrcdoc,
-                        nsILoadInfo* aLoadInfo);
+    MOZ_MUST_USE nsresult InitSrcdoc(nsIURI* aURI,
+                                     nsIURI* aBaseURI,
+                                     const nsAString &aSrcdoc,
+                                     nsILoadInfo* aLoadInfo);
 
 protected:
     ~nsViewSourceChannel() {}
 
     nsCOMPtr<nsIChannel>        mChannel;
     nsCOMPtr<nsIHttpChannel>    mHttpChannel;
     nsCOMPtr<nsIHttpChannelInternal>    mHttpChannelInternal;
     nsCOMPtr<nsICachingChannel> mCachingChannel;
--- a/netwerk/protocol/viewsource/nsViewSourceHandler.h
+++ b/netwerk/protocol/viewsource/nsViewSourceHandler.h
@@ -20,21 +20,21 @@ class nsViewSourceHandler final : public
 public:
     NS_DECL_ISUPPORTS
     NS_DECL_NSIPROTOCOLHANDLER
 
     nsViewSourceHandler();
 
     // Creates a new nsViewSourceChannel to view the source of an about:srcdoc
     // URI with contents specified by srcdoc.
-    nsresult NewSrcdocChannel(nsIURI *aURI,
-                              nsIURI *aBaseURI,
-                              const nsAString &aSrcdoc,
-                              nsILoadInfo *aLoadInfo,
-                              nsIChannel** outChannel);
+    MOZ_MUST_USE nsresult NewSrcdocChannel(nsIURI *aURI,
+                                           nsIURI *aBaseURI,
+                                           const nsAString &aSrcdoc,
+                                           nsILoadInfo *aLoadInfo,
+                                           nsIChannel** outChannel);
 
     static nsViewSourceHandler* GetInstance();
 
 private:
     ~nsViewSourceHandler();
 
     static nsViewSourceHandler* gInstance;
 };
--- a/old-configure.in
+++ b/old-configure.in
@@ -2072,19 +2072,18 @@ if test -n "$_USE_SYSTEM_NSS"; then
     AM_PATH_NSS(3.28, [MOZ_SYSTEM_NSS=1], [AC_MSG_ERROR([you don't have NSS installed or your version is too old])])
 fi
 
 if test -n "$MOZ_SYSTEM_NSS"; then
    NSS_LIBS="$NSS_LIBS -lcrmf"
 else
    NSS_CFLAGS="-I${DIST}/include/nss"
    case "${OS_ARCH}" in
-        # This is to match the conditions in security/generate_mapfile.py,
-        # plus Windows which doesn't run that script.
-        WINNT|Darwin|Linux)
+        # Only few platforms have been tested with GYP
+        WINNT|Darwin|Linux|DragonFly|FreeBSD|NetBSD|OpenBSD)
             ;;
         *)
             AC_MSG_ERROR([building in-tree NSS is not supported on this platform. Use --with-system-nss])
             ;;
    esac
 fi
 
 if test -z "$SKIP_LIBRARY_CHECKS"; then
--- a/python/mozboot/mozboot/rust.py
+++ b/python/mozboot/mozboot/rust.py
@@ -15,28 +15,28 @@ import sys
 # Use the no-CNAME host for compatibilty with Python 2.7
 # which doesn't support SNI.
 RUSTUP_URL_BASE = 'https://static-rust-lang-org.s3.amazonaws.com/rustup'
 
 # Pull this to get the lastest stable version number.
 RUSTUP_MANIFEST = os.path.join(RUSTUP_URL_BASE, 'release-stable.toml')
 
 # We bake in a known version number so we can verify a checksum.
-RUSTUP_VERSION = '0.6.5'
+RUSTUP_VERSION = '1.0.0'
 
 # SHA-256 checksums of the installers, per platform.
 RUSTUP_HASHES = {
+    'x86_64-unknown-freebsd':
+        '706c2c8a49498b722baad5e8dadaa16a3505e2a9f46b7ee3f41d4dce56163155',
     'x86_64-apple-darwin':
-        '6404ab0a92c1559bac279a20d31be9166c91434f8e7ff8d1a97bcbe4dbd3cadc',
+        '2da68a13feb9a691ef3b59d0d6d53af617962ab5ba4673eaf3818778ccd00bec',
+    'x86_64-unknown-linux-gnu':
+        '4cda09438c08eab55cfe4a98325a5722c4ec66865d07da07d38ddc6c36893692',
     'x86_64-pc-windows-msvc':
-        '772579edcbc9a480a61fb19ace49527839e7f919e1041bcc2dee2a4ff82d3ca2',
-    'x86_64-unknown-linux-gnu':
-        'e901e23ee48c3a24470d997c4376d8835cecca51bf2636dcd419821d4056d823',
-    'x86_64-unknown-freebsd':
-        '63b7c0f35a811993c94af85b96abdd3dcca847d260af284f888e91c2ffdb374e',
+        'e3bba8fbb24aed412757d1ea07d6ed1e952ca3f6293b3551e44649601dbe830f',
 }
 
 NO_PLATFORM = '''
 Sorry, we have no installer configured for your platform.
 
 Please try installing rust for your system from https://rustup.rs/
 or from https://rust-lang.org/ or from your package manager.
 '''
--- a/python/mozbuild/mozbuild/artifacts.py
+++ b/python/mozbuild/mozbuild/artifacts.py
@@ -1039,17 +1039,18 @@ class Artifacts(object):
             if revision == "0" * 40:
                 raise ValueError('git revision specification must resolve to a commit known to hg')
 
         self.log(logging.INFO, 'artifact',
                  {'revset': revset,
                   'revision': revision},
                  'Will only accept artifacts from a pushhead at {revision} '
                  '(matched revset "{revset}").')
-        pushheads = [(list(CANDIDATE_TREES), revision)]
+        # Include try in our search to allow pulling from a specific push.
+        pushheads = [(list(CANDIDATE_TREES) + ['try'], revision)]
         return self._install_from_hg_pushheads(pushheads, distdir)
 
     def install_from(self, source, distdir):
         """Install artifacts from a ``source`` into the given ``distdir``.
         """
         if source and os.path.isfile(source):
             return self.install_from_file(source, distdir)
         elif source and urlparse.urlparse(source).scheme:
--- a/security/generate_mapfile.py
+++ b/security/generate_mapfile.py
@@ -12,43 +12,38 @@
 # The NSS build system processes them using a series of sed replacements,
 # but the Mozilla build system is already running a Python script to generate
 # the file so it's simpler to just do the replacement in Python.
 
 import buildconfig
 
 
 def main(output, input):
-    # There's a check in old-configure.in under the system-nss handling
-    # that should match this.
-    if buildconfig.substs['OS_ARCH'] not in ('Linux', 'Darwin'):
-        print "Error: unhandled OS_ARCH %s" % buildconfig.substs['OS_ARCH']
-        return 1
-    is_linux = buildconfig.substs['OS_ARCH'] == 'Linux'
+    is_darwin = buildconfig.substs['OS_ARCH'] == 'Darwin'
 
     with open(input, 'rb') as f:
         for line in f:
             line = line.rstrip()
             # Remove all lines containing ';-'
             if ';-' in line:
                 continue
-            # On non-Linux, remove all lines containing ';+'
-            if not is_linux and ';+' in line:
+            # On OS X, remove all lines containing ';+'
+            if is_darwin and ';+' in line:
                 continue
             # Remove the string ' DATA '.
             line = line.replace(' DATA ', '')
             # Remove the string ';+'
             line = line.replace(';+', '')
             # Remove the string ';;'
             line = line.replace(';;', '')
             # If a ';' is present, remove everything after it,
-            # and on non-Linux, remove it as well.
+            # and on OS X, remove it as well.
             i = line.find(';')
             if i != -1:
-                if is_linux:
-                    line = line[:i+1]
+                if is_darwin:
+                    line = line[:i]
                 else:
-                    line = line[:i]
-            # On non-Linux, symbols get an underscore in front.
-            if line and not is_linux:
+                    line = line[:i+1]
+            # On OS X, symbols get an underscore in front.
+            if line and is_darwin:
                 output.write('_')
             output.write(line)
             output.write('\n')
--- a/security/manager/ssl/StaticHPKPins.h
+++ b/security/manager/ssl/StaticHPKPins.h
@@ -1144,9 +1144,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 = 471;
 
 static const int32_t kUnknownId = -1;
 
-static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1490884654448000);
+static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1490970376665000);
--- a/security/manager/ssl/nsSTSPreloadList.errors
+++ b/security/manager/ssl/nsSTSPreloadList.errors
@@ -38,32 +38,34 @@ 4mm.org: did not receive HSTS header
 4sqsu.eu: could not connect to host
 50millionablaze.org: did not receive HSTS header
 540.co: 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
+88.to: 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
 922.be: could not connect to host
 960news.ca: could not connect to host
 9point6.com: could not connect to host
 a-plus.space: could not connect to host
 a9c.co: could not connect to host
 aaeblog.com: did not receive HSTS header
 aaeblog.net: did not receive HSTS header
 aaeblog.org: did not receive HSTS header
 aapp.space: could not connect to host
 abearofsoap.com: did not receive HSTS header
 abecodes.net: could not connect to host
 abeestrada.com: did not receive HSTS header
 abilitylist.org: did not receive HSTS header
 abioniere.de: could not connect to host
+abnarnro.com: could not connect to host
 about.ge: could not connect to host
 aboutmyip.info: did not receive HSTS header
 aboutmyproperty.ca: [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]
 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
@@ -162,17 +164,16 @@ alpha.irccloud.com: could not connect to
 alphabit-secure.com: could not connect to host
 alphabuild.io: did not receive HSTS header
 alphalabs.xyz: could not connect to host
 alterbaum.net: did not receive HSTS header
 altfire.ca: could not connect to host
 altmv.com: max-age too low: 7776000
 alwaysmine.fi: did not receive HSTS header
 amaforums.org: could not connect to host
-amdouglas.com: could not connect to host
 american-truck-simulator.de: could not connect to host
 american-truck-simulator.net: could not connect to host
 americanworkwear.nl: did not receive HSTS header
 amigogeek.net: could not connect to host
 amilx.com: could not connect to host
 amilx.org: could not connect to host
 amitube.com: could not connect to host
 amri.nl: could not connect to host
@@ -209,23 +210,23 @@ annabellaw.com: max-age too low: 0
 anomaly.ws: did not receive HSTS header
 anonboards.com: did not receive HSTS header
 anonymousstatecollegelulzsec.com: could not connect to host
 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
+antoinedeschenes.com: could not connect to host
 antoniomarques.eu: did not receive HSTS header
 antoniorequena.com.ve: could not connect to host
 antscript.com: did not receive HSTS header
 any.pm: could not connect to host
 anycoin.me: could not connect to host
 aojiao.org: did not receive HSTS header
-aosc.io: did not receive HSTS header
 apachelounge.com: did not receive HSTS header
 apeasternpower.com: max-age too low: 0
 api.mega.co.nz: could not connect to host
 apibot.de: could not connect to host
 apis.google.com: did not receive HSTS header (error ignored - included regardless)
 apis.world: did not receive HSTS header
 apmg-certified.com: did not receive HSTS header
 apnakliyat.com: did not receive HSTS header
@@ -245,16 +246,17 @@ appson.co.uk: did not receive HSTS heade
 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: max-age too low: 2419200
 argh.io: could not connect to host
 arlen.se: could not connect to host
 armingrodon.de: did not receive HSTS header
+arminpech.de: 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
 arrayify.com: could not connect to host
 ars-design.net: could not connect to host
 ars.toscana.it: max-age too low: 0
 artisanhd.com: did not receive HSTS header
 artistnetwork.nl: did not receive HSTS header
@@ -279,16 +281,17 @@ asset-alive.com: did not receive HSTS he
 asset-alive.net: did not receive HSTS header
 astrath.net: could not connect to host
 astrolpost.com: could not connect to host
 astromelody.com: did not receive HSTS header
 atavio.at: could not connect to host
 atavio.ch: could not connect to host
 atavio.de: did not receive HSTS header
 atbeckett.com: did not receive HSTS header
+atelierdesflammesnoires.fr: could not connect to host
 athaliasoft.com: did not receive HSTS header
 athenelive.com: could not connect to host
 athul.xyz: did not receive HSTS header
 atlex.nl: did not receive HSTS header
 atomik.pro: could not connect to host
 atop.io: could not connect to host
 attimidesigns.com: did not receive HSTS header
 au.search.yahoo.com: max-age too low: 172800
@@ -316,17 +319,16 @@ auxiliumincrementum.co.uk: could not con
 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
 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
-azuxul.fr: could not connect to host
 b3orion.com: max-age too low: 0
 baby-click.de: did not receive HSTS header
 babybic.hu: did not receive HSTS header
 babyhouse.xyz: could not connect to host
 babysaying.me: could not connect to host
 back-bone.nl: did not receive HSTS header
 badcronjob.com: could not connect to host
 badkamergigant.com: could not connect to host
@@ -342,16 +344,17 @@ bannisbierblog.de: could not connect to 
 banqingdiao.com: could not connect to host
 barbaros.info: 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
 basilisk.io: could not connect to host
 basnieuwenhuizen.nl: could not connect to host
 bassh.net: did not receive HSTS header
+baud.ninja: could not connect to host
 baumstark.ca: did not receive HSTS header
 bazarstupava.sk: could not connect to host
 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
@@ -373,16 +376,17 @@ belairsewvac.com: did not receive HSTS h
 belics.com: did not receive HSTS header
 belliash.eu.org: could not connect to host
 belltower.io: could not connect to host
 bendemaree.com: could not connect to host
 beneffy.com: did not receive HSTS header
 benk.press: could not connect to host
 benny003.de: did not receive HSTS header
 benzkosmetik.de: could not connect to host
+berasavocate.com: could not connect to host
 bergenhave.nl: did not receive HSTS header
 bermytraq.bm: [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]
 berr.yt: could not connect to host
 berrymark.be: max-age too low: 0
 besixdouze.world: could not connect to host
 betafive.net: could not connect to host
 betlander.com: did not receive HSTS header
 betnet.fr: could not connect to host
@@ -411,52 +415,47 @@ bildiri.ci: did not receive HSTS header
 bildschirmflackern.de: did not receive HSTS header
 billin.net: could not connect to host
 billkiss.com: max-age too low: 300
 billninja.com: could not connect to host
 binderapp.net: could not connect to host
 biofam.ru: did not receive HSTS header
 bionicspirit.com: could not connect to host
 biophysik-ssl.de: did not receive HSTS header
-bioshome.de: could not connect to host
 birkman.com: did not receive HSTS header
 bismarck.moe: did not receive HSTS header
 bitchan.it: could not connect to host
 bitcoinworld.me: could not connect to host
 bitf.ly: could not connect to host
 bitfactory.ws: could not connect to host
 bitfarm-archiv.com: did not receive HSTS header
 bitfarm-archiv.de: did not receive HSTS header
 bitgo.com: max-age too low: 0
 bitheus.com: could not connect to host
 bithosting.io: did not receive HSTS header
 bitnet.io: did not receive HSTS header
 bitsafe.systems: could not connect to host
-bitstorm.nl: could not connect to host
-bitstorm.org: could not connect to host
 bitvigor.com: could not connect to host
 bivsi.com: could not connect to host
 bizcms.com: did not receive HSTS header
 bizon.sk: did not receive HSTS header
 bl4ckb0x.com: did not receive HSTS header
 bl4ckb0x.de: did not receive HSTS header
 bl4ckb0x.eu: did not receive HSTS header
 bl4ckb0x.info: did not receive HSTS header
 bl4ckb0x.net: did not receive HSTS header
 bl4ckb0x.org: did not receive HSTS header
 black-armada.com.pl: could not connect to host
 black-armada.pl: could not connect to host
-black-khat.com: could not connect to host
 blackburn.link: did not receive HSTS header
 blacklane.com: did not receive HSTS header
 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
 blocksatz-medien.de: did not receive HSTS header
 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
@@ -503,16 +502,17 @@ branchtrack.com: did not receive HSTS he
 branchzero.com: did not receive HSTS header
 brandnewdays.nl: could not connect to host
 brandon.so: could not connect to host
 brandred.net: did not receive HSTS header
 brandspray.com: did not receive HSTS header
 brianmwaters.net: could not connect to host
 brickoo.com: could not connect to host
 brideandgroomdirect.ie: did not receive HSTS header
+brivadois.ovh: could not connect to host
 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
@@ -546,29 +546,31 @@ buyfox.de: did not receive HSTS header
 bvalle.com: did not receive HSTS header
 by4cqb.cn: could not connect to host
 bydisk.com: could not connect to host
 bypassed.press: could not connect to host
 bypro.xyz: could not connect to host
 bysymphony.com: max-age too low: 0
 byte.wtf: did not receive HSTS header
 bytepark.de: did not receive HSTS header
+bytesunlimited.com: could not connect to host
 c1yd3i.me: could not connect to host
 c3b.info: could not connect to host
 cabarave.com: could not connect to host
 cabusar.fr: could not connect to host
 caconnect.org: could not connect to host
 cadao.me: did not receive HSTS header
 cafe-scientifique.org.ec: could not connect to host
 caim.cz: did not receive HSTS header
 cainhosting.com: 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
+callsigns.ca: could not connect to host
 calltrackingreports.com: could not connect to host
 calvin.me: max-age too low: 2592000
 calvinallen.net: did not receive HSTS header
 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
@@ -627,17 +629,16 @@ cevrimici.com: could not connect to host
 cfcproperties.com: did not receive HSTS header
 cfetengineering.com: could not connect to host
 cg.search.yahoo.com: did not receive HSTS header
 chainmonitor.com: could not connect to host
 championsofregnum.com: did not receive HSTS header
 chandlerredding.com: did not receive HSTS header
 changelab.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]
 chaos.fail: did not receive HSTS header
-chaoslab.org: could not connect to host
 chargejuice.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]
 charnleyhouse.co.uk: max-age too low: 604800
 chartpen.com: did not receive HSTS header
 chartstoffarm.de: max-age too low: 10
 chatbot.me: did not receive HSTS header
 chateauconstellation.ch: did not receive HSTS header
 chatup.cf: could not connect to host
 chaulootz.com: could not connect to host
@@ -710,33 +711,33 @@ cmlachapelle.ch: did not receive HSTS he
 cmlancy.ch: did not receive HSTS header
 cmlignon.ch: did not receive HSTS header
 cmplainpalais.ch: did not receive HSTS header
 cmsbattle.com: could not connect to host
 cmscafe.ru: did not receive HSTS header
 cn.search.yahoo.com: did not receive HSTS header
 cni-certing.it: max-age too low: 0
 co50.com: did not receive HSTS header
+coam.co: did not receive HSTS header
 cocaine-import.agency: could not connect to host
 codabix.com: did not receive HSTS header
 codabix.de: could not connect to host
 codabix.net: could not connect to host
 code.google.com: did not receive HSTS header (error ignored - included regardless)
 codeco.pw: could not connect to host
 codeforce.io: did not receive HSTS header
 codepult.com: could not connect to host
 codepx.com: did not receive HSTS header
 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
 coindam.com: could not connect to host
 coldfff.com: could not connect to host
 coldlostsick.net: could not connect to host
-colinwolff.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
 colorbrush.ru: did not receive HSTS header
@@ -762,30 +763,31 @@ controlcenter.gigahost.dk: did not recei
 coolchevy.org.ua: could not connect to host
 coralproject.net: 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
 corenetworking.de: could not connect to host
 cormilu.com.br: did not receive HSTS header
 cornodo.com: could not connect to host
+coronelpicanha.com.br: 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
 corruption-server.net: could not connect to host
 count.sh: could not connect to host
 couragewhispers.ca: did not receive HSTS header
 coursdeprogrammation.com: could not connect to host
 coursella.com: did not receive HSTS header
 covenantbank.net: could not connect to host
 coverduck.ru: could not connect to host
 cr.search.yahoo.com: did not receive HSTS header
 cracking.org: did not receive HSTS header
 craftbeerbarn.co.uk: could not connect to host
-craftedge.xyz: could not connect to host
+craftedge.xyz: did not receive HSTS header
 craftmine.cz: did not receive HSTS header
 crate.io: did not receive HSTS header
 cravelyrics.com: did not receive HSTS header
 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
@@ -825,16 +827,17 @@ cthulhuden.com: could not connect to hos
 cubeserver.eu: could not connect to host
 cubewano.com: could not connect to host
 cujanovic.com: did not receive HSTS header
 cumshots-video.ru: could not connect to host
 cupidmentor.com: did not receive HSTS header
 curroapp.com: could not connect to host
 custe.rs: could not connect to host
 cuvva.insure: did not receive HSTS header
+cvjm-memmingen.de: could not connect to host
 cyanogenmod.xxx: could not connect to host
 cyberpunk.ca: could not connect to host
 cybershambles.com: could not connect to host
 cycleluxembourg.lu: did not receive HSTS header
 cydia-search.io: could not connect to host
 cyphertite.com: could not connect to host
 dad256.tk: could not connect to host
 dadtheimpaler.com: could not connect to host
@@ -862,16 +865,17 @@ dashburst.com: did not receive HSTS head
 dashnimorad.com: did not receive HSTS header
 data-abundance.com: could not connect to host
 databionix.com: could not connect to host
 databutlr.com: could not connect to host
 databutlr.net: could not connect to host
 datahove.no: did not receive HSTS header
 datarank.com: max-age too low: 0
 dataretention.solutions: could not connect to host
+datasnitch.co.uk: could not connect to host
 datatekniikka.com: could not connect to host
 datenkeks.de: did not receive HSTS header
 dateno1.com: max-age too low: 2592000
 datenreiter.cf: could not connect to host
 datenreiter.gq: could not connect to host
 datenreiter.ml: could not connect to host
 datenreiter.tk: could not connect to host
 datewon.net: did not receive HSTS header
@@ -913,16 +917,17 @@ denh.am: did not receive HSTS header
 denisjean.fr: could not connect to host
 dentaldomain.org: max-age too low: 0
 dentaldomain.ph: could not connect to host
 depeche-mode.moscow: max-age too low: 7200
 depijl-mz.nl: did not receive HSTS header
 depixion.agency: could not connect to host
 dequehablamos.es: could not connect to host
 derevtsov.com: did not receive HSTS header
+dergeilstestammderwelt.de: could not connect to host
 derhil.de: did not receive HSTS header
 derwolfe.net: did not receive HSTS header
 desiccantpackets.com: did not receive HSTS header
 destinationbijoux.fr: could not connect to host
 detector.exposed: could not connect to host
 detest.org: could not connect to host
 devcu.net: did not receive HSTS header
 devh.de: did not receive HSTS header
@@ -976,17 +981,16 @@ donzelot.co.uk: max-age too low: 3600
 doomleika.com: could not connect to host
 dopost.it: could not connect to host
 doridian.com: could not connect to host
 doridian.de: could not connect to host
 doridian.net: did not receive HSTS header
 doridian.org: could not connect to host
 dossplumbing.co.za: did not receive HSTS header
 dotadata.me: could not connect to host
-dougferris.id.au: could not connect to host
 dovetailnow.com: could not connect to host
 download.jitsi.org: did not receive HSTS header
 downsouthweddings.com.au: did not receive HSTS header
 doyoucheck.com: did not receive HSTS header
 dpratt.de: could not connect to host
 dr2dr.ca: did not receive HSTS header
 dragonisles.net: could not connect to host
 dragons-of-highlands.cz: could not connect to host
@@ -995,28 +999,28 @@ draw.uy: could not connect to host
 drbethanybarnes.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]
 drdevil.ru: could not connect to host
 drdim.ru: could not connect to host
 dreadbyte.com: could not connect to host
 dreaming.solutions: did not receive HSTS header
 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
-drjuanitacollier.com: could not connect to host
 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
 ds-christiansen.de: did not receive HSTS header
 dshiv.io: could not connect to host
 dubrovskiy.pro: could not connect to host
 duch.cloud: could not connect to host
 duesee.org: could not connect to host
 dullsir.com: did not receive HSTS header
 duria.de: max-age too low: 3600
+dutchrank.com: could not connect to host
 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]
 dxa.io: 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
 dzimejl.sk: did not receive HSTS header
 dzlibs.io: could not connect to host
 e-aut.net: could not connect to host
@@ -1045,16 +1049,17 @@ ecorus.eu: did not receive HSTS header
 edcphenix.tk: could not connect to host
 edelsteincosmetic.com: did not receive HSTS header
 edissecurity.sk: did not receive HSTS header
 edix.ru: could not connect to host
 edk.com.tr: did not receive HSTS header
 edmodo.com: did not receive HSTS header
 edp-collaborative.com: max-age too low: 2500
 eduvance.in: did not receive HSTS header
+edwards.me.uk: could not connect to host
 eenhoorn.ga: did not receive HSTS header
 eeqj.com: could not connect to host
 efficienthealth.com: did not receive HSTS header
 effortlesshr.com: did not receive HSTS header
 egg-ortho.ch: did not receive HSTS header
 egit.co: could not connect to host
 eglek.com: did not receive HSTS header
 ego-world.org: could not connect to host
@@ -1084,17 +1089,16 @@ elmermx.ch: could not connect to host
 elnutricionista.es: did not receive HSTS header
 elpo.xyz: could not connect to host
 elsamakhin.com: could not connect to host
 elsitar.com: did not receive HSTS header
 email.lookout.com: could not connect to host
 emanatepixels.com: could not connect to host
 emeldi-commerce.com: max-age too low: 0
 emjainteractive.com: did not receive HSTS header
-emjimadhu.com: could not connect to host
 emmable.com: could not connect to host
 emnitech.com: could not connect to host
 empleosentorreon.mx: could not connect to host
 empleostampico.com: did not receive HSTS header
 enaah.de: could not connect to host
 enargia.jp: max-age too low: 0
 encode.space: did not receive HSTS header
 encoder.pw: could not connect to host
@@ -1119,17 +1123,17 @@ epanurse.com: could not connect to host
 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
+ericyl.com: could not connect to host
 ernesto.at: 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
@@ -1256,26 +1260,26 @@ fixingdns.com: did not receive HSTS head
 fj.search.yahoo.com: did not receive HSTS header
 fjruiz.es: could not connect to host
 flags.ninja: could not connect to host
 flamewall.net: could not connect to host
 flamingkeys.com.au: could not connect to host
 flawcheck.com: did not receive HSTS header
 fliexer.com: did not receive HSTS header
 floless.co.uk: did not receive HSTS header
+florent-tatard.fr: could not connect to host
 florian-lillpopp.de: max-age too low: 10
 florianlillpopp.de: max-age too low: 10
 floridaescapes.co.uk: did not receive HSTS header
 flouartistique.ch: could not connect to host
 flow.pe: could not connect to host
 flowersandclouds.com: could not connect to host
 flukethoughts.com: could not connect to host
 flushstudios.com: did not receive HSTS header
 flyaces.com: did not receive HSTS header
-flyss.net: did not receive HSTS header
 fm83.nl: could not connect to host
 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
 footballmapped.com: could not connect to host
 foraje-profesionale.ro: did not receive HSTS header
 forbook.net: could not connect to host
@@ -1319,17 +1323,16 @@ frontmin.com: did not receive HSTS heade
 frost-ci.xyz: could not connect to host
 fruitusers.com: could not connect to host
 frusky.net: could not connect to host
 ftctele.com: did not receive HSTS header
 fuckgfw233.org: could not connect to host
 fugle.de: could not connect to host
 fukushima-web.com: did not receive HSTS header
 funkyweddingideas.com.au: could not connect to host
-funnyang.com: could not connect to host
 funrun.com: did not receive HSTS header
 furiffic.com: did not receive HSTS header
 furry.be: max-age too low: 86400
 fusionmate.com: could not connect to host
 futbol11.com: did not receive HSTS header
 futuretechnologi.es: could not connect to host
 futureyouhealth.com: did not receive HSTS header
 fx-rk.com: did not receive HSTS header
@@ -1370,16 +1373,17 @@ geekbundle.org: did not receive HSTS hea
 geekcast.co.uk: did not receive HSTS header
 geeky.software: could not connect to host
 geli-graphics.com: did not receive HSTS header
 gem-indonesia.net: 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
+gersting.net: could not connect to host
 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
 getfirepress.com: could not connect to host
 getinternet.de: max-age too low: 0
@@ -1458,40 +1462,39 @@ gotowned.org: did not receive HSTS heade
 gottcode.org: did not receive HSTS header
 gov.ax: could not connect to host
 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
+graffen.dk: did not receive HSTS header
 grandmascookieblog.com: did not receive HSTS header
 graph.no: did not receive HSTS header
 gravity-net.de: 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
 gregorytlee.me: could not connect to host
 gremots.com: did not receive HSTS header
 greplin.com: could not connect to host
-gribani.com: could not connect to host
 grigalanzsoftware.com: could not connect to host
 grossmann.gr: 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
 gsm-map.com: could not connect to host
 gtanda.tk: could not connect to host
 gtlfsonlinepay.com: did not receive HSTS header
 gtraxapp.com: could not connect to host
 guava.studio: did not receive HSTS header
 guilde-vindicta.fr: did not receive HSTS header
-gulenet.com: did not receive HSTS header
 gurusupe.com: could not connect to host
 gussi.is: could not connect to host
 gvt2.com: could not connect to host (error ignored - included regardless)
 gvt3.com: could not connect to host (error ignored - included regardless)
 gwijaya.com: could not connect to host
 gwtest.us: could not connect to host
 gxlrx.net: could not connect to host
 gyboche.com: could not connect to host
@@ -1599,17 +1602,16 @@ honeytracks.com: [Exception... "Componen
 hongzhaxiaofendui.com: could not connect to host
 honoo.com: could not connect to host
 hookandloom.com: did not receive HSTS header
 hooray.beer: could not connect to host
 horosho.in: could not connect to host
 horseboners.xxx: did not receive HSTS header
 hortifarm.ro: did not receive HSTS header
 hosted-service.com: did not receive HSTS header
-hosted4u.de: could not connect to host
 hostedtalkgadget.google.com: did not receive HSTS header (error ignored - included regardless)
 hostgarou.com: did not receive HSTS header
 hostinaus.com.au: could not connect to host
 hostisan.com: did not receive HSTS header
 hotchillibox.com: max-age too low: 0
 hotchoc.io: did not receive HSTS header
 hotting.nl: could not connect to host
 houkago-step.com: did not receive HSTS header
@@ -1619,16 +1621,17 @@ howbigismybuilding.com: [Exception... "C
 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
 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
+huffduffer.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
 huntshomeinspections.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]
 hurricanelabs.com: did not receive HSTS header
 huskybutt.dog: could not connect to host
 hydra.ws: could not connect to host
@@ -1684,54 +1687,54 @@ immoprotect.ca: did not receive HSTS hea
 immortals-co.com: did not receive HSTS header
 immoverkauf24.at: did not receive HSTS header
 immoverkauf24.de: did not receive HSTS header
 immunicity.info: could not connect to host
 immunicity.press: could not connect to host
 immunicity.top: could not connect to host
 imolug.org: did not receive HSTS header
 imouto.my: max-age too low: 5184000
+imouyang.com: could not connect to host
 imperialwebsolutions.com: did not receive HSTS header
 imu.li: did not receive HSTS header
 imusic.dk: did not receive HSTS header
 inb4.us: could not connect to host
 inbox.li: did not receive HSTS header
 incendiary-arts.com: could not connect to host
 inchomatic.com: did not receive HSTS header
 indoorskiassen.nl: did not receive HSTS header
-indredouglas.me: could not connect to host
 indust.me: did not receive HSTS header
 infcof.com: max-age too low: 0
 infinitude.xyz: could not connect to host
 infinitusgaming.eu: could not connect to host
 inflation.ml: could not connect to host
 infogrfx.com: did not receive HSTS header
 infosec.rip: could not connect to host
 infotics.es: did not receive HSTS header
 injigo.com: did not receive HSTS header
 inkable.com.au: did not receive HSTS header
 inkedguy.de: could not connect to host
 inkstory.gr: did not receive HSTS header
 inksupply.com: did not receive HSTS header
 inleaked.com: could not connect to host
 inmyarea.com: max-age too low: 0
+innophate-security.com: could not connect to host
 innophate-security.nl: could not connect to host
 ins1gn1a.com: did not receive HSTS header
 insane.zone: could not connect to host
 insite-feedback.com: did not receive HSTS header
 inspire-av.com: did not receive HSTS header
 inspiroinc.com: could not connect to host
 instacart.com: did not receive HSTS header
 instantdev.io: could not connect to host
 institutoflordelavida.com: could not connect to host
 intel.li: could not connect to host
 intelldynamics.com: could not connect to host
 interference.io: [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]
 interlun.com: could not connect to host
-internect.co.za: did not receive HSTS header
 internetcasinos.de: did not receive HSTS header
 internetcensus.org: could not connect to host
 interserved.com: did not receive HSTS header
 intex.es: max-age too low: 0
 intim-uslugi-kazan.net: could not connect to host
 intimtoy.com.ua: could not connect to host
 inverselink-user-content.com: could not connect to host
 inverselink.com: could not connect to host
@@ -1798,29 +1801,29 @@ jamesmorrison.me: did not receive HSTS h
 jamourtney.com: could not connect to host
 jan27.org: did not receive HSTS header
 janario.me: could not connect to host
 janbrodda.de: max-age too low: 2592000
 jannyrijneveld.nl: did not receive HSTS header
 janus-engineering.de: did not receive HSTS header
 japlex.com: could not connect to host
 jaqen.ch: could not connect to host
+jardins-utopie.net: could not connect to host
 jaredeberle.org: did not receive HSTS header
 jaroslavtrsek.cz: did not receive HSTS header
 jartza.org: could not connect to host
 jasmineconseil.com: did not receive HSTS header
 jasonrobinson.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]
 jasonroe.me: did not receive HSTS header
 jasonsansone.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]
 jastoria.pl: could not connect to host
 jayblock.com: did not receive HSTS header
 jayschulman.com: could not connect to host
 jayscoaching.com: could not connect to host
 jayshao.com: did not receive HSTS header
-jayxon.com: could not connect to host
 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]
 jazzncheese.com: could not connect to host
 jbbd.fr: 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
@@ -1888,25 +1891,27 @@ junqtion.com: could not connect to host
 jupp0r.de: did not receive HSTS header
 justlikethat.hosting: did not receive HSTS header
 justnaw.co.uk: could not connect to host
 justudin.com: did not receive HSTS header
 juwairen.cn: could not connect to host
 jvoice.net: could not connect to host
 jwilsson.me: could not connect to host
 jxm.in: could not connect to host
+jym.fit: did not receive HSTS header
 k-dev.de: could not connect to host
 ka-clan.com: could not connect to host
 kabuabc.com: did not receive HSTS header
 kadioglumakina.com.tr: did not receive HSTS header
 kaela.design: did not receive HSTS header
 kahopoon.net: could not connect to host
 kaisers.de: did not receive HSTS header
 kalami.nl: did not receive HSTS header
 kamikano.com: could not connect to host
+kaniklani.co.za: could not connect to host
 kaplatz.is: could not connect to host
 kapucini.si: max-age too low: 0
 karaoketonight.com: could not connect to host
 karhukamera.com: could not connect to host
 katiaetdavid.fr: could not connect to host
 katproxy.online: could not connect to host
 katproxy.site: could not connect to host
 katproxy.tech: could not connect to host
@@ -1918,16 +1923,17 @@ kawaiiku.de: could not connect to host
 kayon.cf: could not connect to host
 kdata.it: did not receive HSTS header
 kdm-online.de: did not receive HSTS header
 keeley.gq: could not connect to host
 keeley.ml: could not connect to host
 keeleysam.me: could not connect to host
 keepclean.me: could not connect to host
 ken.fm: did not receive HSTS header
+kennethlim.me: could not connect to host
 kentacademiestrust.org.uk: could not connect to host
 kerangalam.com: could not connect to host
 kerksanders.nl: did not receive HSTS header
 kermadec.net: could not connect to host
 kernl.us: did not receive HSTS header
 kevinapease.com: did not receive HSTS header
 keymaster.lookout.com: did not receive HSTS header
 kgxtech.com: max-age too low: 2592000
@@ -1948,16 +1954,17 @@ kipira.com: could not connect to host
 kircp.com: could not connect to host
 kirkforcongress.com: could not connect to host
 kirkforsenate.com: could not connect to host
 kirkpatrickdavis.com: could not connect to host
 kisa.io: could not connect to host
 kisalt.im: did not receive HSTS header
 kissart.net: could not connect to host
 kissflow.com: did not receive HSTS header
+kisstyle.ru: could not connect to host
 kisun.co.jp: could not connect to host
 kitakemon.com: could not connect to host
 kitchenpunx.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]
 kitk.at: could not connect to host
 kitsta.com: could not connect to host
 kiwiirc.com: max-age too low: 5256000
 kizil.net: could not connect to host
 kjaermaxi.me: did not receive HSTS header
@@ -1984,17 +1991,16 @@ koophetlokaal.nl: max-age too low: 300
 koordinate.net: could not connect to host
 korni22.org: did not receive HSTS header
 korsanparti.org: could not connect to host
 kotonehoko.net: could not connect to host
 kotovstyle.ru: could not connect to host
 kr.search.yahoo.com: did not receive HSTS header
 kredite.sale: could not connect to host
 kriegt.es: could not connect to host
-kristikala.nl: could not connect to host
 krmela.com: could not connect to host
 kroetenfuchs.de: could not connect to host
 kropkait.pl: could not connect to host
 krouzkyliduska.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]
 krunut.com: did not receive HSTS header
 krypteia.org: could not connect to host
 ksfh-mail.de: could not connect to host
 kstan.me: could not connect to host
@@ -2017,32 +2023,33 @@ labaia.info: could not connect to host
 labina.com.tr: did not receive HSTS header
 laboiteapc.fr: did not receive HSTS header
 labordata.io: could not connect to host
 labrador-retrievers.com.au: did not receive HSTS header
 labs.moscow: did not receive HSTS header
 lachlankidson.net: did not receive HSTS header
 lacledeslan.ninja: could not connect to host
 ladbroke.net: did not receive HSTS header
+laextra.mx: could not connect to host
 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
 laserfuchs.de: did not receive HSTS header
 lashstuff.com: did not receive HSTS header
 lask.in: did not receive HSTS header
 latus.xyz: could not connect to host
 lavabit.no: could not connect to host
 lavval.com: could not connect to host
-lawformt.com: did not receive HSTS header
+lawformt.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
 learningorder.com: could not connect to host
@@ -2114,17 +2121,16 @@ linuxgeek.ro: 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
 lnoldan.com: could not connect to host
-lntu.org: could not connect to host
 loadingdeck.com: did not receive HSTS header
 loafbox.com: could not connect to host
 lobosdomain.no-ip.info: could not connect to host
 locktheirphone.com: could not connect to host
 locomotive.ca: did not receive HSTS header
 login.corp.google.com: max-age too low: 7776000 (error ignored - included regardless)
 loginseite.com: could not connect to host
 loli.bz: could not connect to host
@@ -2255,17 +2261,16 @@ mavisang.cf: could not connect to host
 maxfox.me: did not receive HSTS header
 maxtruxa.com: could not connect to host
 maya.mg: could not connect to host
 mbinformatik.de: could not connect to host
 mca2017.org: did not receive HSTS header
 mcc.re: could not connect to host
 mcdonalds.ru: did not receive HSTS header
 mclab.su: could not connect to host
-md5hashing.net: did not receive HSTS header
 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
 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
@@ -2341,17 +2346,17 @@ minikneet.com: did not receive HSTS head
 minikneet.nl: did not receive HSTS header
 minnesotadata.com: could not connect to host
 miragrow.com: could not connect to host
 mirindadomo.ru: did not receive HSTS header
 mironized.com: did not receive HSTS header
 mirrorx.com: did not receive HSTS header
 missrain.tw: could not connect to host
 mister.hosting: could not connect to host
-misterl.net: did not receive HSTS header
+misterl.net: could not connect to host
 mitchellrenouf.ca: could not connect to host
 mittenhacks.com: could not connect to host
 mivcon.net: could not connect to host
 miyoshi-kikaku.co.jp: did not receive HSTS header
 miyoshi-kikaku.com: did not receive HSTS header
 mizd.at: could not connect to host
 mizi.name: did not receive HSTS header
 mlpepilepsy.org: could not connect to host
@@ -2366,17 +2371,17 @@ mobilethreat.net: could not connect to h
 mobilethreatnetwork.net: could not connect to host
 mobilpass.no: could not connect to host
 mocloud.eu: could not connect to host
 moddedark.com: could not connect to host
 modemagazines.co.uk: could not connect to host
 moebel-nagel.de: did not receive HSTS header
 moelord.org: could not connect to host
 moen.io: did not receive HSTS header
-mogry.net: did not receive HSTS header
+mogry.net: could not connect to host
 mona.lu: did not receive HSTS header
 monarca.systems: could not connect to host
 monasterialis.eu: could not connect to host
 mondar.io: could not connect to host
 mondopoint.com: could not connect to host
 monitman.com: could not connect to host
 montenero.pl: could not connect to host
 moon.lc: could not connect to host
@@ -2397,16 +2402,17 @@ motherbase.io: could not connect to host
 motionpicturesolutions.com: could not connect to host
 motocyklovedily.cz: did not receive HSTS header
 motoryz.com: max-age too low: 300
 mottvd.com: could not connect to host
 moula.com.au: did not receive HSTS header
 mountainmusicpromotions.com: did not receive HSTS header
 moviesabout.net: could not connect to host
 moy.cat: could not connect to host
+mozoa.net: did not receive HSTS header
 mp3juices.is: could not connect to host
 mqas.net: could not connect to host
 mrettich.org: could not connect to host
 mrnonz.com: max-age too low: 0
 mrpopat.in: did not receive HSTS header
 mrs-shop.com: did not receive HSTS header
 msc-seereisen.net: could not connect to host
 mszaki.com: did not receive HSTS header
@@ -2429,16 +2435,17 @@ muzykaprzeszladoplay.pl: could not conne
 mvsecurity.nl: could not connect to host
 mw.search.yahoo.com: did not receive HSTS header
 mx.org.ua: could not connect to host
 my-owncloud.com: could not connect to host
 my.alfresco.com: did not receive HSTS header
 my.swedbank.se: did not receive HSTS header
 my.usa.gov: did not receive HSTS header
 myairshop.gr: could not connect to host
+myartsjournal.com: did not receive HSTS header
 mybon.at: could not connect to host
 mybudget.xyz: could not connect to host
 mycollab.net: could not connect to host
 mycoted.com: did not receive HSTS header
 mydeos.com: could not connect to host
 mydigipass.com: did not receive HSTS header
 mygdut.com: did not receive HSTS header
 mygov.scot: did not receive HSTS header
@@ -2463,17 +2470,17 @@ nakliyatsirketi.biz: could not connect t
 nalifornia.com: did not receive HSTS header
 namacindia.com: did not receive HSTS header
 namaho.com: could not connect to host
 nametaken-cloud.duckdns.org: could not connect to host
 nanogeneinc.com: could not connect to host
 nanto.eu: could not connect to host
 narada.com.ua: could not connect to host
 nargileh.nl: could not connect to host
-nascher.org: could not connect to host
+nascher.org: max-age too low: 7884000
 natalia.io: could not connect to host
 natalt.org: did not receive HSTS header
 nathanmfarrugia.com: did not receive HSTS header
 naturesystems.cz: max-age too low: 0
 natuurbehangnederland.nl: could not connect to host
 nauck.org: did not receive HSTS header
 nav.jobs: could not connect to host
 naval.tf: could not connect to host
@@ -2482,16 +2489,17 @@ navjobs.com: did not receive HSTS header
 nbb.io: could not connect to host
 nbg-ha.de: could not connect to host
 ncc60205.info: could not connect to host
 ncpc.gov: could not connect to host
 nct.org.uk: max-age too low: 1
 nctx.co.uk: did not receive HSTS header
 near.st: did not receive HSTS header
 neftaly.com: did not receive HSTS header
+negai.moe: could not connect to host
 negativecurvature.net: could not connect to host
 neko-life.com: did not receive HSTS header
 neko-system.com: did not receive HSTS header
 nella-project.org: could not connect to host
 nellacms.com: could not connect to host
 nellacms.org: could not connect to host
 nellafw.org: could not connect to host
 nemecl.eu: could not connect to host
@@ -2535,16 +2543,17 @@ niconiconi.xyz: could not connect to hos
 niconode.com: could not connect to host
 nien.chat: could not connect to host
 niho.jp: [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]
 nikcub.com: could not connect to host
 nikksno.io: did not receive HSTS header
 nikomo.fi: could not connect to host
 ninchisho-online.com: did not receive HSTS header
 ninhs.org: could not connect to host
+ninux.ch: did not receive HSTS header
 nippler.org: did not receive HSTS header
 nippombashi.net: did not receive HSTS header
 nipponcareers.com: did not receive HSTS header
 nirada.info: could not connect to host
 nixien.fr: could not connect to host
 nkinka.de: did not receive HSTS header
 nmctest.net: could not connect to host
 nnya.cat: could not connect to host
@@ -2623,26 +2632,25 @@ oe8.bet: could not connect to host
 ofcourselanguages.com: could not connect to host
 offshore-firma.org: could not connect to host
 oishioffice.com: did not receive HSTS header
 okane.love: could not connect to host
 okok-rent.com: could not connect to host
 okok.rent: could not connect to host
 okutama.in.th: could not connect to host
 olafnorge.de: could not connect to host
-oliver-pietsch.de: did not receive HSTS header
+oliveraiedelabastideblanche.fr: could not connect to host
 oliverdunk.com: did not receive HSTS header
 ollehbizev.co.kr: could not connect to host
 ollie.io: did not receive HSTS header
 omgaanmetidealen.com: could not connect to host
 ominto.com: max-age too low: 0
 omniasl.com: could not connect to host
 omniti.com: max-age too low: 1
 omquote.gq: could not connect to host
-omskit.ru: could not connect to host
 oneb4nk.com: could not connect to host
 onefour.co: could not connect to host
 oneminute.io: did not receive HSTS header
 onepluscamps.com: did not receive HSTS header
 onespiritinc.com: did not receive HSTS header
 onet.space: could not connect to host
 onewpst.com: did not receive HSTS header
 oniichan.us: did not receive HSTS header
@@ -2714,17 +2722,16 @@ overclockers.ge: could not connect to ho
 override.io: did not receive HSTS header
 oversight.io: could not connect to host
 overthinkingit.com: max-age too low: 3600
 ovvy.net: could not connect to host
 owncloud.help: could not connect to host
 ownmovies.fr: could not connect to host
 oxygenabsorbers.com: did not receive HSTS header
 oxynux.fr: could not connect to host
-p-s-b.com: could not connect to host
 p.linode.com: could not connect to host
 p8r.de: did not receive HSTS header
 pa.search.yahoo.com: did not receive HSTS header
 pacelink.de: could not connect to host
 packlane.com: did not receive HSTS header
 pader-deko.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]
 paestbin.com: could not connect to host
 pagerate.io: did not receive HSTS header
@@ -2732,16 +2739,17 @@ pagetoimage.com: could not connect to ho
 pahae.de: did not receive HSTS header
 paisaone.com: did not receive HSTS header
 paku.me: could not connect to host
 pamsoft.pl: max-age too low: 0
 panaceallc.net: could not connect to host
 pantsu.cat: did not receive HSTS header
 papeda.net: did not receive HSTS header
 papercard.co.uk: did not receive HSTS header
+paperwork.co.za: could not connect to host
 papierniak.net: could not connect to host
 papygeek.com: could not connect to host
 parent5446.us: could not connect to host
 parentmail.co.uk: did not receive HSTS header
 parodybit.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]
 parpaing-paillette.net: could not connect to host
 particonpsplus.it: could not connect to host
 partijtjevoordevrijheid.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]
@@ -2804,31 +2812,32 @@ petrolplus.ru: did not receive HSTS head
 petsittersservices.com: could not connect to host
 pettsy.com: could not connect to host
 pewboards.com: could not connect to host
 pgpm.io: could not connect to host
 pharmgkb.org: could not connect to host
 philpropertygroup.com: could not connect to host
 phonenumberinfo.co.uk: could not connect to host
 phongmay24h.com: could not connect to host
+photoancestry.com: did not receive HSTS header
 phpfashion.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]
 phurl.de: could not connect to host
 picallo.es: could not connect to host
 pickr.co: could not connect to host
 picotronic.biz: could not connect to host
 picscare.co.uk: did not receive HSTS header
 pieperhome.de: could not connect to host
 pijuice.com: could not connect to host
 piligrimname.com: could not connect to host
 pillowandpepper.com: did not receive HSTS header
 pinesandneedles.com: did not receive HSTS header
 pippen.io: could not connect to host
 piratedb.com: could not connect to host
 piratedot.com: could not connect to host
-piratelist.online: could not connect to host
+piratelist.online: did not receive HSTS header
 piratenlogin.de: could not connect to host
 pirati.cz: max-age too low: 604800
 pirlitu.com: did not receive HSTS header
 pisexy.me: did not receive HSTS header
 pisidia.de: could not connect to host
 pittonpreschool.com: did not receive HSTS header
 piwko.co: could not connect to host
 pixel.google.com: did not receive HSTS header (error ignored - included regardless)
@@ -2844,17 +2853,17 @@ plaettliaktion.ch: did not receive HSTS 
 platform.lookout.com: could not connect to host
 play.google.com: did not receive HSTS header (error ignored - included regardless)
 playkh.com: did not receive HSTS header
 playmaker.io: could not connect to host
 playnation.io: did not receive HSTS header
 pleier-it.de: did not receive HSTS header
 pleier.it: did not receive HSTS header
 plhdb.org: did not receive HSTS header
-plixer.com: could not connect to host
+plixer.com: did not receive HSTS header
 plogable.co: could not connect to host
 plothost.com: did not receive HSTS header
 ploup.net: could not connect to host
 pmnts.io: could not connect to host
 po.gl: did not receive HSTS header
 poiema.com.sg: did not receive HSTS header
 pol.in.th: could not connect to host
 pole.net.nz: could not connect to host
@@ -2869,35 +2878,36 @@ pontokay.com.br: did not receive HSTS he
 pontualcomp.com: max-age too low: 2592000
 poolsandstuff.com: did not receive HSTS header
 poon.tech: could not connect to host
 portalplatform.net: did not receive HSTS header
 postcodewise.co.uk: did not receive HSTS header
 posterspy.com: did not receive HSTS header
 postscheduler.org: could not connect to host
 posylka.de: did not receive HSTS header
-potatofrom.space: could not connect to host
 poussinooz.fr: could not connect to host
 povitria.net: could not connect to host
 power-of-interest.com: did not receive HSTS header
 power99press.com: did not receive HSTS header
 powerplannerapp.com: did not receive HSTS header
 powerxequality.com: could not connect to host
 ppr-truby.ru: could not connect to host
 ppy3.com: did not receive HSTS header
 pr.search.yahoo.com: did not receive HSTS header
 prattpokemon.com: could not connect to host
 prefontaine.name: could not connect to host
 prego-shop.de: did not receive HSTS header
 preissler.co.uk: could not connect to host
 prelist.org: did not receive HSTS header
 pressfreedomfoundation.org: did not receive HSTS header
+pretzlaff.info: could not connect to host
 preworkout.me: could not connect to host
 prezola.com: did not receive HSTS header
 princesparktouch.com: could not connect to host
+printexpress.cloud: did not receive HSTS header
 printfn.com: could not connect to host
 priolkar.com: did not receive HSTS header
 priva.si: could not connect to host
 privacylabs.io: did not receive HSTS header
 privacyrup.net: could not connect to host
 privatestatic.com: could not connect to host
 prnt.li: did not receive HSTS header
 pro-zone.com: could not connect to host
@@ -2914,27 +2924,27 @@ prontomovers.co.uk: could not connect to
 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
 proxybay.club: could not connect to host
 proxybay.info: did not receive HSTS header
-prxio.site: could not connect to host
+prxio.date: could not connect to host
+prxio.site: did not receive HSTS header
 prytkov.com: did not receive HSTS header
 psw.academy: did not receive HSTS header
 psw.consulting: did not receive HSTS header
 ptn.moscow: could not connect to host
 pubkey.is: could not connect to host
 puhe.se: 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
-pupboss.com: could not connect to host
 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
 pwdgen.net: could not connect to host
 pwnies.dk: could not connect to host
 py.search.yahoo.com: did not receive HSTS header
@@ -2989,33 +2999,32 @@ rcafox.com: could not connect to host
 rcpcbd.com: did not receive HSTS header
 rdns.im: did not receive HSTS header
 re-customer.net: could not connect to host
 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: 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
 rede.ca: did not receive HSTS header
 redicabo.de: could not connect to host
 redirectman.com: did not receive HSTS header
 redlatam.org: did not receive HSTS header
 redmbk.com: did not receive HSTS header
 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
 rejo.in: could not connect to host
 rejuvemedspa.com: did not receive HSTS header
-relayawards.com: did not receive HSTS header
 relisten.nl: did not receive HSTS header
 rem.pe: could not connect to host
 remitatm.com: could not connect to host
 remodela.com.ve: could not connect to host
 renem.net: did not receive HSTS header
 renkhosting.com: did not receive HSTS header
 renlong.org: could not connect to host
 renrenss.com: did not receive HSTS header
@@ -3041,42 +3050,43 @@ rewardstock.com: max-age too low: 0
 rgavmf.ru: did not receive HSTS header
 rhapsodhy.hu: could not connect to host
 rhdigital.pro: could not connect to host
 rhodri.io: could not connect to host
 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
+riesenweber.id.au: did not receive HSTS header
 right2.org: 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
 rk6.cz: could not connect to host
 rkmantpur.org: did not receive HSTS header
 rme.li: did not receive HSTS header
 roan24.pl: did not receive HSTS header
 robertglastra.com: could not connect to host
 robigalia.org: did not receive HSTS header
-robohash.org: could not connect to host
 robtex.com: did not receive HSTS header
 robtex.net: did not receive HSTS header
 robtex.org: did not receive HSTS header
 rochman.id: could not connect to host
 rocksberg.net: did not receive HSTS header
 roddis.net: did not receive HSTS header
 rodney.id.au: did not receive HSTS header
 rodosto.com: did not receive HSTS header
 roeper.party: could not connect to host
 roesemann.email: could not connect to host
+roessner-network-solutions.com: could not connect to host
 rohlik.cz: could not connect to host
 rolemaster.net: could not connect to host
 romans-place.me.uk: did not receive HSTS header
 ronvandordt.info: could not connect to host
 ronwo.de: max-age too low: 1
 room-checkin24.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]
 rootforum.org: did not receive HSTS header
 rootservice.org: did not receive HSTS header
@@ -3180,31 +3190,31 @@ scriptict.nl: could not connect to host
 scriptjunkie.us: could not connect to host
 sdmoscow.ru: could not connect to host
 sdrobs.com: could not connect to host
 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
-secondpay.nl: did not receive HSTS header
 secpatrol.de: 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
 secure.link: did not receive HSTS header
 secureradio.net: could not connect to host
 security-carpet.com: could not connect to host
 security.google.com: did not receive HSTS header (error ignored - included regardless)
 securitybsides.pl: did not receive HSTS header
 securityinet.biz: did not receive HSTS header
 securityinet.net: did not receive HSTS header
 securityinet.org.il: did not receive HSTS header
 securitysoapbox.com: could not connect to host
 securiviera.ch: did not receive HSTS header
+sedrubal.de: could not connect to host
 seedbox.fr: did not receive HSTS header
 seele.ca: could not connect to host
 segulink.com: 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
 selfcarecentral.com: did not receive HSTS header
@@ -3268,32 +3278,32 @@ shukatsu-note.com: could not connect to 
 shv25.se: could not connect to host
 shwongacc.com: could not connect to host
 siammedia.co: could not connect to host
 siddhant.me: could not connect to host
 sifls.com: could not connect to host
 silentcircle.org: could not connect to host
 silicagelpackets.ca: did not receive HSTS header
 silver-drachenkrieger.de: did not receive HSTS header
-silverhome.ninja: could not connect to host
 silverpvp.com: could not connect to host
 silverwind.io: did not receive HSTS header
 simbast.com: could not connect to host
 simbolo.co.uk: could not connect to host
 simod.org: could not connect to host
 simon.butcher.name: max-age too low: 2629743
 simongong.net: did not receive HSTS header
 simonkjellberg.se: could not connect to host
 simplefraud.com: could not connect to host
 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
+sitennisclub.com: did not receive HSTS header
 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
@@ -3335,17 +3345,17 @@ sng.my: could not connect to host
 snille.com: 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: 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
 sogeek.me: did not receive HSTS header
 solidfuelappliancespares.co.uk: did not receive HSTS header
 solinter.com.br: did not receive HSTS header
@@ -3461,28 +3471,29 @@ studentrightsadvocate.org: could not con
 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
 subbing.work: could not connect to host
 subdimension.org: could not connect to host
+subeesu.com: could not connect to host
 subrosa.io: could not connect to host
 subtitle.rip: could not connect to host
 sudo.li: did not receive HSTS header
 suian.or.jp: max-age too low: 86400
 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
 sunnyfruit.ru: did not receive HSTS header
 sunshinepress.org: could not connect to host
+sunyanzi.tk: could not connect to host
 superbabysitting.ch: could not connect to host
 superbike.tw: 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
 supersecurefancydomain.com: could not connect to host
 superwally.org: could not connect to host
 suprlink.net: could not connect to host
@@ -3503,17 +3514,16 @@ sxbk.pw: could not connect to host
 syam.cc: could not connect to host
 sydgrabber.tk: could not connect to host
 sylvangarden.org: 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
-synfin.org: could not connect to host
 syno.gq: could not connect to host
 syntheticmotoroil.org: did not receive HSTS header
 syso.name: could not connect to host
 szaszm.tk: max-age too low: 0
 t-tz.com: could not connect to host
 t.facebook.com: did not receive HSTS header
 taabe.xyz: did not receive HSTS header
 tablet.facebook.com: did not receive HSTS header
@@ -3551,27 +3561,27 @@ tcao.info: could not connect to host
 tcby45.xyz: 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
 tcp.expert: did not receive HSTS header
 teachforcanada.ca: did not receive HSTS header
 team-pancake.eu: could not connect to host
 teamsocial.co: did not receive HSTS header
-teamx-gaming.de: could not connect to host
 teamzeus.cz: could not connect to host
 techassist.io: did not receive HSTS header
 techhipster.net: 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
 techvalue.gr: did not receive HSTS header
+tedovo.com: could not connect to host
 tegelsensanitaironline.nl: did not receive HSTS header
 tekshrek.com: did not receive HSTS header
 telefonnummer.online: could not connect to host
 telefoonnummerinfo.nl: could not connect to host
 temehu.com: did not receive HSTS header
 tempcraft.net: could not connect to host
 tendertool.nl: could not connect to host
 tenni.xyz: could not connect to host
@@ -3587,16 +3597,17 @@ textoplano.xyz: could not connect to hos
 textracer.dk: could not connect to host
 tezcam.tk: could not connect to host
 tf2stadium.com: did not receive HSTS header
 tfcoms-sp-tracker-client.azurewebsites.net: could not connect to host
 tfl.lu: did not receive HSTS header
 tgr.re: could not connect to host
 th-bl.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]
 thai.land: could not connect to host
+thaianthro.com: did not receive HSTS header
 the-construct.com: 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
 thecharlestonwaldorf.com: could not connect to host
 theclementinebutchers.com: could not connect to host
 thecoffeehouse.xyz: could not connect to host
@@ -3676,16 +3687,17 @@ tobiasmathes.com: could not connect to h
 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
 tom.horse: did not receive HSTS header
 tomberek.info: could not connect to host
+tomcort.com: could not connect to host
 tomeara.net: could not connect to host
 tomharling.co.uk: max-age too low: 86400
 tomharling.uk: max-age too low: 86400
 tomlankhorst.nl: did not receive HSTS header
 tommsy.com: did not receive HSTS header
 tonburi.jp: [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]
 tonyfantjr.com: could not connect to host
 toomanypillows.com: could not connect to host
@@ -3708,17 +3720,16 @@ tracktivity.com.au: did not receive HSTS
 tradingcentre.com.au: did not receive HSTS header
 tradinghope.com: could not connect to host
 traeningsprojekt.dk: did not receive HSTS header
 traindb.nl: could not connect to host
 translate.googleapis.com: did not receive HSTS header (error ignored - included regardless)
 transportal.sk: did not receive HSTS header
 treeby.net: could not connect to host
 trendberry.ru: could not connect to host
-trik.es: [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]
 trinityaffirmations.com: max-age too low: 0
 trinitycore.org: max-age too low: 2592000
 tripdelta.com: did not receive HSTS header
 trixies-wish.nz: could not connect to host
 trollme.me: could not connect to host
 trondelan.no: did not receive HSTS header
 trusitio.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]
 trustmeimfancy.com: could not connect to host
@@ -3761,16 +3772,17 @@ tzappa.net: could not connect to host
 u-blox.com: max-age too low: 0
 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: max-age too low: 0
+uhm.io: 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
@@ -3875,17 +3887,16 @@ vissanum.com: did not receive HSTS heade
 vistarait.com: did not receive HSTS header
 vitalorange.com: did not receive HSTS header
 viva-french.com: did not receive HSTS header
 vlastimilburian.cz: did not receive HSTS header
 vlora.city: could not connect to host
 vm0.eu: did not receive HSTS header
 vmrdev.com: could not connect to host
 voceinveste.com: did not receive HSTS header
-vogler.name: could not connect to host
 voicesuk.co.uk: did not receive HSTS header
 volcrado.com: could not connect to host
 voliere-info.nl: did not receive HSTS header
 vortexhobbies.com: did not receive HSTS header
 votocek.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]
 votockova.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]
 vox.vg: did not receive HSTS header
 vpl.me: did not receive HSTS header
@@ -3917,17 +3928,16 @@ watchium.com: did not receive HSTS heade
 watsonhall.uk: could not connect to host
 wave.is: could not connect to host
 wavefrontsystemstech.com: could not connect to host
 wayne.cloud: did not receive HSTS header
 wealthfactory.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]
 wear2work.nl: did not receive HSTS header
 wearandcare.net: could not connect to host
 weaverhairextensions.nl: could not connect to host
-web-vision.de: could not connect to host
 web4all.fr: max-age too low: 0
 web4pro.fr: max-age too low: 0
 webandwords.com.au: could not connect to host
 webapps.directory: could not connect to host
 webassadors.com: could not connect to host
 webdesign-kronberg.de: did not receive HSTS header
 webdev.mobi: could not connect to host
 weberjulia.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]
@@ -4100,16 +4110,17 @@ xuri.me: max-age too low: 2592000
 xuyh0120.win: did not receive HSTS header
 xxbase.com: could not connect to host
 xyndrac.net: did not receive HSTS header
 y-o-w.com: did not receive HSTS header
 yabrt.cn: could not connect to host
 yamaken.jp: did not receive HSTS header
 yamamo10.com: could not connect to host
 yanaduday.com: could not connect to host
+yanwh.xyz: could not connect to host
 yaporn.tv: did not receive HSTS header
 yard-fu.com: could not connect to host
 yasinaydin.net: max-age too low: 2592000
 yaucy.win: did not receive HSTS header
 ydy.jp: could not connect to host
 yello.website: could not connect to host
 yellowcar.website: could not connect to host
 yenniferallulli.de: could not connect to host
@@ -4128,17 +4139,16 @@ yoloboatrentals.com: did not receive HST
 yoloprod.fr: could not connect to host
 yoloseo.com: could not connect to host
 yoramvandevelde.net: could not connect to host
 yorname.ml: could not connect to host
 youcontrol.ru: could not connect to host
 youngandunited.nl: did not receive HSTS header
 yourstrongbox.com: could not connect to host
 yout.com: max-age too low: 60000
-ypid.de: could not connect to host
 ytec.ca: [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]
 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
@@ -4149,33 +4159,33 @@ z33.ch: did not receive HSTS header
 z3liff.com: could not connect to host
 z3liff.net: could not connect to host
 za.search.yahoo.com: did not receive HSTS header
 zachgibbens.org: could not connect to host
 zadieheimlich.com: did not receive HSTS header
 zamorano.edu: could not connect to host
 zap.yt: could not connect to host
 zarooba.com: did not receive HSTS header
-zberger.com: could not connect to host
 zbigniewgalucki.eu: did not receive HSTS header
 zbp.at: did not receive HSTS header
 zebrababy.cn: did not receive HSTS header
 zeedroom.be: did not receive HSTS header
 zefiris.org: did not receive HSTS header
 zefu.ca: could not connect to host
 zeitpunkt-kulturmagazin.de: did not receive HSTS header
 zelezny.uk: did not receive HSTS header
 zelfstandigemakelaars.net: did not receive HSTS header
 zenpayroll.com: did not receive HSTS header
 zentraler-kreditausschuss.de: did not receive HSTS header
 zentralwolke.de: did not receive HSTS header
 zera.com.au: could not connect to host
 zett4.me: could not connect to host
 zeytin.pro: could not connect to host
 zh.search.yahoo.com: did not receive HSTS header
+zhaochen.xyz: could not connect to host
 zhaojin97.cn: did not receive HSTS header
 zhendingresources.com: max-age too low: 0
 zicklam.com: could not connect to host
 zigcore.com.br: could not connect to host
 zirtue.io: could not connect to host
 ziyuanabc.xyz: could not connect to host
 zking.ga: could not connect to host
 zlc1994.com: 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(1493303842959000);
+const PRTime gPreloadListExpirationTime = INT64_C(1493389566380000);
 
 static const char kSTSHostTable[] = {
   /* "0.me.uk", true */ '0', '.', 'm', 'e', '.', 'u', 'k', '\0',
   /* "007-preisvergleich.de", true */ '0', '0', '7', '-', 'p', 'r', 'e', 'i', 's', 'v', 'e', 'r', 'g', 'l', 'e', 'i', 'c', 'h', '.', 'd', 'e', '\0',
   /* "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',
@@ -191,17 +191,16 @@ static const char kSTSHostTable[] = {
   /* "700.az", true */ '7', '0', '0', '.', 'a', 'z', '\0',
   /* "7183.org", true */ '7', '1', '8', '3', '.', 'o', 'r', 'g', '\0',
   /* "777coin.com", true */ '7', '7', '7', 'c', 'o', 'i', 'n', '.', 'c', 'o', 'm', '\0',
   /* "7sons.de", true */ '7', 's', 'o', 'n', 's', '.', 'd', 'e', '\0',
   /* "7thcircledesigns.com", true */ '7', 't', 'h', 'c', 'i', 'r', 'c', 'l', 'e', 'd', 'e', 's', 'i', 'g', 'n', 's', '.', 'c', 'o', 'm', '\0',
   /* "7thheavenrestaurant.com", true */ '7', 't', 'h', 'h', 'e', 'a', 'v', 'e', 'n', 'r', 'e', 's', 't', 'a', 'u', 'r', 'a', 'n', 't', '.', 'c', 'o', 'm', '\0',
   /* "7x24servis.com", true */ '7', 'x', '2', '4', 's', 'e', 'r', 'v', 'i', 's', '.', 'c', 'o', 'm', '\0',
   /* "86metro.ru", true */ '8', '6', 'm', 'e', 't', 'r', 'o', '.', 'r', 'u', '\0',
-  /* "88.to", true */ '8', '8', '.', 't', 'o', '\0',
   /* "888azino.com", true */ '8', '8', '8', 'a', 'z', 'i', 'n', 'o', '.', 'c', 'o', 'm', '\0',
   /* "888sport.dk", true */ '8', '8', '8', 's', 'p', 'o', 'r', 't', '.', 'd', 'k', '\0',
   /* "888sport.it", true */ '8', '8', '8', 's', 'p', 'o', 'r', 't', '.', 'i', 't', '\0',
   /* "8mpay.com", true */ '8', 'm', 'p', 'a', 'y', '.', 'c', 'o', 'm', '\0',
   /* "8pecxstudios.com", true */ '8', 'p', 'e', 'c', 'x', 's', 't', 'u', 'd', 'i', 'o', 's', '.', 'c', 'o', 'm', '\0',
   /* "8t8.eu", true */ '8', 't', '8', '.', 'e', 'u', '\0',
   /* "8t88.biz", true */ '8', 't', '8', '8', '.', 'b', 'i', 'z', '\0',
   /* "8thportsmouth.org.uk", true */ '8', 't', 'h', 'p', 'o', 'r', 't', 's', 'm', 'o', 'u', 't', 'h', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0',
@@ -241,17 +240,16 @@ static const char kSTSHostTable[] = {
   /* "abilma.com", true */ 'a', 'b', 'i', 'l', 'm', 'a', '.', 'c', 'o', 'm', '\0',
   /* "abilymp06.net", true */ 'a', 'b', 'i', 'l', 'y', 'm', 'p', '0', '6', '.', 'n', 'e', 't', '\0',
   /* "abiturma.de", true */ 'a', 'b', 'i', 't', 'u', 'r', 'm', 'a', '.', 'd', 'e', '\0',
   /* "ablak-nyilaszaro.info", true */ 'a', 'b', 'l', 'a', 'k', '-', 'n', 'y', 'i', 'l', 'a', 's', 'z', 'a', 'r', 'o', '.', 'i', 'n', 'f', 'o', '\0',
   /* "ablogagency.net", true */ 'a', 'b', 'l', 'o', 'g', 'a', 'g', 'e', 'n', 'c', 'y', '.', 'n', 'e', 't', '\0',
   /* "abloop.com", true */ 'a', 'b', 'l', 'o', 'o', 'p', '.', 'c', 'o', 'm', '\0',
   /* "abmahnhelfer.de", false */ 'a', 'b', 'm', 'a', 'h', 'n', 'h', 'e', 'l', 'f', 'e', 'r', '.', 'd', 'e', '\0',
   /* "abmgood.com", false */ 'a', 'b', 'm', 'g', 'o', 'o', 'd', '.', 'c', 'o', 'm', '\0',
-  /* "abnarnro.com", true */ 'a', 'b', 'n', 'a', 'r', 'n', 'r', 'o', '.', 'c', 'o', 'm', '\0',
   /* "abnerchou.me", true */ 'a', 'b', 'n', 'e', 'r', 'c', 'h', 'o', 'u', '.', 'm', 'e', '\0',
   /* "abolitionism.com", true */ 'a', 'b', 'o', 'l', 'i', 't', 'i', 'o', 'n', 'i', 's', 'm', '.', 'c', 'o', 'm', '\0',
   /* "abolitionist-society.com", true */ 'a', 'b', 'o', 'l', 'i', 't', 'i', 'o', 'n', 'i', 's', 't', '-', 's', 'o', 'c', 'i', 'e', 't', 'y', '.', 'c', 'o', 'm', '\0',
   /* "abou.to", false */ 'a', 'b', 'o', 'u', '.', 't', 'o', '\0',
   /* "aboutassistedliving.org", true */ 'a', 'b', 'o', 'u', 't', 'a', 's', 's', 'i', 's', 't', 'e', 'd', 'l', 'i', 'v', 'i', 'n', 'g', '.', 'o', 'r', 'g', '\0',
   /* "abrilect.com", true */ 'a', 'b', 'r', 'i', 'l', 'e', 'c', 't', '.', 'c', 'o', 'm', '\0',
   /* "abseits.org", true */ 'a', 'b', 's', 'e', 'i', 't', 's', '.', 'o', 'r', 'g', '\0',
   /* "absolem.cc", true */ 'a', 'b', 's', 'o', 'l', 'e', 'm', '.', 'c', 'c', '\0',
@@ -586,16 +584,17 @@ static const char kSTSHostTable[] = {
   /* "amagical.net", true */ 'a', 'm', 'a', 'g', 'i', 'c', 'a', 'l', '.', 'n', 'e', 't', '\0',
   /* "amani-kinderdorf.de", true */ 'a', 'm', 'a', 'n', 'i', '-', 'k', 'i', 'n', 'd', 'e', 'r', 'd', 'o', 'r', 'f', '.', 'd', 'e', '\0',
   /* "amateri.com", true */ 'a', 'm', 'a', 't', 'e', 'r', 'i', '.', 'c', 'o', 'm', '\0',
   /* "amavis.org", true */ 'a', 'm', 'a', 'v', 'i', 's', '.', 'o', 'r', 'g', '\0',
   /* "amazing-gaming.fr", true */ 'a', 'm', 'a', 'z', 'i', 'n', 'g', '-', 'g', 'a', 'm', 'i', 'n', 'g', '.', 'f', 'r', '\0',
   /* "ambiente.one", true */ 'a', 'm', 'b', 'i', 'e', 'n', 't', 'e', '.', 'o', 'n', 'e', '\0',
   /* "ambiq.nl", true */ 'a', 'm', 'b', 'i', 'q', '.', 'n', 'l', '\0',
   /* "amcvega.com", true */ 'a', 'm', 'c', 'v', 'e', 'g', 'a', '.', 'c', 'o', 'm', '\0',
+  /* "amdouglas.com", true */ 'a', 'm', 'd', 'o', 'u', 'g', 'l', 'a', 's', '.', 'c', 'o', 'm', '\0',
   /* "amdouglas.uk", true */ 'a', 'm', 'd', 'o', 'u', 'g', 'l', 'a', 's', '.', 'u', 'k', '\0',
   /* "ameego.com", true */ 'a', 'm', 'e', 'e', 'g', 'o', '.', 'c', 'o', 'm', '\0',
   /* "ameego.it", true */ 'a', 'm', 'e', 'e', 'g', 'o', '.', 'i', 't', '\0',
   /* "ameego.net", true */ 'a', 'm', 'e', 'e', 'g', 'o', '.', 'n', 'e', 't', '\0',
   /* "ameego.nl", true */ 'a', 'm', 'e', 'e', 'g', 'o', '.', 'n', 'l', '\0',
   /* "ameego.org", true */ 'a', 'm', 'e', 'e', 'g', 'o', '.', 'o', 'r', 'g', '\0',
   /* "amees.me", true */ 'a', 'm', 'e', 'e', 's', '.', 'm', 'e', '\0',
   /* "ameho.me", true */ 'a', 'm', 'e', 'h', 'o', '.', 'm', 'e', '\0',
@@ -710,30 +709,30 @@ static const char kSTSHostTable[] = {
   /* "anstoncs.com.au", true */ 'a', 'n', 's', 't', 'o', 'n', 'c', 's', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
   /* "antarcti.co", true */ 'a', 'n', 't', 'a', 'r', 'c', 't', 'i', '.', 'c', 'o', '\0',
   /* "anthonyavon.com", true */ 'a', 'n', 't', 'h', 'o', 'n', 'y', 'a', 'v', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "anthonygaidot.fr", true */ 'a', 'n', 't', 'h', 'o', 'n', 'y', 'g', 'a', 'i', 'd', 'o', 't', '.', 'f', 'r', '\0',
   /* "anthropoid.ca", true */ 'a', 'n', 't', 'h', 'r', 'o', 'p', 'o', 'i', 'd', '.', 'c', 'a', '\0',
   /* "antiled.by", true */ 'a', 'n', 't', 'i', 'l', 'e', 'd', '.', 'b', 'y', '\0',
   /* "antipolygraph.org", true */ 'a', 'n', 't', 'i', 'p', 'o', 'l', 'y', 'g', 'r', 'a', 'p', 'h', '.', 'o', 'r', 'g', '\0',
   /* "antoine-roux.fr", true */ 'a', 'n', 't', 'o', 'i', 'n', 'e', '-', 'r', 'o', 'u', 'x', '.', 'f', 'r', '\0',
-  /* "antoinedeschenes.com", true */ 'a', 'n', 't', 'o', 'i', 'n', 'e', 'd', 'e', 's', 'c', 'h', 'e', 'n', 'e', 's', '.', 'c', 'o', 'm', '\0',
   /* "antonchen.com", true */ 'a', 'n', 't', 'o', 'n', 'c', 'h', 'e', 'n', '.', 'c', 'o', 'm', '\0',
   /* "antonellabb.eu", true */ 'a', 'n', 't', 'o', 'n', 'e', 'l', 'l', 'a', 'b', 'b', '.', 'e', 'u', '\0',
   /* "antons.io", true */ 'a', 'n', 't', 'o', 'n', 's', '.', 'i', 'o', '\0',
   /* "anxietyspace.com", true */ 'a', 'n', 'x', 'i', 'e', 't', 'y', 's', 'p', 'a', 'c', 'e', '.', 'c', 'o', 'm', '\0',
   /* "anyprime.net", true */ 'a', 'n', 'y', 'p', 'r', 'i', 'm', 'e', '.', 'n', 'e', 't', '\0',
   /* "anystack.xyz", true */ 'a', 'n', 'y', 's', 't', 'a', 'c', 'k', '.', 'x', 'y', 'z', '\0',
   /* "anytonetech.com", true */ 'a', 'n', 'y', 't', 'o', 'n', 'e', 't', 'e', 'c', 'h', '.', 'c', 'o', 'm', '\0',
   /* "anyways.at", true */ 'a', 'n', 'y', 'w', 'a', 'y', 's', '.', 'a', 't', '\0',
   /* "anzeiger.ag", true */ 'a', 'n', 'z', 'e', 'i', 'g', 'e', 'r', '.', 'a', 'g', '\0',
   /* "ao-dev.com", true */ 'a', 'o', '-', 'd', 'e', 'v', '.', 'c', 'o', 'm', '\0',
   /* "ao2.it", true */ 'a', 'o', '2', '.', 'i', 't', '\0',
   /* "aojf.fr", true */ 'a', 'o', 'j', 'f', '.', 'f', 'r', '\0',
   /* "aopedeure.nl", true */ 'a', 'o', 'p', 'e', 'd', 'e', 'u', 'r', 'e', '.', 'n', 'l', '\0',
+  /* "aosc.io", false */ 'a', 'o', 's', 'c', '.', 'i', 'o', '\0',
   /* "aosus.org", true */ 'a', 'o', 's', 'u', 's', '.', 'o', 'r', 'g', '\0',
   /* "aovcentrum.nl", true */ 'a', 'o', 'v', 'c', 'e', 'n', 't', 'r', 'u', 'm', '.', 'n', 'l', '\0',
   /* "apachehaus.de", false */ 'a', 'p', 'a', 'c', 'h', 'e', 'h', 'a', 'u', 's', '.', 'd', 'e', '\0',
   /* "apadvantage.com", true */ 'a', 'p', 'a', 'd', 'v', 'a', 'n', 't', 'a', 'g', 'e', '.', 'c', 'o', 'm', '\0',
   /* "aperture-laboratories.science", true */ 'a', 'p', 'e', 'r', 't', 'u', 'r', 'e', '-', 'l', 'a', 'b', 'o', 'r', 'a', 't', 'o', 'r', 'i', 'e', 's', '.', 's', 'c', 'i', 'e', 'n', 'c', 'e', '\0',
   /* "aperturesciencelabs.de", true */ 'a', 'p', 'e', 'r', 't', 'u', 'r', 'e', 's', 'c', 'i', 'e', 'n', 'c', 'e', 'l', 'a', 'b', 's', '.', 'd', 'e', '\0',
   /* "apervita.net", true */ 'a', 'p', 'e', 'r', 'v', 'i', 't', 'a', '.', 'n', 'e', 't', '\0',
   /* "apexitsolutions.ca", true */ 'a', 'p', 'e', 'x', 'i', 't', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '.', 'c', 'a', '\0',
@@ -815,17 +814,16 @@ static const char kSTSHostTable[] = {
   /* "aristocrates.co", true */ 'a', 'r', 'i', 's', 't', 'o', 'c', 'r', 'a', 't', 'e', 's', '.', 'c', 'o', '\0',
   /* "aritec-la.com", true */ 'a', 'r', 'i', 't', 'e', 'c', '-', 'l', 'a', '.', 'c', 'o', 'm', '\0',
   /* "arivo.com.br", false */ 'a', 'r', 'i', 'v', 'o', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0',
   /* "arjandejong.eu", true */ 'a', 'r', 'j', 'a', 'n', 'd', 'e', 'j', 'o', 'n', 'g', '.', 'e', 'u', '\0',
   /* "arksan.com.tr", true */ 'a', 'r', 'k', 's', 'a', 'n', '.', 'c', 'o', 'm', '.', 't', 'r', '\0',
   /* "arlen.io", true */ 'a', 'r', 'l', 'e', 'n', '.', 'i', 'o', '\0',
   /* "arlet.click", true */ 'a', 'r', 'l', 'e', 't', '.', 'c', 'l', 'i', 'c', 'k', '\0',
   /* "armadaquadrat.com", true */ 'a', 'r', 'm', 'a', 'd', 'a', 'q', 'u', 'a', 'd', 'r', 'a', 't', '.', 'c', 'o', 'm', '\0',
-  /* "arminpech.de", true */ 'a', 'r', 'm', 'i', 'n', 'p', 'e', 'c', 'h', '.', 'd', 'e', '\0',
   /* "armor.com", true */ 'a', 'r', 'm', 'o', 'r', '.', 'c', 'o', 'm', '\0',
   /* "armored.ninja", true */ 'a', 'r', 'm', 'o', 'r', 'e', 'd', '.', 'n', 'i', 'n', 'j', 'a', '\0',
   /* "armstrongsengineering.com", true */ 'a', 'r', 'm', 's', 't', 'r', 'o', 'n', 'g', 's', 'e', 'n', 'g', 'i', 'n', 'e', 'e', 'r', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "army24.cz", true */ 'a', 'r', 'm', 'y', '2', '4', '.', 'c', 'z', '\0',
   /* "armyprodej.cz", true */ 'a', 'r', 'm', 'y', 'p', 'r', 'o', 'd', 'e', 'j', '.', 'c', 'z', '\0',
   /* "arnaudfeld.de", true */ 'a', 'r', 'n', 'a', 'u', 'd', 'f', 'e', 'l', 'd', '.', 'd', 'e', '\0',
   /* "arne-petersen.net", true */ 'a', 'r', 'n', 'e', '-', 'p', 'e', 't', 'e', 'r', 's', 'e', 'n', '.', 'n', 'e', 't', '\0',
   /* "arnesolutions.com", true */ 'a', 'r', 'n', 'e', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '.', 'c', 'o', 'm', '\0',
@@ -905,17 +903,16 @@ static const char kSTSHostTable[] = {
   /* "asurepay.cc", true */ 'a', 's', 'u', 'r', 'e', 'p', 'a', 'y', '.', 'c', 'c', '\0',
   /* "at.search.yahoo.com", false */ 'a', 't', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0',
   /* "atc.io", true */ 'a', 't', 'c', '.', 'i', 'o', '\0',
   /* "atchleyjazz.com", true */ 'a', 't', 'c', 'h', 'l', 'e', 'y', 'j', 'a', 'z', 'z', '.', 'c', 'o', 'm', '\0',
   /* "atchleyjazz.org", true */ 'a', 't', 'c', 'h', 'l', 'e', 'y', 'j', 'a', 'z', 'z', '.', 'o', 'r', 'g', '\0',
   /* "atchleylab.org", true */ 'a', 't', 'c', 'h', 'l', 'e', 'y', 'l', 'a', 'b', '.', 'o', 'r', 'g', '\0',
   /* "ateli.com", true */ 'a', 't', 'e', 'l', 'i', '.', 'c', 'o', 'm', '\0',
   /* "atelier-naruby.cz", true */ 'a', 't', 'e', 'l', 'i', 'e', 'r', '-', 'n', 'a', 'r', 'u', 'b', 'y', '.', 'c', 'z', '\0',
-  /* "atelierdesflammesnoires.fr", true */ 'a', 't', 'e', 'l', 'i', 'e', 'r', 'd', 'e', 's', 'f', 'l', 'a', 'm', 'm', 'e', 's', 'n', 'o', 'i', 'r', 'e', 's', '.', 'f', 'r', '\0',
   /* "ateliernaruby.cz", true */ 'a', 't', 'e', 'l', 'i', 'e', 'r', 'n', 'a', 'r', 'u', 'b', 'y', '.', 'c', 'z', '\0',
   /* "atencionbimbo.com", true */ 'a', 't', 'e', 'n', 'c', 'i', 'o', 'n', 'b', 'i', 'm', 'b', 'o', '.', 'c', 'o', 'm', '\0',
   /* "atg.soy", true */ 'a', 't', 'g', '.', 's', 'o', 'y', '\0',
   /* "atgseed.co.uk", true */ 'a', 't', 'g', 's', 'e', 'e', 'd', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "atgseed.uk", true */ 'a', 't', 'g', 's', 'e', 'e', 'd', '.', 'u', 'k', '\0',
   /* "ath0.org", true */ 'a', 't', 'h', '0', '.', 'o', 'r', 'g', '\0',
   /* "athensbusinessresources.us", true */ 'a', 't', 'h', 'e', 'n', 's', 'b', 'u', 's', 'i', 'n', 'e', 's', 's', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '.', 'u', 's', '\0',
   /* "athlin.de", true */ 'a', 't', 'h', 'l', 'i', 'n', '.', 'd', 'e', '\0',
@@ -1023,16 +1020,17 @@ static const char kSTSHostTable[] = {
   /* "azazy.net", true */ 'a', 'z', 'a', 'z', 'y', '.', 'n', 'e', 't', '\0',
   /* "azbuki.by", true */ 'a', 'z', 'b', 'u', 'k', 'i', '.', 'b', 'y', '\0',
   /* "azimut.fr", true */ 'a', 'z', 'i', 'm', 'u', 't', '.', 'f', 'r', '\0',
   /* "azino777.ru", true */ 'a', 'z', 'i', 'n', 'o', '7', '7', '7', '.', 'r', 'u', '\0',
   /* "azirevpn.com", true */ 'a', 'z', 'i', 'r', 'e', 'v', 'p', 'n', '.', 'c', 'o', 'm', '\0',
   /* "azlk-team.ru", true */ 'a', 'z', 'l', 'k', '-', 't', 'e', 'a', 'm', '.', 'r', 'u', '\0',
   /* "azort.com", true */ 'a', 'z', 'o', 'r', 't', '.', 'c', 'o', 'm', '\0',
   /* "aztrix.me", true */ 'a', 'z', 't', 'r', 'i', 'x', '.', 'm', 'e', '\0',
+  /* "azuxul.fr", true */ 'a', 'z', 'u', 'x', 'u', 'l', '.', 'f', 'r', '\0',
   /* "azzag.co.uk", true */ 'a', 'z', 'z', 'a', 'g', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "azzorti.com", false */ 'a', 'z', 'z', 'o', 'r', 't', 'i', '.', 'c', 'o', 'm', '\0',
   /* "b-root-force.de", true */ 'b', '-', 'r', 'o', 'o', 't', '-', 'f', 'o', 'r', 'c', 'e', '.', 'd', 'e', '\0',
   /* "b1c1l1.com", true */ 'b', '1', 'c', '1', 'l', '1', '.', 'c', 'o', 'm', '\0',
   /* "b2and.com", false */ 'b', '2', 'a', 'n', 'd', '.', 'c', 'o', 'm', '\0',
   /* "b303.me", true */ 'b', '3', '0', '3', '.', 'm', 'e', '\0',
   /* "b64.club", true */ 'b', '6', '4', '.', 'c', 'l', 'u', 'b', '\0',
   /* "baalsworld.de", true */ 'b', 'a', 'a', 'l', 's', 'w', 'o', 'r', 'l', 'd', '.', 'd', 'e', '\0',
@@ -1138,17 +1136,16 @@ static const char kSTSHostTable[] = {
   /* "baskettemple.com", true */ 'b', 'a', 's', 'k', 'e', 't', 't', 'e', 'm', 'p', 'l', 'e', '.', 'c', 'o', 'm', '\0',
   /* "basnoslovno.com.ua", true */ 'b', 'a', 's', 'n', 'o', 's', 'l', 'o', 'v', 'n', 'o', '.', 'c', 'o', 'm', '.', 'u', 'a', '\0',
   /* "basnoslovno.ru", true */ 'b', 'a', 's', 'n', 'o', 's', 'l', 'o', 'v', 'n', 'o', '.', 'r', 'u', '\0',
   /* "bastianstalder.ch", true */ 'b', 'a', 's', 't', 'i', 'a', 'n', 's', 't', 'a', 'l', 'd', 'e', 'r', '.', 'c', 'h', '\0',
   /* "basyspro.net", true */ 'b', 'a', 's', 'y', 's', 'p', 'r', 'o', '.', 'n', 'e', 't', '\0',
   /* "batfoundry.com", true */ 'b', 'a', 't', 'f', 'o', 'u', 'n', 'd', 'r', 'y', '.', 'c', 'o', 'm', '\0',
   /* "batschu.de", true */ 'b', 'a', 't', 's', 'c', 'h', 'u', '.', 'd', 'e', '\0',
   /* "batten.eu.org", true */ 'b', 'a', 't', 't', 'e', 'n', '.', 'e', 'u', '.', 'o', 'r', 'g', '\0',
-  /* "baud.ninja", true */ 'b', 'a', 'u', 'd', '.', 'n', 'i', 'n', 'j', 'a', '\0',
   /* "baum.ga", true */ 'b', 'a', 'u', 'm', '.', 'g', 'a', '\0',
   /* "bausep.de", true */ 'b', 'a', 'u', 's', 'e', 'p', '.', 'd', 'e', '\0',
   /* "bautied.de", true */ 'b', 'a', 'u', 't', 'i', 'e', 'd', '.', 'd', 'e', '\0',
   /* "bayden.com", true */ 'b', 'a', 'y', 'd', 'e', 'n', '.', 'c', 'o', 'm', '\0',
   /* "bayrisch-fuer-anfaenger.de", true */ 'b', 'a', 'y', 'r', 'i', 's', 'c', 'h', '-', 'f', 'u', 'e', 'r', '-', 'a', 'n', 'f', 'a', 'e', 'n', 'g', 'e', 'r', '.', 'd', 'e', '\0',
   /* "baysse.eu", true */ 'b', 'a', 'y', 's', 's', 'e', '.', 'e', 'u', '\0',
   /* "baywatch.io", true */ 'b', 'a', 'y', 'w', 'a', 't', 'c', 'h', '.', 'i', 'o', '\0',
   /* "bazdell.com", true */ 'b', 'a', 'z', 'd', 'e', 'l', 'l', '.', 'c', 'o', 'm', '\0',
@@ -1246,17 +1243,16 @@ static const char kSTSHostTable[] = {
   /* "benohead.com", true */ 'b', 'e', 'n', 'o', 'h', 'e', 'a', 'd', '.', 'c', 'o', 'm', '\0',
   /* "benschnarr.com", true */ 'b', 'e', 'n', 's', 'c', 'h', 'n', 'a', 'r', 'r', '.', 'c', 'o', 'm', '\0',
   /* "bentertain.de", true */ 'b', 'e', 'n', 't', 'e', 'r', 't', 'a', 'i', 'n', '.', 'd', 'e', '\0',
   /* "bentley.link", true */ 'b', 'e', 'n', 't', 'l', 'e', 'y', '.', 'l', 'i', 'n', 'k', '\0',
   /* "bentrask.com", true */ 'b', 'e', 'n', 't', 'r', 'a', 's', 'k', '.', 'c', 'o', 'm', '\0',
   /* "benzou-space.com", true */ 'b', 'e', 'n', 'z', 'o', 'u', '-', 's', 'p', 'a', 'c', 'e', '.', 'c', 'o', 'm', '\0',
   /* "beourvictim.com", true */ 'b', 'e', 'o', 'u', 'r', 'v', 'i', 'c', 't', 'i', 'm', '.', 'c', 'o', 'm', '\0',
   /* "beranovi.com", true */ 'b', 'e', 'r', 'a', 'n', 'o', 'v', 'i', '.', 'c', 'o', 'm', '\0',
-  /* "berasavocate.com", true */ 'b', 'e', 'r', 'a', 's', 'a', 'v', 'o', 'c', 'a', 't', 'e', '.', 'c', 'o', 'm', '\0',
   /* "berger.work", true */ 'b', 'e', 'r', 'g', 'e', 'r', '.', 'w', 'o', 'r', 'k', '\0',
   /* "bergstoneware.com", true */ 'b', 'e', 'r', 'g', 's', 't', 'o', 'n', 'e', 'w', 'a', 'r', 'e', '.', 'c', 'o', 'm', '\0',
   /* "berlatih.com", true */ 'b', 'e', 'r', 'l', 'a', 't', 'i', 'h', '.', 'c', 'o', 'm', '\0',
   /* "berlin-kohlefrei.de", true */ 'b', 'e', 'r', 'l', 'i', 'n', '-', 'k', 'o', 'h', 'l', 'e', 'f', 'r', 'e', 'i', '.', 'd', 'e', '\0',
   /* "berlinleaks.com", true */ 'b', 'e', 'r', 'l', 'i', 'n', 'l', 'e', 'a', 'k', 's', '.', 'c', 'o', 'm', '\0',
   /* "bermeitinger.eu", true */ 'b', 'e', 'r', 'm', 'e', 'i', 't', 'i', 'n', 'g', 'e', 'r', '.', 'e', 'u', '\0',
   /* "berna.fr", true */ 'b', 'e', 'r', 'n', 'a', '.', 'f', 'r', '\0',
   /* "berra.se", true */ 'b', 'e', 'r', 'r', 'a', '.', 's', 'e', '\0',
@@ -1373,16 +1369,17 @@ static const char kSTSHostTable[] = {
   /* "binimo.com", true */ 'b', 'i', 'n', 'i', 'm', 'o', '.', 'c', 'o', 'm', '\0',
   /* "biocrafting.net", true */ 'b', 'i', 'o', 'c', 'r', 'a', 'f', 't', 'i', 'n', 'g', '.', 'n', 'e', 't', '\0',
   /* "biodieseldata.com", true */ 'b', 'i', 'o', 'd', 'i', 'e', 's', 'e', 'l', 'd', 'a', 't', 'a', '.', 'c', 'o', 'm', '\0',
   /* "bioemsan.cz", true */ 'b', 'i', 'o', 'e', 'm', 's', 'a', 'n', '.', 'c', 'z', '\0',
   /* "biogeniq.ca", true */ 'b', 'i', 'o', 'g', 'e', 'n', 'i', 'q', '.', 'c', 'a', '\0',
   /* "bioknowme.com", true */ 'b', 'i', 'o', 'k', 'n', 'o', 'w', 'm', 'e', '.', 'c', 'o', 'm', '\0',
   /* "biolindo.com", false */ 'b', 'i', 'o', 'l', 'i', 'n', 'd', 'o', '.', 'c', 'o', 'm', '\0',
   /* "biosbits.org", true */ 'b', 'i', 'o', 's', 'b', 'i', 't', 's', '.', 'o', 'r', 'g', '\0',
+  /* "bioshome.de", true */ 'b', 'i', 'o', 's', 'h', 'o', 'm', 'e', '.', 'd', 'e', '\0',
   /* "biosignalanalytics.com", true */ 'b', 'i', 'o', 's', 'i', 'g', 'n', 'a', 'l', 'a', 'n', 'a', 'l', 'y', 't', 'i', 'c', 's', '.', 'c', 'o', 'm', '\0',
   /* "biosphere.cc", true */ 'b', 'i', 'o', 's', 'p', 'h', 'e', 'r', 'e', '.', 'c', 'c', '\0',
   /* "biou.me", true */ 'b', 'i', 'o', 'u', '.', 'm', 'e', '\0',
   /* "bip.gov.sa", false */ 'b', 'i', 'p', '.', 'g', 'o', 'v', '.', 's', 'a', '\0',
   /* "birdfeeder.online", true */ 'b', 'i', 'r', 'd', 'f', 'e', 'e', 'd', 'e', 'r', '.', 'o', 'n', 'l', 'i', 'n', 'e', '\0',
   /* "birkhoff.me", true */ 'b', 'i', 'r', 'k', 'h', 'o', 'f', 'f', '.', 'm', 'e', '\0',
   /* "birminghamsunset.com", true */ 'b', 'i', 'r', 'm', 'i', 'n', 'g', 'h', 'a', 'm', 's', 'u', 'n', 's', 'e', 't', '.', 'c', 'o', 'm', '\0',
   /* "birzan.org", true */ 'b', 'i', 'r', 'z', 'a', 'n', '.', 'o', 'r', 'g', '\0',
@@ -1426,16 +1423,18 @@ static const char kSTSHostTable[] = {
   /* "bitpod.de", true */ 'b', 'i', 't', 'p', 'o', 'd', '.', 'd', 'e', '\0',
   /* "bitrage.de", true */ 'b', 'i', 't', 'r', 'a', 'g', 'e', '.', 'd', 'e', '\0',
   /* "bitraum.io", true */ 'b', 'i', 't', 'r', 'a', 'u', 'm', '.', 'i', 'o', '\0',
   /* "bitref.com", true */ 'b', 'i', 't', 'r', 'e', 'f', '.', 'c', 'o', 'm', '\0',
   /* "bitsensor.io", true */ 'b', 'i', 't', 's', 'e', 'n', 's', 'o', 'r', '.', 'i', 'o', '\0',
   /* "bitshaker.net", true */ 'b', 'i', 't', 's', 'h', 'a', 'k', 'e', 'r', '.', 'n', 'e', 't', '\0',
   /* "bitskins.co", true */ 'b', 'i', 't', 's', 'k', 'i', 'n', 's', '.', 'c', 'o', '\0',
   /* "bitskrieg.net", true */ 'b', 'i', 't', 's', 'k', 'r', 'i', 'e', 'g', '.', 'n', 'e', 't', '\0',
+  /* "bitstorm.nl", true */ 'b', 'i', 't', 's', 't', 'o', 'r', 'm', '.', 'n', 'l', '\0',
+  /* "bitstorm.org", true */ 'b', 'i', 't', 's', 't', 'o', 'r', 'm', '.', 'o', 'r', 'g', '\0',
   /* "bittersweetcandybowl.com", true */ 'b', 'i', 't', 't', 'e', 'r', 's', 'w', 'e', 'e', 't', 'c', 'a', 'n', 'd', 'y', 'b', 'o', 'w', 'l', '.', 'c', 'o', 'm', '\0',
   /* "bittmann.me", true */ 'b', 'i', 't', 't', 'm', 'a', 'n', 'n', '.', 'm', 'e', '\0',
   /* "bittylicious.com", true */ 'b', 'i', 't', 't', 'y', 'l', 'i', 'c', 'i', 'o', 'u', 's', '.', 'c', 'o', 'm', '\0',
   /* "bitvest.io", true */ 'b', 'i', 't', 'v', 'e', 's', 't', '.', 'i', 'o', '\0',
   /* "bitwolk.nl", true */ 'b', 'i', 't', 'w', 'o', 'l', 'k', '.', 'n', 'l', '\0',
   /* "bityes.org", true */ 'b', 'i', 't', 'y', 'e', 's', '.', 'o', 'r', 'g', '\0',
   /* "biurokarier.edu.pl", true */ 'b', 'i', 'u', 'r', 'o', 'k', 'a', 'r', 'i', 'e', 'r', '.', 'e', 'd', 'u', '.', 'p', 'l', '\0',
   /* "biyou-homme.com", true */ 'b', 'i', 'y', 'o', 'u', '-', 'h', 'o', 'm', 'm', 'e', '.', 'c', 'o', 'm', '\0',
@@ -1460,16 +1459,17 @@ static const char kSTSHostTable[] = {
   /* "blablacar.mx", true */ 'b', 'l', 'a', 'b', 'l', 'a', 'c', 'a', 'r', '.', 'm', 'x', '\0',
   /* "blablacar.nl", true */ 'b', 'l', 'a', 'b', 'l', 'a', 'c', 'a', 'r', '.', 'n', 'l', '\0',
   /* "blablacar.pl", true */ 'b', 'l', 'a', 'b', 'l', 'a', 'c', 'a', 'r', '.', 'p', 'l', '\0',
   /* "blablacar.pt", true */ 'b', 'l', 'a', 'b', 'l', 'a', 'c', 'a', 'r', '.', 'p', 't', '\0',
   /* "blablacar.ro", true */ 'b', 'l', 'a', 'b', 'l', 'a', 'c', 'a', 'r', '.', 'r', 'o', '\0',
   /* "blablacar.rs", true */ 'b', 'l', 'a', 'b', 'l', 'a', 'c', 'a', 'r', '.', 'r', 's', '\0',
   /* "blablacar.ru", true */ 'b', 'l', 'a', 'b', 'l', 'a', 'c', 'a', 'r', '.', 'r', 'u', '\0',
   /* "black-armada.com", true */ 'b', 'l', 'a', 'c', 'k', '-', 'a', 'r', 'm', 'a', 'd', 'a', '.', 'c', 'o', 'm', '\0',
+  /* "black-khat.com", true */ 'b', 'l', 'a', 'c', 'k', '-', 'k', 'h', 'a', 't', '.', 'c', 'o', 'm', '\0',
   /* "blackbag.nl", true */ 'b', 'l', 'a', 'c', 'k', 'b', 'a', 'g', '.', 'n', 'l', '\0',
   /* "blackberrycentral.com", true */ 'b', 'l', 'a', 'c', 'k', 'b', 'e', 'r', 'r', 'y', 'c', 'e', 'n', 't', 'r', 'a', 'l', '.', 'c', 'o', 'm', '\0',
   /* "blackcat.ca", true */ 'b', 'l', 'a', 'c', 'k', 'c', 'a', 't', '.', 'c', 'a', '\0',
   /* "blackcatinformatics.ca", true */ 'b', 'l', 'a', 'c', 'k', 'c', 'a', 't', 'i', 'n', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'c', 's', '.', 'c', 'a', '\0',
   /* "blackcatinformatics.com", true */ 'b', 'l', 'a', 'c', 'k', 'c', 'a', 't', 'i', 'n', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'c', 's', '.', 'c', 'o', 'm', '\0',
   /* "blackdesertsp.com", true */ 'b', 'l', 'a', 'c', 'k', 'd', 'e', 's', 'e', 'r', 't', 's', 'p', '.', 'c', 'o', 'm', '\0',
   /* "blackdragoninc.org", true */ 'b', 'l', 'a', 'c', 'k', 'd', 'r', 'a', 'g', 'o', 'n', 'i', 'n', 'c', '.', 'o', 'r', 'g', '\0',
   /* "blackhelicopters.net", false */ 'b', 'l', 'a', 'c', 'k', 'h', 'e', 'l', 'i', 'c', 'o', 'p', 't', 'e', 'r', 's', '.', 'n', 'e', 't', '\0',
@@ -1477,16 +1477,17 @@ static const char kSTSHostTable[] = {
   /* "blackonion.com", true */ 'b', 'l', 'a', 'c', 'k', 'o', 'n', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "blackphoenix.de", true */ 'b', 'l', 'a', 'c', 'k', 'p', 'h', 'o', 'e', 'n', 'i', 'x', '.', 'd', 'e', '\0',
   /* "blackscytheconsulting.com", true */ 'b', 'l', 'a', 'c', 'k', 's', 'c', 'y', 't', 'h', 'e', 'c', 'o', 'n', 's', 'u', 'l', 't', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "blaise.io", true */ 'b', 'l', 'a', 'i', 's', 'e', '.', 'i', 'o', '\0',
   /* "blakerandall.xyz", true */ 'b', 'l', 'a', 'k', 'e', 'r', 'a', 'n', 'd', 'a', 'l', 'l', '.', 'x', 'y', 'z', '\0',
   /* "blancodent.com", true */ 'b', 'l', 'a', 'n', 'c', 'o', 'd', 'e', 'n', 't', '.', 'c', 'o', 'm', '\0',
   /* "blankersfamily.com", true */ 'b', 'l', 'a', 'n', 'k', 'e', 'r', 's', 'f', 'a', 'm', 'i', 'l', 'y', '.', 'c', 'o', 'm', '\0',
   /* "blastersklan.com", true */ 'b', 'l', 'a', 's', 't', 'e', 'r', 's', 'k', 'l', 'a', 'n', '.', 'c', 'o', 'm', '\0',
+  /* "blaudev.es", true */ 'b', 'l', 'a', 'u', 'd', 'e', 'v', '.', 'e', 's', '\0',
   /* "blauerhunger.de", true */ 'b', 'l', 'a', 'u', 'e', 'r', 'h', 'u', 'n', 'g', 'e', 'r', '.', 'd', 'e', '\0',
   /* "blauwwit.be", true */ 'b', 'l', 'a', 'u', 'w', 'w', 'i', 't', '.', 'b', 'e', '\0',
   /* "blayne.me", true */ 'b', 'l', 'a', 'y', 'n', 'e', '.', 'm', 'e', '\0',
   /* "blazor.nl", true */ 'b', 'l', 'a', 'z', 'o', 'r', '.', 'n', 'l', '\0',
   /* "bleche-onlineshop.de", true */ 'b', 'l', 'e', 'c', 'h', 'e', '-', 'o', 'n', 'l', 'i', 'n', 'e', 's', 'h', 'o', 'p', '.', 'd', 'e', '\0',
   /* "blechschmidt.saarland", true */ 'b', 'l', 'e', 'c', 'h', 's', 'c', 'h', 'm', 'i', 'd', 't', '.', 's', 'a', 'a', 'r', 'l', 'a', 'n', 'd', '\0',
   /* "blendle.com", true */ 'b', 'l', 'e', 'n', 'd', 'l', 'e', '.', 'c', 'o', 'm', '\0',
   /* "blendle.nl", true */ 'b', 'l', 'e', 'n', 'd', 'l', 'e', '.', 'n', 'l', '\0',
@@ -1676,17 +1677,16 @@ static const char kSTSHostTable[] = {
   /* "brilliantbuilders.co.uk", true */ 'b', 'r', 'i', 'l', 'l', 'i', 'a', 'n', 't', 'b', 'u', 'i', 'l', 'd', 'e', 'r', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "brilliantdecisionmaking.com", true */ 'b', 'r', 'i', 'l', 'l', 'i', 'a', 'n', 't', 'd', 'e', 'c', 'i', 's', 'i', 'o', 'n', 'm', 'a', 'k', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "brinkhu.is", true */ 'b', 'r', 'i', 'n', 'k', 'h', 'u', '.', 'i', 's', '\0',
   /* "bristebein.com", true */ 'b', 'r', 'i', 's', 't', 'e', 'b', 'e', 'i', 'n', '.', 'c', 'o', 'm', '\0',
   /* "britishgroupsg.com", true */ 'b', 'r', 'i', 't', 'i', 's', 'h', 'g', 'r', 'o', 'u', 'p', 's', 'g', '.', 'c', 'o', 'm', '\0',
   /* "britishscienceweek.org", true */ 'b', 'r', 'i', 't', 'i', 's', 'h', 's', 'c', 'i', 'e', 'n', 'c', 'e', 'w', 'e', 'e', 'k', '.', 'o', 'r', 'g', '\0',
   /* "britton-photography.com", true */ 'b', 'r', 'i', 't', 't', 'o', 'n', '-', 'p', 'h', 'o', 't', 'o', 'g', 'r', 'a', 'p', 'h', 'y', '.', 'c', 'o', 'm', '\0',
   /* "britzer-toner.de", true */ 'b', 'r', 'i', 't', 'z', 'e', 'r', '-', 't', 'o', 'n', 'e', 'r', '.', 'd', 'e', '\0',
-  /* "brivadois.ovh", true */ 'b', 'r', 'i', 'v', 'a', 'd', 'o', 'i', 's', '.', 'o', 'v', 'h', '\0',
   /* "brix.ninja", true */ 'b', 'r', 'i', 'x', '.', 'n', 'i', 'n', 'j', 'a', '\0',
   /* "broadsheet.com.au", true */ 'b', 'r', 'o', 'a', 'd', 's', 'h', 'e', 'e', 't', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
   /* "brockmeyer.org", true */ 'b', 'r', 'o', 'c', 'k', 'm', 'e', 'y', 'e', 'r', '.', 'o', 'r', 'g', '\0',
   /* "broersma.com", true */ 'b', 'r', 'o', 'e', 'r', 's', 'm', 'a', '.', 'c', 'o', 'm', '\0',
   /* "broeselei.at", true */ 'b', 'r', 'o', 'e', 's', 'e', 'l', 'e', 'i', '.', 'a', 't', '\0',
   /* "bronevichok.ru", true */ 'b', 'r', 'o', 'n', 'e', 'v', 'i', 'c', 'h', 'o', 'k', '.', 'r', 'u', '\0',
   /* "brooke-fan.com", true */ 'b', 'r', 'o', 'o', 'k', 'e', '-', 'f', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "brossman.it", true */ 'b', 'r', 'o', 's', 's', 'm', 'a', 'n', '.', 'i', 't', '\0',
@@ -1824,17 +1824,16 @@ static const char kSTSHostTable[] = {
   /* "bytejail.com", true */ 'b', 'y', 't', 'e', 'j', 'a', 'i', 'l', '.', 'c', 'o', 'm', '\0',
   /* "bytema.cz", true */ 'b', 'y', 't', 'e', 'm', 'a', '.', 'c', 'z', '\0',
   /* "bytema.re", true */ 'b', 'y', 't', 'e', 'm', 'a', '.', 'r', 'e', '\0',
   /* "bytesatwork.de", true */ 'b', 'y', 't', 'e', 's', 'a', 't', 'w', 'o', 'r', 'k', '.', 'd', 'e', '\0',
   /* "bytesatwork.eu", true */ 'b', 'y', 't', 'e', 's', 'a', 't', 'w', 'o', 'r', 'k', '.', 'e', 'u', '\0',
   /* "byteshark.org", true */ 'b', 'y', 't', 'e', 's', 'h', 'a', 'r', 'k', '.', 'o', 'r', 'g', '\0',
   /* "bytesofcode.de", true */ 'b', 'y', 't', 'e', 's', 'o', 'f', 'c', 'o', 'd', 'e', '.', 'd', 'e', '\0',
   /* "bytesund.biz", true */ 'b', 'y', 't', 'e', 's', 'u', 'n', 'd', '.', 'b', 'i', 'z', '\0',
-  /* "bytesunlimited.com", true */ 'b', 'y', 't', 'e', 's', 'u', 'n', 'l', 'i', 'm', 'i', 't', 'e', 'd', '.', 'c', 'o', 'm', '\0',
   /* "bytesystems.com", true */ 'b', 'y', 't', 'e', 's', 'y', 's', 't', 'e', 'm', 's', '.', 'c', 'o', 'm', '\0',
   /* "byteturtle.eu", true */ 'b', 'y', 't', 'e', 't', 'u', 'r', 't', 'l', 'e', '.', 'e', 'u', '\0',
   /* "bythisverse.com", true */ 'b', 'y', 't', 'h', 'i', 's', 'v', 'e', 'r', 's', 'e', '.', 'c', 'o', 'm', '\0',
   /* "bziaks.xyz", true */ 'b', 'z', 'i', 'a', 'k', 's', '.', 'x', 'y', 'z', '\0',
   /* "bztech.com.br", true */ 'b', 'z', 't', 'e', 'c', 'h', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0',
   /* "bzv-fr.eu", true */ 'b', 'z', 'v', '-', 'f', 'r', '.', 'e', 'u', '\0',
   /* "c-shock.org", true */ 'c', '-', 's', 'h', 'o', 'c', 'k', '.', 'o', 'r', 'g', '\0',
   /* "c-webdesign.net", true */ 'c', '-', 'w', 'e', 'b', 'd', 'e', 's', 'i', 'g', 'n', '.', 'n', 'e', 't', '\0',
@@ -1879,17 +1878,16 @@ static const char kSTSHostTable[] = {
   /* "calibso.net", true */ 'c', 'a', 'l', 'i', 'b', 's', 'o', '.', 'n', 'e', 't', '\0',
   /* "call.me", false */ 'c', 'a', 'l', 'l', '.', 'm', 'e', '\0',
   /* "callabs.net", true */ 'c', 'a', 'l', 'l', 'a', 'b', 's', '.', 'n', 'e', 't', '\0',
   /* "callaction.co", true */ 'c', 'a', 'l', 'l', 'a', 'c', 't', 'i', 'o', 'n', '.', 'c', 'o', '\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',
   /* "calvin.my", true */ 'c', 'a', 'l', 'v', 'i', 'n', '.', 'm', 'y', '\0',
   /* "calyxengineers.com", true */ 'c', 'a', 'l', 'y', 'x', 'e', 'n', 'g', 'i', 'n', 'e', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0',
   /* "camashop.de", true */ 'c', 'a', 'm', 'a', 's', 'h', 'o', 'p', '.', 'd', 'e', '\0',
   /* "camaya.net", true */ 'c', 'a', 'm', 'a', 'y', 'a', '.', 'n', 'e', 't', '\0',
   /* "cambier.org", true */ 'c', 'a', 'm', 'b', 'i', 'e', 'r', '.', 'o', 'r', 'g', '\0',
@@ -2076,16 +2074,17 @@ static const char kSTSHostTable[] = {
   /* "chamilo.org", true */ 'c', 'h', 'a', 'm', 'i', 'l', 'o', '.', 'o', 'r', 'g', '\0',
   /* "champserver.net", true */ 'c', 'h', 'a', 'm', 'p', 's', 'e', 'r', 'v', 'e', 'r', '.', 'n', 'e', 't', '\0',
   /* "changetip.com", true */ 'c', 'h', 'a', 'n', 'g', 'e', 't', 'i', 'p', '.', 'c', 'o', 'm', '\0',
   /* "channelcards.com", true */ 'c', 'h', 'a', 'n', 'n', 'e', 'l', 'c', 'a', 'r', 'd', 's', '.', 'c', 'o', 'm', '\0',
   /* "chaos-inc.de", true */ 'c', 'h', 'a', 'o', 's', '-', 'i', 'n', 'c', '.', 'd', 'e', '\0',
   /* "chaoschemnitz.de", true */ 'c', 'h', 'a', 'o', 's', 'c', 'h', 'e', 'm', 'n', 'i', 't', 'z', '.', 'd', 'e', '\0',
   /* "chaosdorf.de", true */ 'c', 'h', 'a', 'o', 's', 'd', 'o', 'r', 'f', '.', 'd', 'e', '\0',
   /* "chaosfield.at", true */ 'c', 'h', 'a', 'o', 's', 'f', 'i', 'e', 'l', 'd', '.', 'a', 't', '\0',
+  /* "chaoslab.org", true */ 'c', 'h', 'a', 'o', 's', 'l', 'a', 'b', '.', 'o', 'r', 'g', '\0',
   /* "chaoswebs.net", true */ 'c', 'h', 'a', 'o', 's', 'w', 'e', 'b', 's', '.', 'n', 'e', 't', '\0',
   /* "charge.co", true */ 'c', 'h', 'a', 'r', 'g', 'e', '.', 'c', 'o', '\0',
   /* "charityclear.com", true */ 'c', 'h', 'a', 'r', 'i', 't', 'y', 'c', 'l', 'e', 'a', 'r', '.', 'c', 'o', 'm', '\0',
   /* "charitystreet.co.uk", true */ 'c', 'h', 'a', 'r', 'i', 't', 'y', 's', 't', 'r', 'e', 'e', 't', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "charl.eu", true */ 'c', 'h', 'a', 'r', 'l', '.', 'e', 'u', '\0',
   /* "charlenevondell.com", true */ 'c', 'h', 'a', 'r', 'l', 'e', 'n', 'e', 'v', 'o', 'n', 'd', 'e', 'l', 'l', '.', 'c', 'o', 'm', '\0',
   /* "charlesbwise.com", true */ 'c', 'h', 'a', 'r', 'l', 'e', 's', 'b', 'w', 'i', 's', 'e', '.', 'c', 'o', 'm', '\0',
   /* "charlesrogers.co.uk", true */ 'c', 'h', 'a', 'r', 'l', 'e', 's', 'r', 'o', 'g', 'e', 'r', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
@@ -2344,17 +2343,16 @@ static const char kSTSHostTable[] = {
   /* "cnam.net", true */ 'c', 'n', 'a', 'm', '.', 'n', 'e', 't', '\0',
   /* "cnc-lehrgang.de", true */ 'c', 'n', 'c', '-', 'l', 'e', 'h', 'r', 'g', 'a', 'n', 'g', '.', 'd', 'e', '\0',
   /* "cnlic.com", true */ 'c', 'n', 'l', 'i', 'c', '.', 'c', 'o', 'm', '\0',
   /* "cnwage.com", true */ 'c', 'n', 'w', 'a', 'g', 'e', '.', 'c', 'o', 'm', '\0',
   /* "cnwarn.com", true */ 'c', 'n', 'w', 'a', 'r', 'n', '.', 'c', 'o', 'm', '\0',
   /* "co.search.yahoo.com", false */ 'c', 'o', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0',
   /* "coachingconsultancy.com", true */ 'c', 'o', 'a', 'c', 'h', 'i', 'n', 'g', 'c', 'o', 'n', 's', 'u', 'l', 't', 'a', 'n', 'c', 'y', '.', 'c', 'o', 'm', '\0',
   /* "coalpointcottage.com", true */ 'c', 'o', 'a', 'l', 'p', 'o', 'i', 'n', 't', 'c', 'o', 't', 't', 'a', 'g', 'e', '.', 'c', 'o', 'm', '\0',
-  /* "coam.co", true */ 'c', 'o', 'a', 'm', '.', 'c', 'o', '\0',
   /* "cobalt.io", true */ 'c', 'o', 'b', 'a', 'l', 't', '.', 'i', 'o', '\0',
   /* "cocaine.ninja", true */ 'c', 'o', 'c', 'a', 'i', 'n', 'e', '.', 'n', 'i', 'n', 'j', 'a', '\0',
   /* "coccolebenessere.it", true */ 'c', 'o', 'c', 'c', 'o', 'l', 'e', 'b', 'e', 'n', 'e', 's', 's', 'e', 'r', 'e', '.', 'i', 't', '\0',
   /* "cocker.cc", false */ 'c', 'o', 'c', 'k', 'e', 'r', '.', 'c', 'c', '\0',
   /* "cocktailfuture.fr", true */ 'c', 'o', 'c', 'k', 't', 'a', 'i', 'l', 'f', 'u', 't', 'u', 'r', 'e', '.', 'f', 'r', '\0',
   /* "cocoaheads.at", false */ 'c', 'o', 'c', 'o', 'a', 'h', 'e', 'a', 'd', 's', '.', 'a', 't', '\0',
   /* "cocolovesdaddy.com", true */ 'c', 'o', 'c', 'o', 'l', 'o', 'v', 'e', 's', 'd', 'a', 'd', 'd', 'y', '.', 'c', 'o', 'm', '\0',
   /* "code-poets.co.uk", true */ 'c', 'o', 'd', 'e', '-', 'p', 'o', 'e', 't', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
@@ -2406,16 +2404,17 @@ static const char kSTSHostTable[] = {
   /* "coldawn.com", true */ 'c', 'o', 'l', 'd', 'a', 'w', 'n', '.', 'c', 'o', 'm', '\0',
   /* "coldhak.ca", true */ 'c', 'o', 'l', 'd', 'h', 'a', 'k', '.', 'c', 'a', '\0',
   /* "coldwatericecream.com", true */ 'c', 'o', 'l', 'd', 'w', 'a', 't', 'e', 'r', 'i', 'c', 'e', 'c', 'r', 'e', 'a', 'm', '.', 'c', 'o', 'm', '\0',
   /* "colegiocierp.com.br", true */ 'c', 'o', 'l', 'e', 'g', 'i', 'o', 'c', 'i', 'e', 'r', 'p', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0',
   /* "colemak.com", true */ 'c', 'o', 'l', 'e', 'm', 'a', 'k', '.', 'c', 'o', 'm', '\0',
   /* "colengo.com", true */ 'c', 'o', 'l', 'e', 'n', 'g', 'o', '.', 'c', 'o', 'm', '\0',
   /* "colinchartier.com", true */ 'c', 'o', 'l', 'i', 'n', 'c', 'h', 'a', 'r', 't', 'i', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "colinstark.ca", true */ 'c', 'o', 'l', 'i', 'n', 's', 't', 'a', 'r', 'k', '.', 'c', 'a', '\0',
+  /* "colinwolff.com", true */ 'c', 'o', 'l', 'i', 'n', 'w', 'o', 'l', 'f', 'f', '.', 'c', 'o', 'm', '\0',
   /* "collabornation.net", true */ 'c', 'o', 'l', 'l', 'a', 'b', 'o', 'r', 'n', 'a', 't', 'i', 'o', 'n', '.', 'n', 'e', 't', '\0',
   /* "collabra.email", true */ 'c', 'o', 'l', 'l', 'a', 'b', 'r', 'a', '.', 'e', 'm', 'a', 'i', 'l', '\0',
   /* "collaction.hk", true */ 'c', 'o', 'l', 'l', 'a', 'c', 't', 'i', 'o', 'n', '.', 'h', 'k', '\0',
   /* "collada.org", true */ 'c', 'o', 'l', 'l', 'a', 'd', 'a', '.', 'o', 'r', 'g', '\0',
   /* "collectfood.com", true */ 'c', 'o', 'l', 'l', 'e', 'c', 't', 'f', 'o', 'o', 'd', '.', 'c', 'o', 'm', '\0',
   /* "collectiblebeans.com", true */ 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'b', 'l', 'e', 'b', 'e', 'a', 'n', 's', '.', 'c', 'o', 'm', '\0',
   /* "collectosaurus.com", true */ 'c', 'o', 'l', 'l', 'e', 'c', 't', 'o', 's', 'a', 'u', 'r', 'u', 's', '.', 'c', 'o', 'm', '\0',
   /* "collegepulse.org", true */ 'c', 'o', 'l', 'l', 'e', 'g', 'e', 'p', 'u', 'l', 's', 'e', '.', 'o', 'r', 'g', '\0',
@@ -2507,17 +2506,17 @@ static const char kSTSHostTable[] = {
   /* "consumer.gov", true */ 'c', 'o', 'n', 's', 'u', 'm', 'e', 'r', '.', 'g', 'o', 'v', '\0',
   /* "consumerfiles.com", true */ 'c', 'o', 'n', 's', 'u', 'm', 'e', 'r', 'f', 'i', 'l', 'e', 's', '.', 'c', 'o', 'm', '\0',
   /* "consumersentinel.gov", true */ 'c', 'o', 'n', 's', 'u', 'm', 'e', 'r', 's', 'e', 'n', 't', 'i', 'n', 'e', 'l', '.', 'g', 'o', 'v', '\0',
   /* "consumidor.gov", true */ 'c', 'o', 'n', 's', 'u', 'm', 'i', 'd', 'o', 'r', '.', 'g', 'o', 'v', '\0',
   /* "contactbig.com", true */ 'c', 'o', 'n', 't', 'a', 'c', 't', 'b', 'i', 'g', '.', 'c', 'o', 'm', '\0',
   /* "containerstatistics.com", true */ 'c', 'o', 'n', 't', 'a', 'i', 'n', 'e', 'r', 's', 't', 'a', 't', 'i', 's', 't', 'i', 'c', 's', '.', 'c', 'o', 'm', '\0',
   /* "contessa32experience.com", true */ 'c', 'o', 'n', 't', 'e', 's', 's', 'a', '3', '2', 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', '.', 'c', 'o', 'm', '\0',
   /* "contrabass.net", true */ 'c', 'o', 'n', 't', 'r', 'a', 'b', 'a', 's', 's', '.', 'n', 'e', 't', '\0',
-  /* "contributor.google.com", true */ 'c', 'o', 'n', 't', 'r', 'i', 'b', 'u', 't', 'o', 'r', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0',
+  /* "contributor.google.com", false */ 'c', 'o', 'n', 't', 'r', 'i', 'b', 'u', 't', 'o', 'r', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0',
   /* "conve.eu", true */ 'c', 'o', 'n', 'v', 'e', '.', 'e', 'u', '\0',
   /* "convergemagazine.com", true */ 'c', 'o', 'n', 'v', 'e', 'r', 'g', 'e', 'm', 'a', 'g', 'a', 'z', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0',
   /* "conversiones.com", true */ 'c', 'o', 'n', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'e', 's', '.', 'c', 'o', 'm', '\0',
   /* "convert.im", true */ 'c', 'o', 'n', 'v', 'e', 'r', 't', '.', 'i', 'm', '\0',
   /* "convert.zone", true */ 'c', 'o', 'n', 'v', 'e', 'r', 't', '.', 'z', 'o', 'n', 'e', '\0',
   /* "converter.ml", true */ 'c', 'o', 'n', 'v', 'e', 'r', 't', 'e', 'r', '.', 'm', 'l', '\0',
   /* "convocatoriafundacionpepsicomexico.org", false */ 'c', 'o', 'n', 'v', 'o', 'c', 'a', 't', 'o', 'r', 'i', 'a', 'f', 'u', 'n', 'd', 'a', 'c', 'i', 'o', 'n', 'p', 'e', 'p', 's', 'i', 'c', 'o', 'm', 'e', 'x', 'i', 'c', 'o', '.', 'o', 'r', 'g', '\0',
   /* "cookicons.co", true */ 'c', 'o', 'o', 'k', 'i', 'c', 'o', 'n', 's', '.', 'c', 'o', '\0',
@@ -2546,17 +2545,16 @@ static const char kSTSHostTable[] = {
   /* "coreinfrastructure.org", true */ 'c', 'o', 'r', 'e', 'i', 'n', 'f', 'r', 'a', 's', 't', 'r', 'u', 'c', 't', 'u', 'r', 'e', '.', 'o', 'r', 'g', '\0',
   /* "coreless-stretchfilm.com", true */ 'c', 'o', 'r', 'e', 'l', 'e', 's', 's', '-', 's', 't', 'r', 'e', 't', 'c', 'h', 'f', 'i', 'l', 'm', '.', 'c', 'o', 'm', '\0',
   /* "corepartners.com.ua", true */ 'c', 'o', 'r', 'e', 'p', 'a', 'r', 't', 'n', 'e', 'r', 's', '.', 'c', 'o', 'm', '.', 'u', 'a', '\0',
   /* "corgi.party", true */ 'c', 'o', 'r', 'g', 'i', '.', 'p', 'a', 'r', 't', 'y', '\0',
   /* "corgicloud.com", true */ 'c', 'o', 'r', 'g', 'i', 'c', 'l', 'o', 'u', 'd', '.', 'c', 'o', 'm', '\0',
   /* "cormactagging.ie", true */ 'c', 'o', 'r', 'm', 'a', 'c', 't', 'a', 'g', 'g', 'i', 'n', 'g', '.', 'i', 'e', '\0',
   /* "cornercircle.co.uk", true */ 'c', 'o', 'r', 'n', 'e', 'r', 'c', 'i', 'r', 'c', 'l', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "corniche.com", true */ 'c', 'o', 'r', 'n', 'i', 'c', 'h', 'e', '.', 'c', 'o', 'm', '\0',
-  /* "coronelpicanha.com.br", true */ 'c', 'o', 'r', 'o', 'n', 'e', 'l', 'p', 'i', 'c', 'a', 'n', 'h', 'a', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0',
   /* "corpfin.net", true */ 'c', 'o', 'r', 'p', 'f', 'i', 'n', '.', 'n', 'e', 't', '\0',
   /* "corporatesubscriptions.com.au", true */ 'c', 'o', 'r', 'p', 'o', 'r', 'a', 't', 'e', 's', 'u', 'b', 's', 'c', 'r', 'i', 'p', 't', 'i', 'o', 'n', 's', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
   /* "correct.horse", true */ 'c', 'o', 'r', 'r', 'e', 'c', 't', '.', 'h', 'o', 'r', 's', 'e', '\0',
   /* "cortexitrecruitment.com", true */ 'c', 'o', 'r', 't', 'e', 'x', 'i', 't', 'r', 'e', 'c', 'r', 'u', 'i', 't', 'm', 'e', 'n', 't', '.', 'c', 'o', 'm', '\0',
   /* "cortisolsupplement.com", true */ 'c', 'o', 'r', 't', 'i', 's', 'o', 'l', 's', 'u', 'p', 'p', 'l', 'e', 'm', 'e', 'n', 't', '.', 'c', 'o', 'm', '\0',
   /* "corvus.eu.org", true */ 'c', 'o', 'r', 'v', 'u', 's', '.', 'e', 'u', '.', 'o', 'r', 'g', '\0',
   /* "coryadum.com", true */ 'c', 'o', 'r', 'y', 'a', 'd', 'u', 'm', '.', 'c', 'o', 'm', '\0',
   /* "corzntin.fr", true */ 'c', 'o', 'r', 'z', 'n', 't', 'i', 'n', '.', 'f', 'r', '\0',
@@ -2744,17 +2742,16 @@ static const char kSTSHostTable[] = {
   /* "cuvva.eu", true */ 'c', 'u', 'v', 'v', 'a', '.', 'e', 'u', '\0',
   /* "cuvva.io", true */ 'c', 'u', 'v', 'v', 'a', '.', 'i', 'o', '\0',
   /* "cuvva.it", true */ 'c', 'u', 'v', 'v', 'a', '.', 'i', 't', '\0',
   /* "cuvva.me", true */ 'c', 'u', 'v', 'v', 'a', '.', 'm', 'e', '\0',
   /* "cuvva.net", true */ 'c', 'u', 'v', 'v', 'a', '.', 'n', 'e', 't', '\0',
   /* "cuvva.org", true */ 'c', 'u', 'v', 'v', 'a', '.', 'o', 'r', 'g', '\0',
   /* "cuvva.uk", true */ 'c', 'u', 'v', 'v', 'a', '.', 'u', 'k', '\0',
   /* "cuvva.us", true */ 'c', 'u', 'v', 'v', 'a', '.', 'u', 's', '\0',
-  /* "cvjm-memmingen.de", true */ 'c', 'v', 'j', 'm', '-', 'm', 'e', 'm', 'm', 'i', 'n', 'g', 'e', 'n', '.', 'd', 'e', '\0',
   /* "cvlibrary.co.uk", true */ 'c', 'v', 'l', 'i', 'b', 'r', 'a', 'r', 'y', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "cvmu.jp", true */ 'c', 'v', 'm', 'u', '.', 'j', 'p', '\0',
   /* "cvr.dk", true */ 'c', 'v', 'r', '.', 'd', 'k', '\0',
   /* "cvsoftub.com", true */ 'c', 'v', 's', 'o', 'f', 't', 'u', 'b', '.', 'c', 'o', 'm', '\0',
   /* "cvtparking.co.uk", true */ 'c', 'v', 't', 'p', 'a', 'r', 'k', 'i', 'n', 'g', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "cvursache.com", true */ 'c', 'v', 'u', 'r', 's', 'a', 'c', 'h', 'e', '.', 'c', 'o', 'm', '\0',
   /* "cvv.cn", true */ 'c', 'v', 'v', '.', 'c', 'n', '\0',
   /* "cwage.com", true */ 'c', 'w', 'a', 'g', 'e', '.', 'c', 'o', 'm', '\0',
@@ -2911,17 +2908,16 @@ static const char kSTSHostTable[] = {
   /* "datadit.hu", true */ 'd', 'a', 't', 'a', 'd', 'i', 't', '.', 'h', 'u', '\0',
   /* "dataisme.com", true */ 'd', 'a', 't', 'a', 'i', 's', 'm', 'e', '.', 'c', 'o', 'm', '\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',
-  /* "datasnitch.co.uk", true */ 'd', 'a', 't', 'a', 's', 'n', 'i', 't', 'c', 'h', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "datastream.re", false */ '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.fi", false */ 'd', 'a', 't', 'a', 't', 'e', 'k', 'n', 'i', 'i', 'k', 'k', 'a', '.', 'f', 'i', '\0',
   /* "datedeposit.com", true */ 'd', 'a', 't', 'e', 'd', 'e', 'p', 'o', 's', 'i', 't', '.', 'c', 'o', 'm', '\0',
   /* "datenschutz-individuell.de", true */ 'd', 'a', 't', 'e', 'n', 's', 'c', 'h', 'u', 't', 'z', '-', 'i', 'n', 'd', 'i', 'v', 'i', 'd', 'u', 'e', 'l', 'l', '.', 'd', 'e', '\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',
@@ -3074,17 +3070,16 @@ static const char kSTSHostTable[] = {
   /* "depicus.com", true */ 'd', 'e', 'p', 'i', 'c', 'u', 's', '.', 'c', 'o', 'm', '\0',
   /* "der-stein-fluesterer.de", true */ 'd', 'e', 'r', '-', 's', 't', 'e', 'i', 'n', '-', 'f', 'l', 'u', 'e', 's', 't', 'e', 'r', 'e', 'r', '.', 'd', 'e', '\0',
   /* "derbyshire-language-scheme.co.uk", true */ 'd', 'e', 'r', 'b', 'y', 's', 'h', 'i', 'r', 'e', '-', 'l', 'a', 'n', 'g', 'u', 'a', 'g', 'e', '-', 's', 'c', 'h', 'e', 'm', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "derchris.me", true */ 'd', 'e', 'r', 'c', 'h', 'r', 'i', 's', '.', 'm', 'e', '\0',
   /* "derechosdigitales.org", true */ 'd', 'e', 'r', 'e', 'c', 'h', 'o', 's', 'd', 'i', 'g', 'i', 't', 'a', 'l', 'e', 's', '.', 'o', 'r', 'g', '\0',
   /* "dereferenced.net", true */ 'd', 'e', 'r', 'e', 'f', 'e', 'r', 'e', 'n', 'c', 'e', 'd', '.', 'n', 'e', 't', '\0',
   /* "deregowski.net", true */ 'd', 'e', 'r', 'e', 'g', 'o', 'w', 's', 'k', 'i', '.', 'n', 'e', 't', '\0',
   /* "derekkent.com", true */ 'd', 'e', 'r', 'e', 'k', 'k', 'e', 'n', 't', '.', 'c', 'o', 'm', '\0',
-  /* "dergeilstestammderwelt.de", true */ 'd', 'e', 'r', 'g', 'e', 'i', 'l', 's', 't', 'e', 's', 't', 'a', 'm', 'm', 'd', 'e', 'r', 'w', 'e', 'l', 't', '.', 'd', 'e', '\0',
   /* "derivativeshub.pro", true */ 'd', 'e', 'r', 'i', 'v', 'a', 't', 'i', 'v', 'e', 's', 'h', 'u', 'b', '.', 'p', 'r', 'o', '\0',
   /* "dermapuur.nl", true */ 'd', 'e', 'r', 'm', 'a', 'p', 'u', 'u', 'r', '.', 'n', 'l', '\0',
   /* "deroo.org", true */ 'd', 'e', 'r', 'o', 'o', '.', 'o', 'r', 'g', '\0',
   /* "derp.army", true */ 'd', 'e', 'r', 'p', '.', 'a', 'r', 'm', 'y', '\0',
   /* "derreichesack.com", true */ 'd', 'e', 'r', 'r', 'e', 'i', 'c', 'h', 'e', 's', 'a', 'c', 'k', '.', 'c', 'o', 'm', '\0',
   /* "dersoundhunter.de", true */ 'd', 'e', 'r', 's', 'o', 'u', 'n', 'd', 'h', 'u', 'n', 't', 'e', 'r', '.', 'd', 'e', '\0',
   /* "designed-cybersecurity.com", true */ 'd', 'e', 's', 'i', 'g', 'n', 'e', 'd', '-', 'c', 'y', 'b', 'e', 'r', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0',
   /* "designgears.com", true */ 'd', 'e', 's', 'i', 'g', 'n', 'g', 'e', 'a', 'r', 's', '.', 'c', 'o', 'm', '\0',
@@ -3396,16 +3391,17 @@ static const char kSTSHostTable[] = {
   /* "dotkod.com", true */ 'd', 'o', 't', 'k', 'o', 'd', '.', 'c', 'o', 'm', '\0',
   /* "dotkod.pl", true */ 'd', 'o', 't', 'k', 'o', 'd', '.', 'p', 'l', '\0',
   /* "dotphoto.com", true */ 'd', 'o', 't', 'p', 'h', 'o', 't', 'o', '.', 'c', 'o', 'm', '\0',
   /* "dotrox.net", true */ 'd', 'o', 't', 'r', 'o', 'x', '.', 'n', 'e', 't', '\0',
   /* "dotsiam.com", true */ 'd', 'o', 't', 's', 'i', 'a', 'm', '.', 'c', 'o', 'm', '\0',
   /* "doubleavineyards.com", true */ 'd', 'o', 'u', 'b', 'l', 'e', 'a', 'v', 'i', 'n', 'e', 'y', 'a', 'r', 'd', 's', '.', 'c', 'o', 'm', '\0',
   /* "doublefun.net", true */ 'd', 'o', 'u', 'b', 'l', 'e', 'f', 'u', 'n', '.', 'n', 'e', 't', '\0',
   /* "doubleyummy.uk", true */ 'd', 'o', 'u', 'b', 'l', 'e', 'y', 'u', 'm', 'm', 'y', '.', 'u', 'k', '\0',
+  /* "dougferris.id.au", true */ 'd', 'o', 'u', 'g', 'f', 'e', 'r', 'r', 'i', 's', '.', 'i', 'd', '.', 'a', 'u', '\0',
   /* "doujinshi.info", true */ 'd', 'o', 'u', 'j', 'i', 'n', 's', 'h', 'i', '.', 'i', 'n', 'f', 'o', '\0',
   /* "dounats.com", true */ 'd', 'o', 'u', 'n', 'a', 't', 's', '.', 'c', 'o', 'm', '\0',
   /* "dovecotadmin.org", true */ 'd', 'o', 'v', 'e', 'c', 'o', 't', 'a', 'd', 'm', 'i', 'n', '.', 'o', 'r', 'g', '\0',
   /* "downloadaja.com", true */ 'd', 'o', 'w', 'n', 'l', 'o', 'a', 'd', 'a', 'j', 'a', '.', 'c', 'o', 'm', '\0',
   /* "downloadgamemods.com", true */ 'd', 'o', 'w', 'n', 'l', 'o', 'a', 'd', 'g', 'a', 'm', 'e', 'm', 'o', 'd', 's', '.', 'c', 'o', 'm', '\0',
   /* "downloadgram.com", true */ 'd', 'o', 'w', 'n', 'l', 'o', 'a', 'd', 'g', 'r', 'a', 'm', '.', 'c', 'o', 'm', '\0',
   /* "downloadsoftwaregratisan.com", true */ 'd', 'o', 'w', 'n', 'l', 'o', 'a', 'd', 's', 'o', 'f', 't', 'w', 'a', 'r', 'e', 'g', 'r', 'a', 't', 'i', 's', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "doyoulyft.com", true */ 'd', 'o', 'y', 'o', 'u', 'l', 'y', 'f', 't', '.', 'c', 'o', 'm', '\0',
@@ -3443,16 +3439,17 @@ static const char kSTSHostTable[] = {
   /* "drinkvabeer.com", true */ 'd', 'r', 'i', 'n', 'k', 'v', 'a', 'b', 'e', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "drino.org", false */ 'd', 'r', 'i', 'n', 'o', '.', 'o', 'r', 'g', '\0',
   /* "drive.google.com", true */ 'd', 'r', 'i', 'v', 'e', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0',
   /* "drivenes.net", true */ 'd', 'r', 'i', 'v', 'e', 'n', 'e', 's', '.', 'n', 'e', 't', '\0',
   /* "drivercopilot.com", true */ 'd', 'r', 'i', 'v', 'e', 'r', 'c', 'o', 'p', 'i', 'l', 'o', 't', '.', 'c', 'o', 'm', '\0',
   /* "driverscollection.com", true */ 'd', 'r', 'i', 'v', 'e', 'r', 's', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "drivya.com", true */ 'd', 'r', 'i', 'v', 'y', 'a', '.', 'c', 'o', 'm', '\0',
   /* "drjoe.ca", true */ 'd', 'r', 'j', 'o', 'e', '.', 'c', 'a', '\0',
+  /* "drjuanitacollier.com", true */ 'd', 'r', 'j', 'u', 'a', 'n', 'i', 't', 'a', 'c', 'o', 'l', 'l', 'i', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "drkmtrx.xyz", true */ 'd', 'r', 'k', 'm', 't', 'r', 'x', '.', 'x', 'y', 'z', '\0',
   /* "drobniuch.pl", false */ 'd', 'r', 'o', 'b', 'n', 'i', 'u', 'c', 'h', '.', 'p', 'l', '\0',
   /* "droidapp.nl", true */ 'd', 'r', 'o', 'i', 'd', 'a', 'p', 'p', '.', 'n', 'l', '\0',
   /* "droidwiki.de", true */ 'd', 'r', 'o', 'i', 'd', 'w', 'i', 'k', 'i', '.', 'd', 'e', '\0',
   /* "droncentrum.pl", true */ 'd', 'r', 'o', 'n', 'c', 'e', 'n', 't', 'r', 'u', 'm', '.', 'p', 'l', '\0',
   /* "dronepit.dk", true */ 'd', 'r', 'o', 'n', 'e', 'p', 'i', 't', '.', 'd', 'k', '\0',
   /* "dronexpertos.com", true */ 'd', 'r', 'o', 'n', 'e', 'x', 'p', 'e', 'r', 't', 'o', 's', '.', 'c', 'o', 'm', '\0',
   /* "dronografia.es", true */ 'd', 'r', 'o', 'n', 'o', 'g', 'r', 'a', 'f', 'i', 'a', '.', 'e', 's', '\0',
@@ -3498,17 +3495,16 @@ static const char kSTSHostTable[] = {
   /* "dunea.nl", true */ 'd', 'u', 'n', 'e', 'a', '.', 'n', 'l', '\0',
   /* "duo.money", true */ 'd', 'u', 'o', '.', 'm', 'o', 'n', 'e', 'y', '\0',
   /* "durangoenergyllc.com", true */ 'd', 'u', 'r', 'a', 'n', 'g', 'o', 'e', 'n', 'e', 'r', 'g', 'y', 'l', 'l', 'c', '.', 'c', 'o', 'm', '\0',
   /* "durys.be", true */ 'd', 'u', 'r', 'y', 's', '.', 'b', 'e', '\0',
   /* "dustri.org", true */ 'd', 'u', 's', 't', 'r', 'i', '.', 'o', 'r', 'g', '\0',
   /* "dustygroove.com", true */ 'd', 'u', 's', 't', 'y', 'g', 'r', 'o', 'o', 'v', 'e', '.', 'c', 'o', 'm', '\0',
   /* "dutch1.nl", true */ 'd', 'u', 't', 'c', 'h', '1', '.', 'n', 'l', '\0',
   /* "dutchessuganda.com", true */ 'd', 'u', 't', 'c', 'h', 'e', 's', 's', 'u', 'g', 'a', 'n', 'd', 'a', '.', 'c', 'o', 'm', '\0',
-  /* "dutchrank.com", true */ 'd', 'u', 't', 'c', 'h', 'r', 'a', 'n', 'k', '.', 'c', 'o', 'm', '\0',
   /* "dutchrank.nl", true */ 'd', 'u', 't', 'c', 'h', 'r', 'a', 'n', 'k', '.', 'n', 'l', '\0',
   /* "dutchwanderers.nl", true */ 'd', 'u', 't', 'c', 'h', 'w', 'a', 'n', 'd', 'e', 'r', 'e', 'r', 's', '.', 'n', 'l', '\0',
   /* "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',
@@ -3632,17 +3628,16 @@ static const char kSTSHostTable[] = {
   /* "educationunlimited.com", true */ 'e', 'd', 'u', 'c', 'a', 't', 'i', 'o', 'n', 'u', 'n', 'l', 'i', 'm', 'i', 't', 'e', 'd', '.', 'c', 'o', 'm', '\0',
   /* "educator-one.com", true */ 'e', 'd', 'u', 'c', 'a', 't', 'o', 'r', '-', 'o', 'n', 'e', '.', 'c', 'o', 'm', '\0',
   /* "eduid.se", true */ 'e', 'd', 'u', 'i', 'd', '.', 's', 'e', '\0',
   /* "eduif.nl", false */ 'e', 'd', 'u', 'i', 'f', '.', 'n', 'l', '\0',
   /* "eduroam.no", true */ 'e', 'd', 'u', 'r', 'o', 'a', 'm', '.', 'n', 'o', '\0',
   /* "edusantorini.com", true */ 'e', 'd', 'u', 's', 'a', 'n', 't', 'o', 'r', 'i', 'n', 'i', '.', 'c', 'o', 'm', '\0',
   /* "edv-lehrgang.de", true */ 'e', 'd', 'v', '-', 'l', 'e', 'h', 'r', 'g', 'a', 'n', 'g', '.', 'd', 'e', '\0',
   /* "edvmesstec.de", true */ 'e', 'd', 'v', 'm', 'e', 's', 's', 't', 'e', 'c', '.', 'd', 'e', '\0',
-  /* "edwards.me.uk", true */ 'e', 'd', 'w', 'a', 'r', 'd', 's', '.', 'm', 'e', '.', 'u', 'k', '\0',
   /* "edwardsnowden.com", true */ 'e', 'd', 'w', 'a', 'r', 'd', 's', 'n', 'o', 'w', 'd', 'e', 'n', '.', 'c', 'o', 'm', '\0',
   /* "edxg.de", false */ 'e', 'd', 'x', 'g', '.', 'd', 'e', '\0',
   /* "edyou.eu", true */ 'e', 'd', 'y', 'o', 'u', '.', 'e', 'u', '\0',
   /* "edzilla.info", true */ 'e', 'd', 'z', 'i', 'l', 'l', 'a', '.', 'i', 'n', 'f', 'o', '\0',
   /* "ee-terminals.com", true */ 'e', 'e', '-', 't', 'e', 'r', 'm', 'i', 'n', 'a', 'l', 's', '.', 'c', 'o', 'm', '\0',
   /* "eelsden.net", true */ 'e', 'e', 'l', 's', 'd', 'e', 'n', '.', 'n', 'e', 't', '\0',
   /* "eelzak.nl", true */ 'e', 'e', 'l', 'z', 'a', 'k', '.', 'n', 'l', '\0',
   /* "eery.de", true */ 'e', 'e', 'r', 'y', '.', 'd', 'e', '\0',
@@ -3753,16 +3748,17 @@ static const char kSTSHostTable[] = {
   /* "emielraaijmakers.nl", true */ 'e', 'm', 'i', 'e', 'l', 'r', 'a', 'a', 'i', 'j', 'm', 'a', 'k', 'e', 'r', 's', '.', 'n', 'l', '\0',
   /* "emilong.com", true */ 'e', 'm', 'i', 'l', 'o', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "emilstahl.dk", true */ 'e', 'm', 'i', 'l', 's', 't', 'a', 'h', 'l', '.', 'd', 'k', '\0',
   /* "emilvarga.com", true */ 'e', 'm', 'i', 'l', 'v', 'a', 'r', 'g', 'a', '.', 'c', 'o', 'm', '\0',
   /* "emilyhorsman.com", true */ 'e', 'm', 'i', 'l', 'y', 'h', 'o', 'r', 's', 'm', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "emilyshepherd.me", true */ 'e', 'm', 'i', 'l', 'y', 's', 'h', 'e', 'p', 'h', 'e', 'r', 'd', '.', 'm', 'e', '\0',
   /* "eminovic.me", false */ 'e', 'm', 'i', 'n', 'o', 'v', 'i', 'c', '.', 'm', 'e', '\0',
   /* "emirabiz.com", false */ 'e', 'm', 'i', 'r', 'a', 'b', 'i', 'z', '.', 'c', 'o', 'm', '\0',
+  /* "emjimadhu.com", true */ 'e', 'm', 'j', 'i', 'm', 'a', 'd', 'h', 'u', '.', 'c', 'o', 'm', '\0',
   /* "emkanrecords.com", true */ 'e', 'm', 'k', 'a', 'n', 'r', 'e', 'c', 'o', 'r', 'd', 's', '.', 'c', 'o', 'm', '\0',
   /* "emkei.cz", true */ 'e', 'm', 'k', 'e', 'i', '.', 'c', 'z', '\0',
   /* "empathy.ca", true */ 'e', 'm', 'p', 'a', 't', 'h', 'y', '.', 'c', 'a', '\0',
   /* "empowerdb.com", true */ 'e', 'm', 'p', 'o', 'w', 'e', 'r', 'd', 'b', '.', 'c', 'o', 'm', '\0',
   /* "emprego.pt", true */ 'e', 'm', 'p', 'r', 'e', 'g', 'o', '.', 'p', 't', '\0',
   /* "emptypath.com", true */ 'e', 'm', 'p', 't', 'y', 'p', 'a', 't', 'h', '.', 'c', 'o', 'm', '\0',
   /* "emrenovation.com", true */ 'e', 'm', 'r', 'e', 'n', 'o', 'v', 'a', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "emyr.net", true */ 'e', 'm', 'y', 'r', '.', 'n', 'e', 't', '\0',
@@ -4336,17 +4332,16 @@ static const char kSTSHostTable[] = {
   /* "flirchi.com", false */ 'f', 'l', 'i', 'r', 'c', 'h', 'i', '.', 'c', 'o', 'm', '\0',
   /* "flixtor.net", true */ 'f', 'l', 'i', 'x', 't', 'o', 'r', '.', 'n', 'e', 't', '\0',
   /* "floaternet.com", true */ 'f', 'l', 'o', 'a', 't', 'e', 'r', 'n', 'e', 't', '.', 'c', 'o', 'm', '\0',
   /* "flocktofedora.org", true */ 'f', 'l', 'o', 'c', 'k', 't', 'o', 'f', 'e', 'd', 'o', 'r', 'a', '.', 'o', 'r', 'g', '\0',
   /* "floobits.com", true */ 'f', 'l', 'o', 'o', 'b', 'i', 't', 's', '.', 'c', 'o', 'm', '\0',
   /* "floorball-haunwoehr.de", true */ 'f', 'l', 'o', 'o', 'r', 'b', 'a', 'l', 'l', '-', 'h', 'a', 'u', 'n', 'w', 'o', 'e', 'h', 'r', '.', 'd', 'e', '\0',
   /* "floort.net", false */ 'f', 'l', 'o', 'o', 'r', 't', '.', 'n', 'e', 't', '\0',
   /* "florence.uk.net", true */ 'f', 'l', 'o', 'r', 'e', 'n', 'c', 'e', '.', 'u', 'k', '.', 'n', 'e', 't', '\0',
-  /* "florent-tatard.fr", true */ 'f', 'l', 'o', 'r', 'e', 'n', 't', '-', 't', 'a', 't', 'a', 'r', 'd', '.', 'f', 'r', '\0',
   /* "florian-bachelet.fr", true */ 'f', 'l', 'o', 'r', 'i', 'a', 'n', '-', 'b', 'a', 'c', 'h', 'e', 'l', 'e', 't', '.', 'f', 'r', '\0',
   /* "florian-schlachter.de", true */ 'f', 'l', 'o', 'r', 'i', 'a', 'n', '-', 's', 'c', 'h', 'l', 'a', 'c', 'h', 't', 'e', 'r', '.', 'd', 'e', '\0',
   /* "florian-thie.de", true */ 'f', 'l', 'o', 'r', 'i', 'a', 'n', '-', 't', 'h', 'i', 'e', '.', 'd', 'e', '\0',
   /* "floriankeller.de", true */ 'f', 'l', 'o', 'r', 'i', 'a', 'n', 'k', 'e', 'l', 'l', 'e', 'r', '.', 'd', 'e', '\0',
   /* "florianmitrea.uk", true */ 'f', 'l', 'o', 'r', 'i', 'a', 'n', 'm', 'i', 't', 'r', 'e', 'a', '.', 'u', 'k', '\0',
   /* "floridafieros.org", true */ 'f', 'l', 'o', 'r', 'i', 'd', 'a', 'f', 'i', 'e', 'r', 'o', 's', '.', 'o', 'r', 'g', '\0',
   /* "florismoo.nl", true */ 'f', 'l', 'o', 'r', 'i', 's', 'm', 'o', 'o', '.', 'n', 'l', '\0',
   /* "florismouwen.com", true */ 'f', 'l', 'o', 'r', 'i', 's', 'm', 'o', 'u', 'w', 'e', 'n', '.', 'c', 'o', 'm', '\0',
@@ -4363,16 +4358,17 @@ static const char kSTSHostTable[] = {
   /* "flurrybridge.com", true */ 'f', 'l', 'u', 'r', 'r', 'y', 'b', 'r', 'i', 'd', 'g', 'e', '.', 'c', 'o', 'm', '\0',
   /* "fluxent.de", false */ 'f', 'l', 'u', 'x', 'e', 'n', 't', '.', 'd', 'e', '\0',
   /* "fluxfingers.net", true */ 'f', 'l', 'u', 'x', 'f', 'i', 'n', 'g', 'e', 'r', 's', '.', 'n', 'e', 't', '\0',
   /* "fluxforge.com", true */ 'f', 'l', 'u', 'x', 'f', 'o', 'r', 'g', 'e', '.', 'c', 'o', 'm', '\0',
   /* "fluxoid.com", true */ 'f', 'l', 'u', 'x', 'o', 'i', 'd', '.', 'c', 'o', 'm', '\0',
   /* "fly.moe", true */ 'f', 'l', 'y', '.', 'm', 'o', 'e', '\0',
   /* "flynn.io", true */ 'f', 'l', 'y', 'n', 'n', '.', 'i', 'o', '\0',
   /* "flyserver.co.il", true */ 'f', 'l', 'y', 's', 'e', 'r', 'v', 'e', 'r', '.', 'c', 'o', '.', 'i', 'l', '\0',
+  /* "flyss.net", true */ 'f', 'l', 'y', 's', 's', '.', 'n', 'e', 't', '\0',
   /* "fm.ie", true */ 'f', 'm', '.', 'i', 'e', '\0',
   /* "fmarchal.fr", true */ 'f', 'm', 'a', 'r', 'c', 'h', 'a', 'l', '.', 'f', 'r', '\0',
   /* "fnb-griffinonline.com", true */ 'f', 'n', 'b', '-', 'g', 'r', 'i', 'f', 'f', 'i', 'n', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0',
   /* "fniephaus.com", true */ 'f', 'n', 'i', 'e', 'p', 'h', 'a', 'u', 's', '.', 'c', 'o', 'm', '\0',
   /* "fnordserver.eu", true */ 'f', 'n', 'o', 'r', 'd', 's', 'e', 'r', 'v', 'e', 'r', '.', 'e', 'u', '\0',
   /* "fnzc.co.nz", true */ 'f', 'n', 'z', 'c', '.', 'c', 'o', '.', 'n', 'z', '\0',
   /* "fobc-usa.org", true */ 'f', 'o', 'b', 'c', '-', 'u', 's', 'a', '.', 'o', 'r', 'g', '\0',
   /* "focalforest.com", true */ 'f', 'o', 'c', 'a', 'l', 'f', 'o', 'r', 'e', 's', 't', '.', 'c', 'o', 'm', '\0',
@@ -4563,16 +4559,17 @@ static const char kSTSHostTable[] = {
   /* "functions-online.com", true */ 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', 's', '-', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0',
   /* "fundacionhijosdelsol.org", true */ 'f', 'u', 'n', 'd', 'a', 'c', 'i', 'o', 'n', 'h', 'i', 'j', 'o', 's', 'd', 'e', 'l', 's', 'o', 'l', '.', 'o', 'r', 'g', '\0',
   /* "fundays.nl", true */ 'f', 'u', 'n', 'd', 'a', 'y', 's', '.', 'n', 'l', '\0',
   /* "funderburg.me", true */ 'f', 'u', 'n', 'd', 'e', 'r', 'b', 'u', 'r', 'g', '.', 'm', 'e', '\0',
   /* "fundingempire.com", true */ 'f', 'u', 'n', 'd', 'i', 'n', 'g', 'e', 'm', 'p', 'i', 'r', 'e', '.', 'c', 'o', 'm', '\0',
   /* "funi4u.com", true */ 'f', 'u', 'n', 'i', '4', 'u', '.', 'c', 'o', 'm', '\0',
   /* "funktionel.co", true */ 'f', 'u', 'n', 'k', 't', 'i', 'o', 'n', 'e', 'l', '.', 'c', 'o', '\0',
   /* "funny-stamps.de", true */ 'f', 'u', 'n', 'n', 'y', '-', 's', 't', 'a', 'm', 'p', 's', '.', 'd', 'e', '\0',
+  /* "funnyang.com", true */ 'f', 'u', 'n', 'n', 'y', 'a', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "funtime.kiev.ua", true */ 'f', 'u', 'n', 't', 'i', 'm', 'e', '.', 'k', 'i', 'e', 'v', '.', 'u', 'a', '\0',
   /* "furgo.love", true */ 'f', 'u', 'r', 'g', 'o', '.', 'l', 'o', 'v', 'e', '\0',
   /* "furkancaliskan.com", true */ 'f', 'u', 'r', 'k', 'a', 'n', 'c', 'a', 'l', 'i', 's', 'k', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "furnation.com", true */ 'f', 'u', 'r', 'n', 'a', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "furry.dk", true */ 'f', 'u', 'r', 'r', 'y', '.', 'd', 'k', '\0',
   /* "fusedrops.com", true */ 'f', 'u', 's', 'e', 'd', 'r', 'o', 'p', 's', '.', 'c', 'o', 'm', '\0',
   /* "fuseos.net", true */ 'f', 'u', 's', 'e', 'o', 's', '.', 'n', 'e', 't', '\0',
   /* "futos.de", true */ 'f', 'u', 't', 'o', 's', '.', 'd', 'e', '\0',
@@ -4753,17 +4750,16 @@ static const char kSTSHostTable[] = {
   /* "georgmayer.eu", true */ 'g', 'e', 'o', 'r', 'g', 'm', 'a', 'y', 'e', 'r', '.', 'e', 'u', '\0',
   /* "geoscan.aero", true */ 'g', 'e', 'o', 's', 'c', 'a', 'n', '.', 'a', 'e', 'r', 'o', '\0',
   /* "geraintwhite.co.uk", true */ 'g', 'e', 'r', 'a', 'i', 'n', 't', 'w', 'h', 'i', 't', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "gerardozamudio.mx", true */ 'g', 'e', 'r', 'a', 'r', 'd', 'o', 'z', 'a', 'm', 'u', 'd', 'i', 'o', '.', 'm', 'x', '\0',
   /* "gereon.ch", true */ 'g', 'e', 'r', 'e', 'o', 'n', '.', 'c', 'h', '\0',
   /* "germandarknes.net", true */ 'g', 'e', 'r', 'm', 'a', 'n', 'd', 'a', 'r', 'k', 'n', 'e', 's', '.', 'n', 'e', 't', '\0',
   /* "gernert-server.de", true */ 'g', 'e', 'r', 'n', 'e', 'r', 't', '-', 's', 'e', 'r', 'v', 'e', 'r', '.', 'd', 'e', '\0',
   /* "gerritcodereview.com", true */ 'g', 'e', 'r', 'r', 'i', 't', 'c', 'o', 'd', 'e', 'r', 'e', 'v', 'i', 'e', 'w', '.', 'c', 'o', 'm', '\0',
-  /* "gersting.net", true */ 'g', 'e', 'r', 's', 't', 'i', 'n', 'g', '.', 'n', 'e', 't', '\0',
   /* "gerwinvanderkamp.nl", true */ 'g', 'e', 'r', 'w', 'i', 'n', 'v', 'a', 'n', 'd', 'e', 'r', 'k', 'a', 'm', 'p', '.', 'n', 'l', '\0',
   /* "ges-bo.de", true */ 'g', 'e', 's', '-', 'b', 'o', '.', 'd', 'e', '\0',
   /* "geschwinder.net", true */ 'g', 'e', 's', 'c', 'h', 'w', 'i', 'n', 'd', 'e', 'r', '.', 'n', 'e', 't', '\0',
   /* "gesiwista.net", true */ 'g', 'e', 's', 'i', 'w', 'i', 's', 't', 'a', '.', 'n', 'e', 't', '\0',
   /* "get-asterisk.ru", true */ 'g', 'e', 't', '-', 'a', 's', 't', 'e', 'r', 'i', 's', 'k', '.', 'r', 'u', '\0',
   /* "get-erp.ru", true */ 'g', 'e', 't', '-', 'e', 'r', 'p', '.', 'r', 'u', '\0',
   /* "get-on.bid", true */ 'g', 'e', 't', '-', 'o', 'n', '.', 'b', 'i', 'd', '\0',
   /* "get4x.com", true */ 'g', 'e', 't', '4', 'x', '.', 'c', 'o', 'm', '\0',
@@ -4972,17 +4968,16 @@ static const char kSTSHostTable[] = {
   /* "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',
   /* "graf.re", true */ 'g', 'r', 'a', 'f', '.', 'r', 'e', '\0',
   /* "grafcaps.com", true */ 'g', 'r', 'a', 'f', 'c', 'a', 'p', 's', '.', 'c', 'o', 'm', '\0',
-  /* "graffen.dk", true */ 'g', 'r', 'a', 'f', 'f', 'e', 'n', '.', 'd', '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',
   /* "grandcapital.ru", true */ 'g', 'r', 'a', 'n', 'd', 'c', 'a', 'p', 'i', 't', 'a', 'l', '.', 'r', 'u', '\0',
   /* "grandlinecsk.ru", true */ 'g', 'r', 'a', 'n', 'd', 'l', 'i', 'n', 'e', 'c', 's', 'k', '.', 'r', 'u', '\0',
@@ -5035,16 +5030,17 @@ static const char kSTSHostTable[] = {
   /* "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',
   /* "greyline.se", true */ 'g', 'r', 'e', 'y', 'l', 'i', 'n', 'e', '.', 's', 'e', '\0',
   /* "greyskymedia.com", true */ 'g', 'r', 'e', 'y', 's', 'k', 'y', 'm', 'e', 'd', 'i', 'a', '.', 'c', 'o', 'm', '\0',
   /* "greysolutions.it", true */ 'g', 'r', 'e', 'y', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '.', 'i', 't', '\0',
   /* "greywizard.com", true */ 'g', 'r', 'e', 'y', 'w', 'i', 'z', 'a', 'r', 'd', '.', 'c', 'o', 'm', '\0',
   /* "grh.am", true */ 'g', 'r', 'h', '.', 'a', 'm', '\0',
+  /* "gribani.com", true */ 'g', 'r', 'i', 'b', 'a', 'n', 'i', '.', 'c', 'o', 'm', '\0',
   /* "grid2osm.org", true */ 'g', 'r', 'i', 'd', '2', 'o', 's', 'm', '.', 'o', 'r', 'g', '\0',
   /* "grieg-gaarden.no", true */ 'g', 'r', 'i', 'e', 'g', '-', 'g', 'a', 'a', 'r', 'd', 'e', 'n', '.', 'n', 'o', '\0',
   /* "grieg.com", true */ 'g', 'r', 'i', 'e', 'g', '.', 'c', 'o', 'm', '\0',
   /* "grieg.no", true */ 'g', 'r', 'i', 'e', 'g', '.', 'n', 'o', '\0',
   /* "griegfoundation.no", true */ 'g', 'r', 'i', 'e', 'g', 'f', 'o', 'u', 'n', 'd', 'a', 't', 'i', 'o', 'n', '.', 'n', 'o', '\0',
   /* "grieglogistics.no", true */ 'g', 'r', 'i', 'e', 'g', 'l', 'o', 'g', 'i', 's', 't', 'i', 'c', 's', '.', 'n', 'o', '\0',
   /* "griegshipbrokers.com", true */ 'g', 'r', 'i', 'e', 'g', 's', 'h', 'i', 'p', 'b', 'r', 'o', 'k', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0',
   /* "griegshipbrokers.no", true */ 'g', 'r', 'i', 'e', 'g', 's', 'h', 'i', 'p', 'b', 'r', 'o', 'k', 'e', 'r', 's', '.', 'n', 'o', '\0',
@@ -5109,16 +5105,17 @@ static const char kSTSHostTable[] = {
   /* "guildgearscore.cf", true */ 'g', 'u', 'i', 'l', 'd', 'g', 'e', 'a', 'r', 's', 'c', 'o', 'r', 'e', '.', 'c', 'f', '\0',
   /* "guillaume-leduc.fr", true */ 'g', 'u', 'i', 'l', 'l', 'a', 'u', 'm', 'e', '-', 'l', 'e', 'd', 'u', 'c', '.', 'f', 'r', '\0',
   /* "guillaumeperrin.io", true */ 'g', 'u', 'i', 'l', 'l', 'a', 'u', 'm', 'e', 'p', 'e', 'r', 'r', 'i', 'n', '.', 'i', 'o', '\0',
   /* "guinea-pig.co", true */ 'g', 'u', 'i', 'n', 'e', 'a', '-', 'p', 'i', 'g', '.', 'c', 'o', '\0',
   /* "guineapigmustach.es", true */ 'g', 'u', 'i', 'n', 'e', 'a', 'p', 'i', 'g', 'm', 'u', 's', 't', 'a', 'c', 'h', '.', 'e', 's', '\0',
   /* "guitarmarketing.com", false */ 'g', 'u', 'i', 't', 'a', 'r', 'm', 'a', 'r', 'k', 'e', 't', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "gulch.in.ua", true */ 'g', 'u', 'l', 'c', 'h', '.', 'i', 'n', '.', 'u', 'a', '\0',
   /* "gulenbase.no", true */ 'g', 'u', 'l', 'e', 'n', 'b', 'a', 's', 'e', '.', 'n', 'o', '\0',
+  /* "gulenet.com", true */ 'g', 'u', 'l', 'e', 'n', 'e', 't', '.', 'c', 'o', 'm', '\0',
   /* "gummibande.noip.me", true */ 'g', 'u', 'm', 'm', 'i', 'b', 'a', 'n', 'd', 'e', '.', 'n', 'o', 'i', 'p', '.', 'm', 'e', '\0',
   /* "gunnarhafdal.com", true */ 'g', 'u', 'n', 'n', 'a', 'r', 'h', 'a', 'f', 'd', 'a', 'l', '.', 'c', 'o', 'm', '\0',
   /* "gunnaro.com", true */ 'g', 'u', 'n', 'n', 'a', 'r', 'o', '.', 'c', 'o', 'm', '\0',
   /* "guntbert.net", true */ 'g', 'u', 'n', 't', 'b', 'e', 'r', 't', '.', 'n', 'e', 't', '\0',
   /* "gunwatch.co.uk", true */ 'g', 'u', 'n', 'w', 'a', 't', 'c', 'h', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "guoqiang.info", true */ 'g', 'u', 'o', 'q', 'i', 'a', 'n', 'g', '.', 'i', 'n', 'f', 'o', '\0',
   /* "guphi.net", true */ 'g', 'u', 'p', 'h', 'i', '.', 'n', 'e', 't', '\0',
   /* "gurkan.in", true */ 'g', 'u', 'r', 'k', 'a', 'n', '.', 'i', 'n', '\0',
@@ -5517,16 +5514,17 @@ static const char kSTSHostTable[] = {
   /* "hoshisato.com", true */ 'h', 'o', 's', 'h', 'i', 's', 'a', 't', 'o', '.', 'c', 'o', 'm', '\0',
   /* "hosiet.me", true */ 'h', 'o', 's', 'i', 'e', 't', '.', 'm', 'e', '\0',
   /* "hosmussynergie.nl", false */ 'h', 'o', 's', 'm', 'u', 's', 's', 'y', 'n', 'e', 'r', 'g', 'i', 'e', '.', 'n', 'l', '\0',
   /* "hospitalhomelottery.org", true */ 'h', 'o', 's', 'p', 'i', 't', 'a', 'l', 'h', 'o', 'm', 'e', 'l', 'o', 't', 't', 'e', 'r', 'y', '.', 'o', 'r', 'g', '\0',
   /* "hostam.link", true */ 'h', 'o', 's', 't', 'a', 'm', '.', 'l', 'i', 'n', 'k', '\0',
   /* "hostanalyticsconsulting.com", true */ 'h', 'o', 's', 't', 'a', 'n', 'a', 'l', 'y', 't', 'i', 'c', 's', 'c', 'o', 'n', 's', 'u', 'l', 't', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "hosteasy.nl", true */ 'h', 'o', 's', 't', 'e', 'a', 's', 'y', '.', 'n', 'l', '\0',
   /* "hosted-oswa.org", true */ 'h', 'o', 's', 't', 'e', 'd', '-', 'o', 's', 'w', 'a', '.', 'o', 'r', 'g', '\0',
+  /* "hosted4u.de", true */ 'h', 'o', 's', 't', 'e', 'd', '4', 'u', '.', 'd', 'e', '\0',
   /* "hostedbgp.net", true */ 'h', 'o', 's', 't', 'e', 'd', 'b', 'g', 'p', '.', 'n', 'e', 't', '\0',
   /* "hostedtalkgadget.google.com", true */ 'h', 'o', 's', 't', 'e', 'd', 't', 'a', 'l', 'k', 'g', 'a', 'd', 'g', 'e', 't', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0',
   /* "hostelite.com", true */ 'h', 'o', 's', 't', 'e', 'l', 'i', 't', 'e', '.', 'c', 'o', 'm', '\0',
   /* "hostfission.com", true */ 'h', 'o', 's', 't', 'f', 'i', 's', 's', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "hostingactive.it", true */ 'h', 'o', 's', 't', 'i', 'n', 'g', 'a', 'c', 't', 'i', 'v', 'e', '.', 'i', 't', '\0',
   /* "hostingfj.com", true */ 'h', 'o', 's', 't', 'i', 'n', 'g', 'f', 'j', '.', 'c', 'o', 'm', '\0',
   /* "hostinghelp.guru", true */ 'h', 'o', 's', 't', 'i', 'n', 'g', 'h', 'e', 'l', 'p', '.', 'g', 'u', 'r', 'u', '\0',
   /* "hostinginnederland.nl", true */ 'h', 'o', 's', 't', 'i', 'n', 'g', 'i', 'n', 'n', 'e', 'd', 'e', 'r', 'l', 'a', 'n', 'd', '.', 'n', 'l', '\0',
@@ -5589,17 +5587,16 @@ static const char kSTSHostTable[] = {
   /* "httpswatch.ca", true */ 'h', 't', 't', 'p', 's', 'w', 'a', 't', 'c', 'h', '.', 'c', 'a', '\0',
   /* "httpswatch.com", true */ 'h', 't', 't', 'p', 's', 'w', 'a', 't', 'c', 'h', '.', 'c', 'o', 'm', '\0',
   /* "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',
   /* "hunter.io", true */ 'h', 'u', 'n', 't', 'e', 'r', '.', 'i', 'o', '\0',
@@ -5785,17 +5782,16 @@ static const char kSTSHostTable[] = {
   /* "immunicity.date", true */ 'i', 'm', 'm', 'u', 'n', 'i', 'c', 'i', 't', 'y', '.', 'd', 'a', 't', 'e', '\0',
   /* "immunicity.eu", true */ 'i', 'm', 'm', 'u', 'n', 'i', 'c', 'i', 't', 'y', '.', 'e', 'u', '\0',
   /* "immunicity.host", true */ 'i', 'm', 'm', 'u', 'n', 'i', 'c', 'i', 't', 'y', '.', 'h', 'o', 's', 't', '\0',
   /* "immunicity.online", true */ 'i', 'm', 'm', 'u', 'n', 'i', 'c', 'i', 't', 'y', '.', 'o', 'n', 'l', 'i', 'n', 'e', '\0',
   /* "immunicity.rocks", true */ 'i', 'm', 'm', 'u', 'n', 'i', 'c', 'i', 't', 'y', '.', 'r', 'o', 'c', 'k', 's', '\0',
   /* "immunicity.win", true */ 'i', 'm', 'm', 'u', 'n', 'i', 'c', 'i', 't', 'y', '.', 'w', 'i', 'n', '\0',
   /* "imoni-blog.net", true */ 'i', 'm', 'o', 'n', 'i', '-', 'b', 'l', 'o', 'g', '.', 'n', 'e', 't', '\0',
   /* "imoto.me", true */ 'i', 'm', 'o', 't', 'o', '.', 'm', 'e', '\0',
-  /* "imouyang.com", true */ 'i', 'm', 'o', 'u', 'y', 'a', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "impact.health.nz", true */ 'i', 'm', 'p', 'a', 'c', 't', '.', 'h', 'e', 'a', 'l', 't', 'h', '.', 'n', 'z', '\0',
   /* "impex.com.bd", true */ 'i', 'm', 'p', 'e', 'x', '.', 'c', 'o', 'm', '.', 'b', 'd', '\0',
   /* "imppac.de", true */ 'i', 'm', 'p', 'p', 'a', 'c', '.', 'd', 'e', '\0',
   /* "impyus.com", true */ 'i', 'm', 'p', 'y', 'u', 's', '.', 'c', 'o', 'm', '\0',
   /* "imququ.com", true */ 'i', 'm', 'q', 'u', 'q', 'u', '.', 'c', 'o', 'm', '\0',
   /* "imreh.net", true */ 'i', 'm', 'r', 'e', 'h', '.', 'n', 'e', 't', '\0',
   /* "imrejonk.nl", true */ 'i', 'm', 'r', 'e', 'j', 'o', 'n', 'k', '.', 'n', 'l', '\0',
   /* "in-depthoutdoors.com", true */ 'i', 'n', '-', 'd', 'e', 'p', 't', 'h', 'o', 'u', 't', 'd', 'o', 'o', 'r', 's', '.', 'c', 'o', 'm', '\0',
@@ -5814,16 +5810,17 @@ static const char kSTSHostTable[] = {
   /* "incparadise.net", true */ 'i', 'n', 'c', 'p', 'a', 'r', 'a', 'd', 'i', 's', 'e', '.', 'n', 'e', 't', '\0',
   /* "incubos.org", true */ 'i', 'n', 'c', 'u', 'b', 'o', 's', '.', 'o', 'r', 'g', '\0',
   /* "indicateurs-flash.fr", true */ 'i', 'n', 'd', 'i', 'c', 'a', 't', 'e', 'u', 'r', 's', '-', 'f', 'l', 'a', 's', 'h', '.', 'f', 'r', '\0',
   /* "indiecert.net", false */ 'i', 'n', 'd', 'i', 'e', 'c', 'e', 'r', 't', '.', 'n', 'e', 't', '\0',
   /* "indievelopment.nl", true */ 'i', 'n', 'd', 'i', 'e', 'v', 'e', 'l', 'o', 'p', 'm', 'e', 'n', 't', '.', 'n', 'l', '\0',
   /* "indigosakura.com", true */ 'i', 'n', 'd', 'i', 'g', 'o', 's', 'a', 'k', 'u', 'r', 'a', '.', 'c', 'o', 'm', '\0',
   /* "inditip.com", true */ 'i', 'n', 'd', 'i', 't', 'i', 'p', '.', 'c', 'o', 'm', '\0',
   /* "indovinabank.com.vn", true */ 'i', 'n', 'd', 'o', 'v', 'i', 'n', 'a', 'b', 'a', 'n', 'k', '.', 'c', 'o', 'm', '.', 'v', 'n', '\0',
+  /* "indredouglas.me", true */ 'i', 'n', 'd', 'r', 'e', 'd', 'o', 'u', 'g', 'l', 'a', 's', '.', 'm', 'e', '\0',
   /* "indusfastremit-ca.com", true */ 'i', 'n', 'd', 'u', 's', 'f', 'a', 's', 't', 'r', 'e', 'm', 'i', 't', '-', 'c', 'a', '.', 'c', 'o', 'm', '\0',
   /* "indusfastremit-us.com", true */ 'i', 'n', 'd', 'u', 's', 'f', 'a', 's', 't', 'r', 'e', 'm', 'i', 't', '-', 'u', 's', '.', 'c', 'o', 'm', '\0',
   /* "indusfastremit.com", true */ 'i', 'n', 'd', 'u', 's', 'f', 'a', 's', 't', 'r', 'e', 'm', 'i', 't', '.', 'c', 'o', 'm', '\0',
   /* "industreiler.com", true */ 'i', 'n', 'd', 'u', 's', 't', 'r', 'e', 'i', 'l', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "indybay.org", true */ 'i', 'n', 'd', 'y', 'b', 'a', 'y', '.', 'o', 'r', 'g', '\0',
   /* "ineed.coffee", true */ 'i', 'n', 'e', 'e', 'd', '.', 'c', 'o', 'f', 'f', 'e', 'e', '\0',
   /* "inertianetworks.com", true */ 'i', 'n', 'e', 'r', 't', 'i', 'a', 'n', 'e', 't', 'w', 'o', 'r', 'k', 's', '.', 'c', 'o', 'm', '\0',
   /* "inexpensivecomputers.net", true */ 'i', 'n', 'e', 'x', 'p', 'e', 'n', 's', 'i', 'v', 'e', 'c', 'o', 'm', 'p', 'u', 't', 'e', 'r', 's', '.', 'n', 'e', 't', '\0',
@@ -5852,17 +5849,16 @@ static const char kSTSHostTable[] = {
   /* "initrd.net", true */ 'i', 'n', 'i', 't', 'r', 'd', '.', 'n', 'e', 't', '\0',
   /* "inkbunny.net", true */ 'i', 'n', 'k', 'b', 'u', 'n', 'n', 'y', '.', 'n', 'e', 't', '\0',
   /* "inked-guy.de", false */ 'i', 'n', 'k', 'e', 'd', '-', 'g', 'u', 'y', '.', 'd', 'e', '\0',
   /* "inksay.com", true */ 'i', 'n', 'k', 's', 'a', 'y', '.', 'c', 'o', 'm', '\0',
   /* "inkthemes.com", true */ 'i', 'n', 'k', 't', 'h', 'e', 'm', 'e', 's', '.', 'c', 'o', 'm', '\0',
   /* "inline-sport.cz", true */ 'i', 'n', 'l', 'i', 'n', 'e', '-', 's', 'p', 'o', 'r', 't', '.', 'c', 'z', '\0',
   /* "innermostparts.org", true */ 'i', 'n', 'n', 'e', 'r', 'm', 'o', 's', 't', 'p', 'a', 'r', 't', 's', '.', 'o', 'r', 'g', '\0',
   /* "innoloop.com", true */ 'i', 'n', 'n', 'o', 'l', 'o', 'o', 'p', '.', 'c', 'o', 'm', '\0',
-  /* "innophate-security.com", true */ 'i', 'n', 'n', 'o', 'p', 'h', 'a', 't', 'e', '-', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0',
   /* "innovaptor.at", true */ 'i', 'n', 'n', 'o', 'v', 'a', 'p', 't', 'o', 'r', '.', 'a', 't', '\0',
   /* "innovaptor.com", true */ 'i', 'n', 'n', 'o', 'v', 'a', 'p', 't', 'o', 'r', '.', 'c', 'o', 'm', '\0',
   /* "inoa8.com", true */ 'i', 'n', 'o', 'a', '8', '.', 'c', 'o', 'm', '\0',
   /* "inovatec.com", true */ 'i', 'n', 'o', 'v', 'a', 't', 'e', 'c', '.', 'c', 'o', 'm', '\0',
   /* "inquisitive.io", true */ 'i', 'n', 'q', 'u', 'i', 's', 'i', 't', 'i', 'v', 'e', '.', 'i', 'o', '\0',
   /* "insane-bullets.com", true */ 'i', 'n', 's', 'a', 'n', 'e', '-', 'b', 'u', 'l', 'l', 'e', 't', 's', '.', 'c', 'o', 'm', '\0',
   /* "insertcoins.net", true */ 'i', 'n', 's', 'e', 'r', 't', 'c', 'o', 'i', 'n', 's', '.', 'n', 'e', 't', '\0',
   /* "insideaudit.com", true */ 'i', 'n', 's', 'i', 'd', 'e', 'a', 'u', 'd', 'i', 't', '.', 'c', 'o', 'm', '\0',
@@ -5900,16 +5896,17 @@ static const char kSTSHostTable[] = {
   /* "interasistmen.se", true */ 'i', 'n', 't', 'e', 'r', 'a', 's', 'i', 's', 't', 'm', 'e', 'n', '.', 's', 'e', '\0',
   /* "intercom.io", true */ 'i', 'n', 't', 'e', 'r', 'c', 'o', 'm', '.', 'i', 'o', '\0',
   /* "interflores.com.br", true */ 'i', 'n', 't', 'e', 'r', 'f', 'l', 'o', 'r', 'e', 's', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0',
   /* "interfug.de", true */ 'i', 'n', 't', 'e', 'r', 'f', 'u', 'g', '.', 'd', 'e', '\0',
   /* "interim-cto.de", true */ 'i', 'n', 't', 'e', 'r', 'i', 'm', '-', 'c', 't', 'o', '.', 'd', 'e', '\0',
   /* "interisaudit.com", true */ 'i', 'n', 't', 'e', 'r', 'i', 's', 'a', 'u', 'd', 'i', 't', '.', 'c', 'o', 'm', '\0',
   /* "interleucina.org", true */ 'i', 'n', 't', 'e', 'r', 'l', 'e', 'u', 'c', 'i', 'n', 'a', '.', 'o', 'r', 'g', '\0',
   /* "intermedinet.nl", true */ 'i', 'n', 't', 'e', 'r', 'm', 'e', 'd', 'i', 'n', 'e', 't', '.', 'n', 'l', '\0',
+  /* "internect.co.za", true */ 'i', 'n', 't', 'e', 'r', 'n', 'e', 'c', 't', '.', 'c', 'o', '.', 'z', 'a', '\0',
   /* "internet-pornografie.de", true */ 'i', 'n', 't', 'e', 'r', 'n', 'e', 't', '-', 'p', 'o', 'r', 'n', 'o', 'g', 'r', 'a', 'f', 'i', 'e', '.', 'd', 'e', '\0',
   /* "internetbank.swedbank.se", true */ 'i', 'n', 't', 'e', 'r', 'n', 'e', 't', 'b', 'a', 'n', 'k', '.', 's', 'w', 'e', 'd', 'b', 'a', 'n', 'k', '.', 's', 'e', '\0',
   /* "internetbugbounty.org", true */ 'i', 'n', 't', 'e', 'r', 'n', 'e', 't', 'b', 'u', 'g', 'b', 'o', 'u', 'n', 't', 'y', '.', 'o', 'r', 'g', '\0',
   /* "internetdentalalliance.com", true */ 'i', 'n', 't', 'e', 'r', 'n', 'e', 't', 'd', 'e', 'n', 't', 'a', 'l', 'a', 'l', 'l', 'i', 'a', 'n', 'c', 'e', '.', 'c', 'o', 'm', '\0',
   /* "internethering.de", true */ 'i', 'n', 't', 'e', 'r', 'n', 'e', 't', 'h', 'e', 'r', 'i', 'n', 'g', '.', 'd', 'e', '\0',
   /* "internetofdon.gs", true */ 'i', 'n', 't', 'e', 'r', 'n', 'e', 't', 'o', 'f', 'd', 'o', 'n', '.', 'g', 's', '\0',
   /* "internetpro.me", true */ 'i', 'n', 't', 'e', 'r', 'n', 'e', 't', 'p', 'r', 'o', '.', 'm', 'e', '\0',
   /* "internetstaff.com", true */ 'i', 'n', 't', 'e', 'r', 'n', 'e', 't', 's', 't', 'a', 'f', 'f', '.', 'c', 'o', 'm', '\0',
@@ -6191,17 +6188,16 @@ static const char kSTSHostTable[] = {
   /* "janokacer.sk", true */ 'j', 'a', 'n', 'o', 'k', 'a', 'c', 'e', 'r', '.', 's', 'k', '\0',
   /* "janosh.com", true */ 'j', 'a', 'n', 'o', 's', 'h', '.', 'c', 'o', 'm', '\0',
   /* "janverlaan.nl", true */ 'j', 'a', 'n', 'v', 'e', 'r', 'l', 'a', 'a', 'n', '.', 'n', 'l', '\0',
   /* "jaot.info", true */ 'j', 'a', 'o', 't', '.', 'i', 'n', 'f', 'o', '\0',
   /* "jap-nope.de", true */ 'j', 'a', 'p', '-', 'n', 'o', 'p', 'e', '.', 'd', 'e', '\0',
   /* "japan-foods.co.uk", true */ 'j', 'a', 'p', 'a', 'n', '-', 'f', 'o', 'o', 'd', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "japan4you.org", true */ 'j', 'a', 'p', 'a', 'n', '4', 'y', 'o', 'u', '.', 'o', 'r', 'g', '\0',
   /* "japaniac.de", true */ 'j', 'a', 'p', 'a', 'n', 'i', 'a', 'c', '.', 'd', 'e', '\0',
-  /* "jardins-utopie.net", true */ 'j', 'a', 'r', 'd', 'i', 'n', 's', '-', 'u', 't', 'o', 'p', 'i', 'e', '.', 'n', 'e', 't', '\0',
   /* "jaredbates.net", false */ 'j', 'a', 'r', 'e', 'd', 'b', 'a', 't', 'e', 's', '.', 'n', 'e', 't', '\0',
   /* "jaredfernandez.com", true */ 'j', 'a', 'r', 'e', 'd', 'f', 'e', 'r', 'n', 'a', 'n', 'd', 'e', 'z', '.', 'c', 'o', 'm', '\0',
   /* "jarl.ninja", true */ 'j', 'a', 'r', 'l', '.', 'n', 'i', 'n', 'j', 'a', '\0',
   /* "jarondl.net", true */ 'j', 'a', 'r', 'o', 'n', 'd', 'l', '.', 'n', 'e', 't', '\0',
   /* "jarrettgraham.com", true */ 'j', 'a', 'r', 'r', 'e', 't', 't', 'g', 'r', 'a', 'h', 'a', 'm', '.', 'c', 'o', 'm', '\0',
   /* "jarsater.com", true */ 'j', 'a', 'r', 's', 'a', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "jasonamorrow.com", true */ 'j', 'a', 's', 'o', 'n', 'a', 'm', 'o', 'r', 'r', 'o', 'w', '.', 'c', 'o', 'm', '\0',
   /* "jasonian-photo.com", true */ 'j', 'a', 's', 'o', 'n', 'i', 'a', 'n', '-', 'p', 'h', 'o', 't', 'o', '.', 'c', 'o', 'm', '\0',
@@ -6211,16 +6207,17 @@ static const char kSTSHostTable[] = {
   /* "jav-collective.com", true */ 'j', 'a', 'v', '-', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'v', 'e', '.', 'c', 'o', 'm', '\0',
   /* "javachip.win", true */ 'j', 'a', 'v', 'a', 'c', 'h', 'i', 'p', '.', 'w', 'i', 'n', '\0',
   /* "javalestari.com", true */ 'j', 'a', 'v', 'a', 'l', 'e', 's', 't', 'a', 'r', 'i', '.', 'c', 'o', 'm', '\0',
   /* "javelinsms.com", true */ 'j', 'a', 'v', 'e', 'l', 'i', 'n', 's', 'm', 's', '.', 'c', 'o', 'm', '\0',
   /* "jayf.de", true */ 'j', 'a', 'y', 'f', '.', 'd', 'e', '\0',
   /* "jayharris.ca", true */ 'j', 'a', 'y', 'h', 'a', 'r', 'r', 'i', 's', '.', 'c', 'a', '\0',
   /* "jaylen.com.ar", true */ 'j', 'a', 'y', 'l', 'e', 'n', '.', 'c', 'o', 'm', '.', 'a', 'r', '\0',
   /* "jaymecd.rocks", true */ 'j', 'a', 'y', 'm', 'e', 'c', 'd', '.', 'r', 'o', 'c', 'k', 's', '\0',
+  /* "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',
   /* "jbfp.dk", true */ 'j', 'b', 'f', 'p', '.', 'd', 'k', '\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',
   /* "jcoscia.com", true */ 'j', 'c', 'o', 's', 'c', 'i', 'a', '.', 'c', 'o', 'm', '\0',
@@ -6434,17 +6431,16 @@ static const char kSTSHostTable[] = {
   /* "justupdate.me", true */ 'j', 'u', 's', 't', 'u', 'p', 'd', 'a', 't', 'e', '.', 'm', 'e', '\0',
   /* "justyy.com", true */ 'j', 'u', 's', 't', 'y', 'y', '.', 'c', 'o', 'm', '\0',
   /* "jutella.de", true */ 'j', 'u', 't', 'e', 'l', 'l', 'a', '.', 'd', 'e', '\0',
   /* "juxstempel.de", true */ 'j', 'u', 'x', 's', 't', 'e', 'm', 'p', 'e', 'l', '.', 'd', 'e', '\0',
   /* "juzgalo.com", true */ 'j', 'u', 'z', 'g', 'a', 'l', 'o', '.', 'c', 'o', 'm', '\0',
   /* "jva-wuerzburg.de", true */ 'j', 'v', 'a', '-', 'w', 'u', 'e', 'r', 'z', 'b', 'u', 'r', 'g', '.', 'd', 'e', '\0',
   /* "jwilsson.com", true */ 'j', 'w', 'i', 'l', 's', 's', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "jwnotifier.org", true */ 'j', 'w', 'n', 'o', 't', 'i', 'f', 'i', 'e', 'r', '.', 'o', 'r', 'g', '\0',
-  /* "jym.fit", true */ 'j', 'y', 'm', '.', 'f', 'i', 't', '\0',
   /* "jyoti-fairworks.org", true */ 'j', 'y', 'o', 't', 'i', '-', 'f', 'a', 'i', 'r', 'w', 'o', 'r', 'k', 's', '.', 'o', 'r', 'g', '\0',
   /* "jysperm.me", true */ 'j', 'y', 's', 'p', 'e', 'r', 'm', '.', 'm', 'e', '\0',
   /* "jznet.org", true */ 'j', 'z', 'n', 'e', 't', '.', 'o', 'r', 'g', '\0',
   /* "k-netz.de", true */ 'k', '-', 'n', 'e', 't', 'z', '.', 'd', 'e', '\0',
   /* "k-tube.com", true */ 'k', '-', 't', 'u', 'b', 'e', '.', 'c', 'o', 'm', '\0',
   /* "k2mts.org", true */ 'k', '2', 'm', 't', 's', '.', 'o', 'r', 'g', '\0',
   /* "kaangenc.me", true */ 'k', 'a', 'a', 'n', 'g', 'e', 'n', 'c', '.', 'm', 'e', '\0',
   /* "kaasbijwijn.nl", true */ 'k', 'a', 'a', 's', 'b', 'i', 'j', 'w', 'i', 'j', 'n', '.', 'n', 'l', '\0',
@@ -6482,17 +6478,16 @@ static const char kSTSHostTable[] = {
   /* "kana.me", true */ 'k', 'a', 'n', 'a', '.', 'm', 'e', '\0',
   /* "kanaete-uranai.com", true */ 'k', 'a', 'n', 'a', 'e', 't', 'e', '-', 'u', 'r', 'a', 'n', 'a', 'i', '.', 'c', 'o', 'm', '\0',
   /* "kanal-tv-haensch.de", true */ 'k', 'a', 'n', 'a', 'l', '-', 't', 'v', '-', 'h', 'a', 'e', 'n', 's', 'c', 'h', '.', 'd', 'e', '\0',
   /* "kanar.nl", true */ 'k', 'a', 'n', 'a', 'r', '.', 'n', 'l', '\0',
   /* "kandalife.com", true */ 'k', 'a', 'n', 'd', 'a', 'l', 'i', 'f', 'e', '.', 'c', 'o', 'm', '\0',
   /* "kanehusky.com", true */ 'k', 'a', 'n', 'e', 'h', 'u', 's', 'k', 'y', '.', 'c', 'o', 'm', '\0',
   /* "kaneo-gmbh.de", true */ 'k', 'a', 'n', 'e', 'o', '-', 'g', 'm', 'b', 'h', '.', 'd', 'e', '\0',
   /* "kangarooislandholidayaccommodation.com.au", true */ 'k', 'a', 'n', 'g', 'a', 'r', 'o', 'o', 'i', 's', 'l', 'a', 'n', 'd', 'h', 'o', 'l', 'i', 'd', 'a', 'y', 'a', 'c', 'c', 'o', 'm', 'm', 'o', 'd', 'a', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
-  /* "kaniklani.co.za", true */ 'k', 'a', 'n', 'i', 'k', 'l', 'a', 'n', 'i', '.', 'c', 'o', '.', 'z', 'a', '\0',
   /* "kanna.cf", true */ 'k', 'a', 'n', 'n', 'a', '.', 'c', 'f', '\0',
   /* "kannchen.de", true */ 'k', 'a', 'n', 'n', 'c', 'h', 'e', 'n', '.', 'd', 'e', '\0',
   /* "kanotijd.nl", true */ 'k', 'a', 'n', 'o', 't', 'i', 'j', 'd', '.', 'n', 'l', '\0',
   /* "kantankye.nl", true */ 'k', 'a', 'n', 't', 'a', 'n', 'k', 'y', 'e', '.', 'n', 'l', '\0',
   /* "kantanmt.com", true */ 'k', 'a', 'n', 't', 'a', 'n', 'm', 't', '.', 'c', 'o', 'm', '\0',
   /* "kantorosobisty.pl", true */ 'k', 'a', 'n', 't', 'o', 'r', 'o', 's', 'o', 'b', 'i', 's', 't', 'y', '.', 'p', 'l', '\0',
   /* "kany.me", true */ 'k', 'a', 'n', 'y', '.', 'm', 'e', '\0',
   /* "kanzashi.com", true */ 'k', 'a', 'n', 'z', 'a', 's', 'h', 'i', '.', 'c', 'o', 'm', '\0',
@@ -6586,17 +6581,16 @@ static const char kSTSHostTable[] = {
   /* "kendra.io", true */ 'k', 'e', 'n', 'd', 'r', 'a', '.', 'i', 'o', '\0',
   /* "kendu.si", true */ 'k', 'e', 'n', 'd', 'u', '.', 's', 'i', '\0',
   /* "kengilmour.com", true */ 'k', 'e', 'n', 'g', 'i', 'l', 'm', 'o', 'u', 'r', '.', 'c', 'o', 'm', '\0',
   /* "kenguntokku.jp", true */ 'k', 'e', 'n', 'g', 'u', 'n', 't', 'o', 'k', 'k', 'u', '.', 'j', 'p', '\0',
   /* "kenkoelectric.com", true */ 'k', 'e', 'n', 'k', 'o', 'e', 'l', 'e', 'c', 't', 'r', 'i', 'c', '.', 'c', 'o', 'm', '\0',
   /* "kennedy.ie", true */ 'k', 'e', 'n', 'n', 'e', 'd', 'y', '.', 'i', 'e', '\0',
   /* "kenners.org", true */ 'k', 'e', 'n', 'n', 'e', 'r', 's', '.', 'o', 'r', 'g', '\0',
   /* "kennethaasan.no", true */ 'k', 'e', 'n', 'n', 'e', 't', 'h', 'a', 'a', 's', 'a', 'n', '.', 'n', 'o', '\0',
-  /* "kennethlim.me", true */ 'k', 'e', 'n', 'n', 'e', 't', 'h', 'l', 'i', 'm', '.', 'm', 'e', '\0',
   /* "kenny-peck.com", true */ 'k', 'e', 'n', 'n', 'y', '-', 'p', 'e', 'c', 'k', '.', 'c', 'o', 'm', '\0',
   /* "kenoschwalb.com", true */ 'k', 'e', 'n', 'o', 's', 'c', 'h', 'w', 'a', 'l', 'b', '.', 'c', 'o', 'm', '\0',
   /* "kentec.net", true */ 'k', 'e', 'n', 't', 'e', 'c', '.', 'n', 'e', 't', '\0',
   /* "keops-spine.fr", true */ 'k', 'e', 'o', 'p', 's', '-', 's', 'p', 'i', 'n', 'e', '.', 'f', 'r', '\0',
   /* "keops-spine.us", true */ 'k', 'e', 'o', 'p', 's', '-', 's', 'p', 'i', 'n', 'e', '.', 'u', 's', '\0',
   /* "kepkonyvtar.hu", true */ 'k', 'e', 'p', 'k', 'o', 'n', 'y', 'v', 't', 'a', 'r', '.', 'h', 'u', '\0',
   /* "kepler-seminar.de", true */ 'k', 'e', 'p', 'l', 'e', 'r', '-', 's', 'e', 'm', 'i', 'n', 'a', 'r', '.', 'd', 'e', '\0',
   /* "kerforhome.com", true */ 'k', 'e', 'r', 'f', 'o', 'r', 'h', 'o', 'm', 'e', '.', 'c', 'o', 'm', '\0',
@@ -6685,17 +6679,16 @@ static const char kSTSHostTable[] = {
   /* "kirinas.com", true */ 'k', 'i', 'r', 'i', 'n', 'a', 's', '.', 'c', 'o', 'm', '\0',
   /* "kirkovsky.com", true */ 'k', 'i', 'r', 'k', 'o', 'v', 's', 'k', 'y', '.', 'c', 'o', 'm', '\0',
   /* "kirsch-gestaltung.de", true */ 'k', 'i', 'r', 's', 'c', 'h', '-', 'g', 'e', 's', 't', 'a', 'l', 't', 'u', 'n', 'g', '.', 'd', 'e', '\0',
   /* "kirschbaum.me", true */ 'k', 'i', 'r', 's', 'c', 'h', 'b', 'a', 'u', 'm', '.', 'm', 'e', '\0',
   /* "kirstenbos.ca", true */ 'k', 'i', 'r', 's', 't', 'e', 'n', 'b', 'o', 's', '.', 'c', 'a', '\0',
   /* "kirstin-peters.de", true */ 'k', 'i', 'r', 's', 't', 'i', 'n', '-', 'p', 'e', 't', 'e', 'r', 's', '.', 'd', 'e', '\0',
   /* "kis-toitoidixi.de", true */ 'k', 'i', 's', '-', 't', 'o', 'i', 't', 'o', 'i', 'd', 'i', 'x', 'i', '.', 'd', 'e', '\0',
   /* "kisskiss.ch", true */ 'k', 'i', 's', 's', 'k', 'i', 's', 's', '.', 'c', 'h', '\0',
-  /* "kisstyle.ru", true */ 'k', 'i', 's', 's', 't', 'y', 'l', 'e', '.', 'r', 'u', '\0',
   /* "kita.id", true */ 'k', 'i', 't', 'a', '.', 'i', 'd', '\0',
   /* "kitabgaul.com", true */ 'k', 'i', 't', 'a', 'b', 'g', 'a', 'u', 'l', '.', 'c', 'o', 'm', '\0',
   /* "kitestar.co.uk", true */ 'k', 'i', 't', 'e', 's', 't', 'a', 'r', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "kitsostech.com", true */ 'k', 'i', 't', 's', 'o', 's', 't', 'e', 'c', 'h', '.', 'c', 'o', 'm', '\0',
   /* "kittmedia.com", true */ 'k', 'i', 't', 't', 'm', 'e', 'd', 'i', 'a', '.', 'c', 'o', 'm', '\0',
   /* "kjaer.io", true */ 'k', 'j', 'a', 'e', 'r', '.', 'i', 'o', '\0',
   /* "kjarni.cc", true */ 'k', 'j', 'a', 'r', 'n', 'i', '.', 'c', 'c', '\0',
   /* "kjarrval.is", true */ 'k', 'j', 'a', 'r', 'r', 'v', 'a', 'l', '.', 'i', 's', '\0',
@@ -6841,16 +6834,17 @@ static const char kSTSHostTable[] = {
   /* "kredite24.de", true */ 'k', 'r', 'e', 'd', 'i', 't', 'e', '2', '4', '.', 'd', 'e', '\0',
   /* "kreditkacs.cz", true */ 'k', 'r', 'e', 'd', 'i', 't', 'k', 'a', 'c', 's', '.', 'c', 'z', '\0',
   /* "kreen.org", true */ 'k', 'r', 'e', 'e', 'n', '.', 'o', 'r', 'g', '\0',
   /* "kriechel.de", true */ 'k', 'r', 'i', 'e', 'c', 'h', 'e', 'l', '.', 'd', 'e', '\0',
   /* "kriegskindernothilfe.de", true */ 'k', 'r', 'i', 'e', 'g', 's', 'k', 'i', 'n', 'd', 'e', 'r', 'n', 'o', 't', 'h', 'i', 'l', 'f', 'e', '.', 'd', 'e', '\0',
   /* "kriptosec.com", true */ 'k', 'r', 'i', 'p', 't', 'o', 's', 'e', 'c', '.', 'c', 'o', 'm', '\0',
   /* "krislamoureux.com", true */ 'k', 'r', 'i', 's', 'l', 'a', 'm', 'o', 'u', 'r', 'e', 'u', 'x', '.', 'c', 'o', 'm', '\0',
   /* "krisstarkey.co.uk", true */ 'k', 'r', 'i', 's', 's', 't', 'a', 'r', 'k', 'e', 'y', '.', 'c', 'o', '.', 'u', 'k', '\0',
+  /* "kristikala.nl", true */ 'k', 'r', 'i', 's', 't', 'i', 'k', 'a', 'l', 'a', '.', 'n', 'l', '\0',
   /* "kristinbailey.com", true */ 'k', 'r', 'i', 's', 't', 'i', 'n', 'b', 'a', 'i', 'l', 'e', 'y', '.', 'c', 'o', 'm', '\0',
   /* "kristofferkoch.com", true */ 'k', 'r', 'i', 's', 't', 'o', 'f', 'f', 'e', 'r', 'k', 'o', 'c', 'h', '.', 'c', 'o', 'm', '\0',
   /* "krizek.cc", true */ 'k', 'r', 'i', 'z', 'e', 'k', '.', 'c', 'c', '\0',
   /* "krizevci.info", true */ 'k', 'r', 'i', 'z', 'e', 'v', 'c', 'i', '.', 'i', 'n', 'f', 'o', '\0',
   /* "krk-media.pl", true */ 'k', 'r', 'k', '-', 'm', 'e', 'd', 'i', 'a', '.', 'p', 'l', '\0',
   /* "krmeni.cz", true */ 'k', 'r', 'm', 'e', 'n', 'i', '.', 'c', 'z', '\0',
   /* "kromonos.net", true */ 'k', 'r', 'o', 'm', 'o', 'n', 'o', 's', '.', 'n', 'e', 't', '\0',
   /* "krony.de", true */ 'k', 'r', 'o', 'n', 'y', '.', 'd', 'e', '\0',
@@ -6935,17 +6929,16 @@ static const char kSTSHostTable[] = {
   /* "lacasseroy.com", true */ 'l', 'a', 'c', 'a', 's', 's', 'e', 'r', 'o', 'y', '.', 'c', 'o', 'm', '\0',
   /* "lacaverne.nl", true */ 'l', 'a', 'c', 'a', 'v', 'e', 'r', 'n', 'e', '.', 'n', 'l', '\0',
   /* "lacentral.com", false */ 'l', 'a', 'c', 'e', 'n', 't', 'r', 'a', 'l', '.', 'c', 'o', 'm', '\0',
   /* "lacicloud.net", true */ 'l', 'a', 'c', 'i', 'c', 'l', 'o', 'u', 'd', '.', 'n', 'e', 't', '\0',
   /* "lacledeslan.com", false */ 'l', 'a', 'c', 'l', 'e', 'd', 'e', 's', 'l', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "lacliniquefinanciere.com", true */ 'l', 'a', 'c', 'l', 'i', 'n', 'i', 'q', 'u', 'e', 'f', 'i', 'n', 'a', 'n', 'c', 'i', 'e', 'r', 'e', '.', 'c', 'o', 'm', '\0',
   /* "lacocinadelila.com", true */ 'l', 'a', 'c', 'o', 'c', 'i', 'n', 'a', 'd', 'e', 'l', 'i', 'l', 'a', '.', 'c', 'o', 'm', '\0',
   /* "lacyc3.eu", true */ 'l', 'a', 'c', 'y', 'c', '3', '.', 'e', 'u', '\0',
-  /* "laextra.mx", true */ 'l', 'a', 'e', 'x', 't', 'r', 'a', '.', 'm', 'x', '\0',
   /* "lafeemam.fr", true */ 'l', 'a', 'f', 'e', 'e', 'm', 'a', 'm', '.', 'f', 'r', '\0',
   /* "lafillepolyvalente.ca", true */ 'l', 'a', 'f', 'i', 'l', 'l', 'e', 'p', 'o', 'l', 'y', 'v', 'a', 'l', 'e', 'n', 't', 'e', '.', 'c', 'a', '\0',
   /* "lafillepolyvalente.com", true */ 'l', 'a', 'f', 'i', 'l', 'l', 'e', 'p', 'o', 'l', 'y', 'v', 'a', 'l', 'e', 'n', 't', 'e', '.', 'c', 'o', 'm', '\0',
   /* "lafka.org", true */ 'l', 'a', 'f', 'k', 'a', '.', 'o', 'r', 'g', '\0',
   /* "lafkor.de", true */ 'l', 'a', 'f', 'k', 'o', 'r', '.', 'd', 'e', '\0',
   /* "lagarderob.ru", false */ 'l', 'a', 'g', 'a', 'r', 'd', 'e', 'r', 'o', 'b', '.', 'r', 'u', '\0',
   /* "lagerauftrag.info", true */ 'l', 'a', 'g', 'e', 'r', 'a', 'u', 'f', 't', 'r', 'a', 'g', '.', 'i', 'n', 'f', 'o', '\0',
   /* "lagier.xyz", true */ 'l', 'a', 'g', 'i', 'e', 'r', '.', 'x', 'y', 'z', '\0',
@@ -7283,16 +7276,17 @@ static const char kSTSHostTable[] = {
   /* "lloyd-day.me", true */ 'l', 'l', 'o', 'y', 'd', '-', 'd', 'a', 'y', '.', 'm', 'e', '\0',
   /* "lm-pumpen.de", true */ 'l', 'm', '-', 'p', 'u', 'm', 'p', 'e', 'n', '.', 'd', 'e', '\0',
   /* "lmddgtfy.net", true */ 'l', 'm', 'd', 'd', 'g', 't', 'f', 'y', '.', 'n', 'e', 't', '\0',
   /* "lmerza.com", true */ 'l', 'm', 'e', 'r', 'z', 'a', '.', 'c', 'o', 'm', '\0',
   /* "lmintlcx.com", true */ 'l', 'm', 'i', 'n', 't', 'l', 'c', 'x', '.', 'c', 'o', 'm', '\0',
   /* "lmkts.com", true */ 'l', 'm', 'k', 't', 's', '.', 'c', 'o', 'm', '\0',
   /* "lmmtfy.io", true */ 'l', 'm', 'm', 't', 'f', 'y', '.', 'i', 'o', '\0',
   /* "lmsptfy.com", true */ 'l', 'm', 's', 'p', 't', 'f', 'y', '.', 'c', 'o', 'm', '\0',
+  /* "lntu.org", true */ 'l', 'n', 't', 'u', '.', 'o', 'r', 'g', '\0',
   /* "lnx.li", true */ 'l', 'n', 'x', '.', 'l', 'i', '\0',
   /* "loacg.com", true */ 'l', 'o', 'a', 'c', 'g', '.', 'c', 'o', 'm', '\0',
   /* "loadlow.me", true */ 'l', 'o', 'a', 'd', 'l', 'o', 'w', '.', 'm', 'e', '\0',
   /* "loadso.me", true */ 'l', 'o', 'a', 'd', 's', 'o', '.', 'm', 'e', '\0',
   /* "loancompare.co.za", true */ 'l', 'o', 'a', 'n', 'c', 'o', 'm', 'p', 'a', 'r', 'e', '.', 'c', 'o', '.', 'z', 'a', '\0',
   /* "loansonline.today", true */ 'l', 'o', 'a', 'n', 's', 'o', 'n', 'l', 'i', 'n', 'e', '.', 't', 'o', 'd', 'a', 'y', '\0',
   /* "loanstreet.be", true */ 'l', 'o', 'a', 'n', 's', 't', 'r', 'e', 'e', 't', '.', 'b', 'e', '\0',
   /* "loanstreet.nl", true */ 'l', 'o', 'a', 'n', 's', 't', 'r', 'e', 'e', 't', '.', 'n', 'l', '\0',
@@ -7786,16 +7780,17 @@ static const char kSTSHostTable[] = {
   /* "mcnext.net", true */ 'm', 'c', 'n', 'e', 'x', 't', '.', 'n', 'e', 't', '\0',
   /* "mcooperlaw.com", true */ 'm', 'c', 'o', 'o', 'p', 'e', 'r', 'l', 'a', 'w', '.', 'c', 'o', 'm', '\0',
   /* "mcpart.land", true */ 'm', 'c', 'p', 'a', 'r', 't', '.', 'l', 'a', 'n', 'd', '\0',
   /* "mcrn.jp", true */ 'm', 'c', 'r', 'n', '.', 'j', 'p', '\0',
   /* "mctherealm.net", true */ 'm', 'c', 't', 'h', 'e', 'r', 'e', 'a', 'l', 'm', '.', 'n', 'e', 't', '\0',
   /* "mcuong.tk", false */ 'm', 'c', 'u', 'o', 'n', 'g', '.', 't', 'k', '\0',
   /* "mcyukon.com", true */ 'm', 'c', 'y', 'u', 'k', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "md5file.com", true */ 'm', 'd', '5', 'f', 'i', 'l', 'e', '.', 'c', 'o', 'm', '\0',
+  /* "md5hashing.net", true */ 'm', 'd', '5', 'h', 'a', 's', 'h', 'i', 'n', 'g', '.', 'n', 'e', 't', '\0',
   /* "mdcloudpracticesolutions.com", true */ 'm', 'd', 'c', 'l', 'o', 'u', 'd', 'p', 'r', 'a', 'c', 't', 'i', 'c', 'e', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '.', 'c', 'o', 'm', '\0',
   /* "mdcloudps.com", true */ 'm', 'd', 'c', 'l', 'o', 'u', 'd', 'p', 's', '.', 'c', 'o', 'm', '\0',
   /* "mdek.at", true */ 'm', 'd', 'e', 'k', '.', 'a', 't', '\0',
   /* "mdkr.nl", true */ 'm', 'd', 'k', 'r', '.', 'n', 'l', '\0',
   /* "mdma.net", true */ 'm', 'd', 'm', 'a', '.', 'n', 'e', 't', '\0',
   /* "mdmed.clinic", true */ 'm', 'd', 'm', 'e', 'd', '.', 'c', 'l', 'i', 'n', 'i', 'c', '\0',
   /* "mdns.eu", true */ 'm', 'd', 'n', 's', '.', 'e', 'u', '\0',
   /* "mdpraha.cz", true */ 'm', 'd', 'p', 'r', 'a', 'h', 'a', '.', 'c', 'z', '\0',
@@ -8243,17 +8238,16 @@ static const char kSTSHostTable[] = {
   /* "movember.com", false */ 'm', 'o', 'v', 'e', 'm', 'b', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "movepin.com", true */ 'm', 'o', 'v', 'e', 'p', 'i', 'n', '.', 'c', 'o', 'm', '\0',
   /* "movie4kto.site", true */ 'm', 'o', 'v', 'i', 'e', '4', 'k', 't', 'o', '.', 's', 'i', 't', 'e', '\0',
   /* "moviedollars.com", true */ 'm', 'o', 'v', 'i', 'e', 'd', 'o', 'l', 'l', 'a', 'r', 's', '.', 'c', 'o', 'm', '\0',
   /* "movinglogistics.nl", false */ 'm', 'o', 'v', 'i', 'n', 'g', 'l', 'o', 'g', 'i', 's', 't', 'i', 'c', 's', '.', 'n', 'l', '\0',
   /* "movlib.org", true */ 'm', 'o', 'v', 'l', 'i', 'b', '.', 'o', 'r', 'g', '\0',
   /* "moy-gorod.od.ua", true */ 'm', 'o', 'y', '-', 'g', 'o', 'r', 'o', 'd', '.', 'o', 'd', '.', 'u', 'a', '\0',
   /* "moylen.eu", true */ 'm', 'o', 'y', 'l', 'e', 'n', '.', 'e', 'u', '\0',
-  /* "mozoa.net", true */ 'm', 'o', 'z', 'o', 'a', '.', 'n', 'e', 't', '\0',
   /* "mozzilla.cz", true */ 'm', 'o', 'z', 'z', 'i', 'l', 'l', 'a', '.', 'c', 'z', '\0',
   /* "mp3gratuiti.com", true */ 'm', 'p', '3', 'g', 'r', 'a', 't', 'u', 'i', 't', 'i', '.', 'c', 'o', 'm', '\0',
   /* "mpc-hc.org", true */ 'm', 'p', 'c', '-', 'h', 'c', '.', 'o', 'r', 'g', '\0',
   /* "mpcompliance.com", true */ 'm', 'p', 'c', 'o', 'm', 'p', 'l', 'i', 'a', 'n', 'c', 'e', '.', 'c', 'o', 'm', '\0',
   /* "mpetroff.net", true */ 'm', 'p', 'e', 't', 'r', 'o', 'f', 'f', '.', 'n', 'e', 't', '\0',
   /* "mpintaamalabanna.it", true */ 'm', 'p', 'i', 'n', 't', 'a', 'a', 'm', 'a', 'l', 'a', 'b', 'a', 'n', 'n', 'a', '.', 'i', 't', '\0',
   /* "mplant.io", true */ 'm', 'p', 'l', 'a', 'n', 't', '.', 'i', 'o', '\0',
   /* "mplicka.cz", true */ 'm', 'p', 'l', 'i', 'c', 'k', 'a', '.', 'c', 'z', '\0',
@@ -8343,17 +8337,16 @@ static const char kSTSHostTable[] = {
   /* "mx.search.yahoo.com", false */ 'm', 'x', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0',
   /* "my-hps.de", true */ 'm', 'y', '-', 'h', 'p', 's', '.', 'd', 'e', '\0',
   /* "my-pawnshop.com.ua", false */ 'm', 'y', '-', 'p', 'a', 'w', 'n', 's', 'h', 'o', 'p', '.', 'c', 'o', 'm', '.', 'u', 'a', '\0',
   /* "my.onlime.ch", false */ 'm', 'y', '.', 'o', 'n', 'l', 'i', 'm', 'e', '.', 'c', 'h', '\0',
   /* "my.xero.com", false */ 'm', 'y', '.', 'x', 'e', 'r', 'o', '.', 'c', 'o', 'm', '\0',
   /* "myaccount.google.com", true */ 'm', 'y', 'a', 'c', 'c', 'o', 'u', 'n', 't', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0',
   /* "myadself.com", true */ 'm', 'y', 'a', 'd', 's', 'e', 'l', 'f', '.', 'c', 'o', 'm', '\0',
   /* "myandroidtools.cc", true */ 'm', 'y', 'a', 'n', 'd', 'r', 'o', 'i', 'd', 't', 'o', 'o', 'l', 's', '.', 'c', 'c', '\0',
-  /* "myartsjournal.com", true */ 'm', 'y', 'a', 'r', 't', 's', 'j', 'o', 'u', 'r', 'n', 'a', 'l', '.', 'c', 'o', 'm', '\0',
   /* "mybb.com", true */ 'm', 'y', 'b', 'b', '.', 'c', 'o', 'm', '\0',
   /* "mybeautyjobs.de", true */ 'm', 'y', 'b', 'e', 'a', 'u', 't', 'y', 'j', 'o', 'b', 's', '.', 'd', 'e', '\0',
   /* "mybuilderinlondon.co.uk", true */ 'm', 'y', 'b', 'u', 'i', 'l', 'd', 'e', 'r', 'i', 'n', 'l', 'o', 'n', 'd', 'o', 'n', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "mycieokien.info", false */ 'm', 'y', 'c', 'i', 'e', 'o', 'k', 'i', 'e', 'n', '.', 'i', 'n', 'f', 'o', '\0',
   /* "myclientsplus.com", true */ 'm', 'y', 'c', 'l', 'i', 'e', 'n', 't', 's', 'p', 'l', 'u', 's', '.', 'c', 'o', 'm', '\0',
   /* "myconan.net", true */ 'm', 'y', 'c', 'o', 'n', 'a', 'n', '.', 'n', 'e', 't', '\0',
   /* "mydnaresults.com", true */ 'm', 'y', 'd', 'n', 'a', 'r', 'e', 's', 'u', 'l', 't', 's', '.', 'c', 'o', 'm', '\0',
   /* "mydnatest.com", true */ 'm', 'y', 'd', 'n', 'a', 't', 'e', 's', 't', '.', 'c', 'o', 'm', '\0',
@@ -8538,17 +8531,16 @@ static const char kSTSHostTable[] = {
   /* "nedim-accueil.fr", true */ 'n', 'e', 'd', 'i', 'm', '-', 'a', 'c', 'c', 'u', 'e', 'i', 'l', '.', 'f', 'r', '\0',
   /* "nedraconsult.ru", true */ 'n', 'e', 'd', 'r', 'a', 'c', 'o', 'n', 's', 'u', 'l', 't', '.', 'r', 'u', '\0',
   /* "neel.ch", true */ 'n', 'e', 'e', 'l', '.', 'c', 'h', '\0',
   /* "neels.ch", true */ 'n', 'e', 'e', 'l', 's', '.', 'c', 'h', '\0',
   /* "neer.io", true */ 'n', 'e', 'e', 'r', '.', 'i', 'o', '\0',
   /* "nefertitis.cz", true */ 'n', 'e', 'f', 'e', 'r', 't', 'i', 't', 'i', 's', '.', 'c', 'z', '\0',
   /* "neftebitum-kngk.ru", true */ 'n', 'e', 'f', 't', 'e', 'b', 'i', 't', 'u', 'm', '-', 'k', 'n', 'g', 'k', '.', 'r', 'u', '\0',
   /* "neg9.org", false */ 'n', 'e', 'g', '9', '.', 'o', 'r', 'g', '\0',
-  /* "negai.moe", true */ 'n', 'e', 'g', 'a', 'i', '.', 'm', 'o', 'e', '\0',
   /* "neglecteddiseases.gov", true */ 'n', 'e', 'g', 'l', 'e', 'c', 't', 'e', 'd', 'd', 'i', 's', 'e', 'a', 's', 'e', 's', '.', 'g', 'o', 'v', '\0',
   /* "neilgreen.net", true */ 'n', 'e', 'i', 'l', 'g', 'r', 'e', 'e', 'n', '.', 'n', 'e', 't', '\0',
   /* "neillans.co.uk", true */ 'n', 'e', 'i', 'l', 'l', 'a', 'n', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "neillans.com", true */ 'n', 'e', 'i', 'l', 'l', 'a', 'n', 's', '.', 'c', 'o', 'm', '\0',
   /* "neilwynne.com", false */ 'n', 'e', 'i', 'l', 'w', 'y', 'n', 'n', 'e', '.', 'c', 'o', 'm', '\0',
   /* "neko.li", true */ 'n', 'e', 'k', 'o', '.', 'l', 'i', '\0',
   /* "nekomimi.pl", true */ 'n', 'e', 'k', 'o', 'm', 'i', 'm', 'i', '.', 'p', 'l', '\0',
   /* "nekosc.com", true */ 'n', 'e', 'k', 'o', 's', 'c', '.', 'c', 'o', 'm', '\0',
@@ -8736,17 +8728,16 @@ static const char kSTSHostTable[] = {
   /* "nilrem.org", true */ 'n', 'i', 'l', 'r', 'e', 'm', '.', 'o', 'r', 'g', '\0',
   /* "nimeshjm.com", true */ 'n', 'i', 'm', 'e', 's', 'h', 'j', 'm', '.', 'c', 'o', 'm', '\0',
   /* "ninchat.com", true */ 'n', 'i', 'n', 'c', 'h', 'a', 't', '.', 'c', 'o', 'm', '\0',
   /* "nine-hells.net", false */ 'n', 'i', 'n', 'e', '-', 'h', 'e', 'l', 'l', 's', '.', 'n', 'e', 't', '\0',
   /* "ninebennink.com", true */ 'n', 'i', 'n', 'e', 'b', 'e', 'n', 'n', 'i', 'n', 'k', '.', 'c', 'o', 'm', '\0',
   /* "ninespec.com", true */ 'n', 'i', 'n', 'e', 's', 'p', 'e', 'c', '.', 'c', 'o', 'm', '\0',
   /* "ninjan.co", true */ 'n', 'i', 'n', 'j', 'a', 'n', '.', 'c', 'o', '\0',
   /* "ninthfloor.org", true */ 'n', 'i', 'n', 't', 'h', 'f', 'l', 'o', 'o', 'r', '.', 'o', 'r', 'g', '\0',
-  /* "ninux.ch", false */ 'n', 'i', 'n', 'u', 'x', '.', 'c', 'h', '\0',
   /* "niouininon.eu", true */ 'n', 'i', 'o', 'u', 'i', 'n', 'i', 'n', 'o', 'n', '.', 'e', 'u', '\0',
   /* "nippon-oku.com", true */ 'n', 'i', 'p', 'p', 'o', 'n', '-', 'o', 'k', 'u', '.', 'c', 'o', 'm', '\0',
   /* "nippon.fr", true */ 'n', 'i', 'p', 'p', 'o', 'n', '.', 'f', 'r', '\0',
   /* "nitrix.me", true */ 'n', 'i', 't', 'r', 'i', 'x', '.', 'm', 'e', '\0',
   /* "nitropur.com", true */ 'n', 'i', 't', 'r', 'o', 'p', 'u', 'r', '.', 'c', 'o', 'm', '\0',
   /* "nitropur.de", true */ 'n', 'i', 't', 'r', 'o', 'p', 'u', 'r', '.', 'd', 'e', '\0',
   /* "nivi.ca", true */ 'n', 'i', 'v', 'i', '.', 'c', 'a', '\0',
   /* "nixmag.net", true */ 'n', 'i', 'x', 'm', 'a', 'g', '.', 'n', 'e', 't', '\0',
@@ -8958,31 +8949,32 @@ static const char kSTSHostTable[] = {
   /* "okmx.de", true */ 'o', 'k', 'm', 'x', '.', 'd', 'e', '\0',
   /* "okonetwork.org.uk", true */ 'o', 'k', 'o', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0',
   /* "okusiassociates.com", true */ 'o', 'k', 'u', 's', 'i', 'a', 's', 's', 'o', 'c', 'i', 'a', 't', 'e', 's', '.', 'c', 'o', 'm', '\0',
   /* "olanderflorist.com", true */ 'o', 'l', 'a', 'n', 'd', 'e', 'r', 'f', 'l', 'o', 'r', 'i', 's', 't', '.', 'c', 'o', 'm', '\0',
   /* "olcso-vps-szerver.hu", true */ 'o', 'l', 'c', 's', 'o', '-', 'v', 'p', 's', '-', 's', 'z', 'e', 'r', 'v', 'e', 'r', '.', 'h', 'u', '\0',
   /* "oldoakflorist.com", true */ 'o', 'l', 'd', 'o', 'a', 'k', 'f', 'l', 'o', 'r', 'i', 's', 't', '.', 'c', 'o', 'm', '\0',
   /* "olegon.ru", true */ 'o', 'l', 'e', 'g', 'o', 'n', '.', 'r', 'u', '\0',
   /* "oleksii.name", true */ 'o', 'l', 'e', 'k', 's', 'i', 'i', '.', 'n', 'a', 'm', 'e', '\0',
-  /* "oliveraiedelabastideblanche.fr", true */ 'o', 'l', 'i', 'v', 'e', 'r', 'a', 'i', 'e', 'd', 'e', 'l', 'a', 'b', 'a', 's', 't', 'i', 'd', 'e', 'b', 'l', 'a', 'n', 'c', 'h', 'e', '.', 'f', 'r', '\0',
+  /* "oliver-pietsch.de", false */ 'o', 'l', 'i', 'v', 'e', 'r', '-', 'p', 'i', 'e', 't', 's', 'c', 'h', '.', 'd', 'e', '\0',
   /* "oliverfaircliff.com", true */ 'o', 'l', 'i', 'v', 'e', 'r', 'f', 'a', 'i', 'r', 'c', 'l', 'i', 'f', 'f', '.', 'c', 'o', 'm', '\0',
   /* "olivierlemoal.fr", true */ 'o', 'l', 'i', 'v', 'i', 'e', 'r', 'l', 'e', 'm', 'o', 'a', 'l', '.', 'f', 'r', '\0',
   /* "ollies.cloud", true */ 'o', 'l', 'l', 'i', 'e', 's', '.', 'c', 'l', 'o', 'u', 'd', '\0',
   /* "olliespage.net", true */ 'o', 'l', 'l', 'i', 'e', 's', 'p', 'a', 'g', 'e', '.', 'n', 'e', 't', '\0',
   /* "ollning.com", true */ 'o', 'l', 'l', 'n', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "olmari.fi", true */ 'o', 'l', 'm', 'a', 'r', 'i', '.', 'f', 'i', '\0',
   /* "ols.io", true */ 'o', 'l', 's', '.', 'i', 'o', '\0',
   /* "olymp-arts.world", true */ 'o', 'l', 'y', 'm', 'p', '-', 'a', 'r', 't', 's', '.', 'w', 'o', 'r', 'l', 'd', '\0',
   /* "omacostudio.com", true */ 'o', 'm', 'a', 'c', 'o', 's', 't', 'u', 'd', 'i', 'o', '.', 'c', 'o', 'm', '\0',
   /* "omifind.com", true */ 'o', 'm', 'i', 'f', 'i', 'n', 'd', '.', 'c', 'o', 'm', '\0',
   /* "omitech.co.uk", true */ 'o', 'm', 'i', 't', 'e', 'c', 'h', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "omnienviro.com", true */ 'o', 'm', 'n', 'i', 'e', 'n', 'v', 'i', 'r', 'o', '.', 'c', 'o', 'm', '\0',
   /* "omnienviro.com.au", true */ 'o', 'm', 'n', 'i', 'e', 'n', 'v', 'i', 'r', 'o', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
   /* "omniverse.ru", true */ 'o', 'm', 'n', 'i', 'v', 'e', 'r', 's', 'e', '.', 'r', 'u', '\0',
+  /* "omskit.ru", true */ 'o', 'm', 's', 'k', 'i', 't', '.', 'r', 'u', '\0',
   /* "onaboat.se", true */ 'o', 'n', 'a', 'b', 'o', 'a', 't', '.', 's', 'e', '\0',
   /* "onarto.com", true */ 'o', 'n', 'a', 'r', 't', 'o', '.', 'c', 'o', 'm', '\0',
   /* "ondrej.org", true */ 'o', 'n', 'd', 'r', 'e', 'j', '.', 'o', 'r', 'g', '\0',
   /* "one---line.com", true */ 'o', 'n', 'e', '-', '-', '-', 'l', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0',
   /* "one-pe.com", true */ 'o', 'n', 'e', '-', 'p', 'e', '.', 'c', 'o', 'm', '\0',
   /* "onearth.one", true */ 'o', 'n', 'e', 'a', 'r', 't', 'h', '.', 'o', 'n', 'e', '\0',
   /* "oneazcu.com", false */ 'o', 'n', 'e', 'a', 'z', 'c', 'u', '.', 'c', 'o', 'm', '\0',
   /* "oneclickloan.com", true */ 'o', 'n', 'e', 'c', 'l', 'i', 'c', 'k', 'l', 'o', 'a', 'n', '.', 'c', 'o', 'm', '\0',
@@ -9151,16 +9143,17 @@ static const char kSTSHostTable[] = {
   /* "own3d.ch", true */ 'o', 'w', 'n', '3', 'd', '.', 'c', 'h', '\0',
   /* "ownit.se", false */ 'o', 'w', 'n', 'i', 't', '.', 's', 'e', '\0',
   /* "oxygaming.com", true */ 'o', 'x', 'y', 'g', 'a', 'm', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "oxymc.com", true */ 'o', 'x', 'y', 'm', 'c', '.', 'c', 'o', 'm', '\0',
   /* "oxynux.xyz", true */ 'o', 'x', 'y', 'n', 'u', 'x', '.', 'x', 'y', 'z', '\0',
   /* "oyste.in", true */ 'o', 'y', 's', 't', 'e', '.', 'i', 'n', '\0',
   /* "oznamovacipovinnost.cz", true */ 'o', 'z', 'n', 'a', 'm', 'o', 'v', 'a', 'c', 'i', 'p', 'o', 'v', 'i', 'n', 'n', 'o', 's', 't', '.', 'c', 'z', '\0',
   /* "ozvolvo.org", true */ 'o', 'z', 'v', 'o', 'l', 'v', 'o', '.', 'o', 'r', 'g', '\0',
+  /* "p-s-b.com", true */ 'p', '-', 's', '-', 'b', '.', 'c', 'o', 'm', '\0',
   /* "p1984.nl", false */ 'p', '1', '9', '8', '4', '.', 'n', 'l', '\0',
   /* "p1c.pw", true */ 'p', '1', 'c', '.', 'p', 'w', '\0',
   /* "p3in.com", true */ 'p', '3', 'i', 'n', '.', 'c', 'o', 'm', '\0',
   /* "pa-w.de", true */ 'p', 'a', '-', 'w', '.', 'd', 'e', '\0',
   /* "pace.car", true */ 'p', 'a', 'c', 'e', '.', 'c', 'a', 'r', '\0',
   /* "packagist.org", false */ 'p', 'a', 'c', 'k', 'a', 'g', 'i', 's', 't', '.', 'o', 'r', 'g', '\0',
   /* "packaware.com", true */ 'p', 'a', 'c', 'k', 'a', 'w', 'a', 'r', 'e', '.', 'c', 'o', 'm', '\0',
   /* "packer.io", true */ 'p', 'a', 'c', 'k', 'e', 'r', '.', 'i', 'o', '\0',
@@ -9203,17 +9196,16 @@ static const char kSTSHostTable[] = {
   /* "pap.la", false */ 'p', 'a', 'p', '.', 'l', 'a', '\0',
   /* "papa-webzeit.de", true */ 'p', 'a', 'p', 'a', '-', 'w', 'e', 'b', 'z', 'e', 'i', 't', '.', 'd', 'e', '\0',
   /* "papalytics.com", true */ 'p', 'a', 'p', 'a', 'l', 'y', 't', 'i', 'c', 's', '.', 'c', 'o', 'm', '\0',
   /* "papayapythons.com", true */ 'p', 'a', 'p', 'a', 'y', 'a', 'p', 'y', 't', 'h', 'o', 'n', 's', '.', 'c', 'o', 'm', '\0',
   /* "paper-republic.org", true */ 'p', 'a', 'p', 'e', 'r', '-', 'r', 'e', 'p', 'u', 'b', 'l', 'i', 'c', '.', 'o', 'r', 'g', '\0',
   /* "papercrunch.io", true */ 'p', 'a', 'p', 'e', 'r', 'c', 'r', 'u', 'n', 'c', 'h', '.', 'i', 'o', '\0',
   /* "papermasters.com", true */ 'p', 'a', 'p', 'e', 'r', 'm', 'a', 's', 't', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0',
   /* "paperturn.com", true */ 'p', 'a', 'p', 'e', 'r', 't', 'u', 'r', 'n', '.', 'c', 'o', 'm', '\0',
-  /* "paperwork.co.za", true */ 'p', 'a', 'p', 'e', 'r', 'w', 'o', 'r', 'k', '.', 'c', 'o', '.', 'z', 'a', '\0',
   /* "paraborsa.net", true */ 'p', 'a', 'r', 'a', 'b', 'o', 'r', 's', 'a', '.', 'n', 'e', 't', '\0',
   /* "paradiselost.com", true */ 'p', 'a', 'r', 'a', 'd', 'i', 's', 'e', 'l', 'o', 's', 't', '.', 'c', 'o', 'm', '\0',
   /* "paradoxdesigns.org", true */ 'p', 'a', 'r', 'a', 'd', 'o', 'x', 'd', 'e', 's', 'i', 'g', 'n', 's', '.', 'o', 'r', 'g', '\0',
   /* "paragon.com.sg", false */ 'p', 'a', 'r', 'a', 'g', 'o', 'n', '.', 'c', 'o', 'm', '.', 's', 'g', '\0',
   /* "paragonie.com", false */ 'p', 'a', 'r', 'a', 'g', 'o', 'n', 'i', 'e', '.', 'c', 'o', 'm', '\0',
   /* "paragreen.net", true */ 'p', 'a', 'r', 'a', 'g', 'r', 'e', 'e', 'n', '.', 'n', 'e', 't', '\0',
   /* "paranoxer.hu", true */ 'p', 'a', 'r', 'a', 'n', 'o', 'x', 'e', 'r', '.', 'h', 'u', '\0',
   /* "parasitologyclub.org", true */ 'p', 'a', 'r', 'a', 's', 'i', 't', 'o', 'l', 'o', 'g', 'y', 'c', 'l', 'u', 'b', '.', 'o', 'r', 'g', '\0',
@@ -9459,17 +9451,16 @@ static const char kSTSHostTable[] = {
   /* "phoebe.co.nz", true */ 'p', 'h', 'o', 'e', 'b', 'e', '.', 'c', 'o', '.', 'n', 'z', '\0',
   /* "phoenix.dj", true */ 'p', 'h', 'o', 'e', 'n', 'i', 'x', '.', 'd', 'j', '\0',
   /* "phoenixlogan.com", true */ 'p', 'h', 'o', 'e', 'n', 'i', 'x', 'l', 'o', 'g', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "phone-service-center.de", true */ 'p', 'h', 'o', 'n', 'e', '-', 's', 'e', 'r', 'v', 'i', 'c', 'e', '-', 'c', 'e', 'n', 't', 'e', 'r', '.', 'd', 'e', '\0',
   /* "phormance.com", true */ 'p', 'h', 'o', 'r', 'm', 'a', 'n', 'c', 'e', '.', 'c', 'o', 'm', '\0',
   /* "phosagro.biz", true */ 'p', 'h', 'o', 's', 'a', 'g', 'r', 'o', '.', 'b', 'i', 'z', '\0',
   /* "phosagro.ru", true */ 'p', 'h', 'o', 's', 'a', 'g', 'r', 'o', '.', 'r', 'u', '\0',
   /* "photo.org.il", true */ 'p', 'h', 'o', 't', 'o', '.', 'o', 'r', 'g', '.', 'i', 'l', '\0',
-  /* "photoancestry.com", true */ 'p', 'h', 'o', 't', 'o', 'a', 'n', 'c', 'e', 's', 't', 'r', 'y', '.', 'c', 'o', 'm', '\0',
   /* "photoartelle.com", true */ 'p', 'h', 'o', 't', 'o', 'a', 'r', 't', 'e', 'l', 'l', 'e', '.', 'c', 'o', 'm', '\0',
   /* "photoblogverona.com", true */ 'p', 'h', 'o', 't', 'o', 'b', 'l', 'o', 'g', 'v', 'e', 'r', 'o', 'n', 'a', '.', 'c', 'o', 'm', '\0',
   /* "photographyforchange.com", true */ 'p', 'h', 'o', 't', 'o', 'g', 'r', 'a', 'p', 'h', 'y', 'f', 'o', 'r', 'c', 'h', 'a', 'n', 'g', 'e', '.', 'c', 'o', 'm', '\0',
   /* "php-bach.org", true */ 'p', 'h', 'p', '-', 'b', 'a', 'c', 'h', '.', 'o', 'r', 'g', '\0',
   /* "php-tuning.de", true */ 'p', 'h', 'p', '-', 't', 'u', 'n', 'i', 'n', 'g', '.', 'd', 'e', '\0',
   /* "phparcade.com", true */ 'p', 'h', 'p', 'a', 'r', 'c', 'a', 'd', 'e', '.', 'c', 'o', 'm', '\0',
   /* "phpbbchinese.com", true */ 'p', 'h', 'p', 'b', 'b', 'c', 'h', 'i', 'n', 'e', 's', 'e', '.', 'c', 'o', 'm', '\0',
   /* "phpdistribution.com", true */ 'p', 'h', 'p', 'd', 'i', 's', 't', 'r', 'i', 'b', 'u', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0',
@@ -9685,16 +9676,17 @@ static const char kSTSHostTable[] = {
   /* "postblue.info", true */ 'p', 'o', 's', 't', 'b', 'l', 'u', 'e', '.', 'i', 'n', 'f', 'o', '\0',
   /* "postbox.life", true */ 'p', 'o', 's', 't', 'b', 'o', 'x', '.', 'l', 'i', 'f', 'e', '\0',
   /* "postcodegarant.nl", true */ 'p', 'o', 's', 't', 'c', 'o', 'd', 'e', 'g', 'a', 'r', 'a', 'n', 't', '.', 'n', 'l', '\0',
   /* "posteo.de", false */ 'p', 'o', 's', 't', 'e', 'o', '.', 'd', 'e', '\0',
   /* "postfinance.ch", true */ 'p', 'o', 's', 't', 'f', 'i', 'n', 'a', 'n', 'c', 'e', '.', 'c', 'h', '\0',
   /* "postmatescode.com", true */ 'p', 'o', 's', 't', 'm', 'a', 't', 'e', 's', 'c', 'o', 'd', 'e', '.', 'c', 'o', 'm', '\0',
   /* "postn.eu", true */ 'p', 'o', 's', 't', 'n', '.', 'e', 'u', '\0',
   /* "posttigo.com", true */ 'p', 'o', 's', 't', 't', 'i', 'g', 'o', '.', 'c', 'o', 'm', '\0',
+  /* "potatofrom.space", false */ 'p', 'o', 't', 'a', 't', 'o', 'f', 'r', 'o', 'm', '.', 's', 'p', 'a', 'c', 'e', '\0',
   /* "potatoheads.net", true */ 'p', 'o', 't', 'a', 't', 'o', 'h', 'e', 'a', 'd', 's', '.', 'n', 'e', 't', '\0',
   /* "potbar.com", true */ 'p', 'o', 't', 'b', 'a', 'r', '.', 'c', 'o', 'm', '\0',
   /* "potbox.com", true */ 'p', 'o', 't', 'b', 'o', 'x', '.', 'c', 'o', 'm', '\0',
   /* "pothe.com", true */ 'p', 'o', 't', 'h', 'e', '.', 'c', 'o', 'm', '\0',
   /* "pothe.de", true */ 'p', 'o', 't', 'h', 'e', '.', 'd', 'e', '\0',
   /* "potlytics.com", true */ 'p', 'o', 't', 'l', 'y', 't', 'i', 'c', 's', '.', 'c', 'o', 'm', '\0',
   /* "potpourrifestival.de", true */ 'p', 'o', 't', 'p', 'o', 'u', 'r', 'r', 'i', 'f', 'e', 's', 't', 'i', 'v', 'a', 'l', '.', 'd', 'e', '\0',
   /* "potsky.com", true */ 'p', 'o', 't', 's', 'k', 'y', '.', 'c', 'o', 'm', '\0',
@@ -9747,28 +9739,26 @@ static const char kSTSHostTable[] = {
   /* "prespanok.sk", true */ 'p', 'r', 'e', 's', 'p', 'a', 'n', 'o', 'k', '.', 's', 'k', '\0',
   /* "press-anime-nenkan.com", true */ 'p', 'r', 'e', 's', 's', '-', 'a', 'n', 'i', 'm', 'e', '-', 'n', 'e', 'n', 'k', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "pressrush.com", true */ 'p', 'r', 'e', 's', 's', 'r', 'u', 's', 'h', '.', 'c', 'o', 'm', '\0',
   /* "prestburyscouts.org.uk", true */ 'p', 'r', 'e', 's', 't', 'b', 'u', 'r', 'y', 's', 'c', 'o', 'u', 't', 's', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0',
   /* "pretix.eu", true */ 'p', 'r', 'e', 't', 'i', 'x', '.', 'e', 'u', '\0',
   /* "pretty.hu", true */ 'p', 'r', 'e', 't', 't', 'y', '.', 'h', 'u', '\0',
   /* "prettytunesapp.com", true */ 'p', 'r', 'e', 't', 't', 'y', 't', 'u', 'n', 'e', 's', 'a', 'p', 'p', '.', 'c', 'o', 'm', '\0',
   /* "pretzelx.com", true */ 'p', 'r', 'e', 't', 'z', 'e', 'l', 'x', '.', 'c', 'o', 'm', '\0',
-  /* "pretzlaff.info", true */ 'p', 'r', 'e', 't', 'z', 'l', 'a', 'f', 'f', '.', 'i', 'n', 'f', 'o', '\0',
   /* "prgslab.net", false */ 'p', 'r', 'g', 's', 'l', 'a', 'b', '.', 'n', 'e', 't', '\0',
   /* "pridetechdesign.com", true */ 'p', 'r', 'i', 'd', 'e', 't', 'e', 'c', 'h', 'd', 'e', 's', 'i', 'g', 'n', '.', 'c', 'o', 'm', '\0',
   /* "pridoc.se", true */ 'p', 'r', 'i', 'd', 'o', 'c', '.', 's', 'e', '\0',
   /* "prielwurmjaeger.de", true */ 'p', 'r', 'i', 'e', 'l', 'w', 'u', 'r', 'm', 'j', 'a', 'e', 'g', 'e', 'r', '.', 'd', 'e', '\0',
   /* "prilock.com", true */ 'p', 'r', 'i', 'l', 'o', 'c', 'k', '.', 'c', 'o', 'm', '\0',
   /* "princessmargaretlotto.com", true */ 'p', 'r', 'i', 'n', 'c', 'e', 's', 's', 'm', 'a', 'r', 'g', 'a', 'r', 'e', 't', 'l', 'o', 't', 't', 'o', '.', 'c', 'o', 'm', '\0',
   /* "principaltoolbox.com", true */ 'p', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', 't', 'o', 'o', 'l', 'b', 'o', 'x', '.', 'c', 'o', 'm', '\0',
   /* "principia-online.de", true */ 'p', 'r', 'i', 'n', 'c', 'i', 'p', 'i', 'a', '-', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'd', 'e', '\0',
   /* "prinice.org", true */ 'p', 'r', 'i', 'n', 'i', 'c', 'e', '.', 'o', 'r', 'g', '\0',
   /* "printerest.io", true */ 'p', 'r', 'i', 'n', 't', 'e', 'r', 'e', 's', 't', '.', 'i', 'o', '\0',
-  /* "printexpress.cloud", true */ 'p', 'r', 'i', 'n', 't', 'e', 'x', 'p', 'r', 'e', 's', 's', '.', 'c', 'l', 'o', 'u', 'd', '\0',
   /* "prior-it.be", true */ 'p', 'r', 'i', 'o', 'r', '-', 'i', 't', '.', 'b', 'e', '\0',
   /* "privacy-week-vienna.at", true */ 'p', 'r', 'i', 'v', 'a', 'c', 'y', '-', 'w', 'e', 'e', 'k', '-', 'v', 'i', 'e', 'n', 'n', 'a', '.', 'a', 't', '\0',
   /* "privacy-week.at", true */ 'p', 'r', 'i', 'v', 'a', 'c', 'y', '-', 'w', 'e', 'e', 'k', '.', 'a', 't', '\0',
   /* "privacy.com", true */ 'p', 'r', 'i', 'v', 'a', 'c', 'y', '.', 'c', 'o', 'm', '\0',
   /* "privacyinternational.org", true */ 'p', 'r', 'i', 'v', 'a', 'c', 'y', 'i', 'n', 't', 'e', 'r', 'n', 'a', 't', 'i', 'o', 'n', 'a', 'l', '.', 'o', 'r', 'g', '\0',
   /* "privacyweek.at", true */ 'p', 'r', 'i', 'v', 'a', 'c', 'y', 'w', 'e', 'e', 'k', '.', 'a', 't', '\0',
   /* "privacyweekvienna.at", true */ 'p', 'r', 'i', 'v', 'a', 'c', 'y', 'w', 'e', 'e', 'k', 'v', 'i', 'e', 'n', 'n', 'a', '.', 'a', 't', '\0',
   /* "privategiant.com", true */ 'p', 'r', 'i', 'v', 'a', 't', 'e', 'g', 'i', 'a', 'n', 't', '.', 'c', 'o', 'm', '\0',
@@ -9848,17 +9838,16 @@ static const char kSTSHostTable[] = {
   /* "proxybay.top", true */ 'p', 'r', 'o', 'x', 'y', 'b', 'a', 'y', '.', 't', 'o', 'p', '\0',
   /* "proxybay.tv", true */ 'p', 'r', 'o', 'x', 'y', 'b', 'a', 'y', '.', 't', 'v', '\0',
   /* "proxyportal.org", true */ 'p', 'r', 'o', 'x', 'y', 'p', 'o', 'r', 't', 'a', 'l', '.', 'o', 'r', 'g', '\0',
   /* "proxyweb.us", true */ 'p', 'r', 'o', 'x', 'y', 'w', 'e', 'b', '.', 'u', 's', '\0',
   /* "prstatic.com", true */ 'p', 'r', 's', 't', 'a', 't', 'i', 'c', '.', 'c', 'o', 'm', '\0',
   /* "prt.in.th", true */ 'p', 'r', 't', '.', 'i', 'n', '.', 't', 'h', '\0',
   /* "prtpe.com", true */ 'p', 'r', 't', 'p', 'e', '.', 'c', 'o', 'm', '\0',
   /* "prvikvadrat.hr", true */ 'p', 'r', 'v', 'i', 'k', 'v', 'a', 'd', 'r', 'a', 't', '.', 'h', 'r', '\0',
-  /* "prxio.date", true */ 'p', 'r', 'x', 'i', 'o', '.', 'd', 'a', 't', 'e', '\0',
   /* "przemas.pl", true */ 'p', 'r', 'z', 'e', 'm', 'a', 's', '.', 'p', 'l', '\0',
   /* "ps-provider.co.jp", true */ 'p', 's', '-', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '.', 'c', 'o', '.', 'j', 'p', '\0',
   /* "ps-w.ru", true */ 'p', 's', '-', 'w', '.', 'r', 'u', '\0',
   /* "ps-x.ru", true */ 'p', 's', '-', 'x', '.', 'r', 'u', '\0',
   /* "psb1911.com", true */ 'p', 's', 'b', '1', '9', '1', '1', '.', 'c', 'o', 'm', '\0',
   /* "psbarrett.com", true */ 'p', 's', 'b', 'a', 'r', 'r', 'e', 't', 't', '.', 'c', 'o', 'm', '\0',
   /* "psicologia.co.ve", true */ 'p', 's', 'i', 'c', 'o', 'l', 'o', 'g', 'i', 'a', '.', 'c', 'o', '.', 'v', 'e', '\0',
   /* "psncardplus.be", true */ 'p', 's', 'n', 'c', 'a', 'r', 'd', 'p', 'l', 'u', 's', '.', 'b', 'e', '\0',
@@ -9895,16 +9884,17 @@ static const char kSTSHostTable[] = {
   /* "puikheid.nl", true */ 'p', 'u', 'i', 'k', 'h', 'e', 'i', 'd', '.', 'n', 'l', '\0',
   /* "pulsar.guru", false */ 'p', 'u', 'l', 's', 'a', 'r', '.', 'g', 'u', 'r', 'u', '\0',
   /* "pult.co", false */ 'p', 'u', 'l', 't', '.', 'c', 'o', '\0',
   /* "punchkickinteractive.com", false */ 'p', 'u', 'n', 'c', 'h', 'k', 'i', 'c', 'k', 'i', 'n', 't', 'e', 'r', 'a', 'c', 't', 'i', 'v', 'e', '.', 'c', 'o', 'm', '\0',
   /* "punikonta.de", true */ 'p', 'u', 'n', 'i', 'k', 'o', 'n', 't', 'a', '.', 'd', 'e', '\0',
   /* "punitsheth.com", true */ 'p', 'u', 'n', 'i', 't', 's', 'h', 'e', 't', 'h', '.', 'c', 'o', 'm', '\0',
   /* "punkapoule.fr", true */ 'p', 'u', 'n', 'k', 'a', 'p', 'o', 'u', 'l', 'e', '.', 'f', 'r', '\0',
   /* "punknews.org", true */ 'p', 'u', 'n', 'k', 'n', 'e', 'w', 's', '.', 'o', 'r', 'g', '\0',
+  /* "pupboss.com", true */ 'p', 'u', 'p', 'b', 'o', 's', 's', '.', 'c', 'o', 'm', '\0',
   /* "puppydns.com", true */ 'p', 'u', 'p', 'p', 'y', 'd', 'n', 's', '.', 'c', 'o', 'm', '\0',
   /* "purplebricks.com", true */ 'p', 'u', 'r', 'p', 'l', 'e', 'b', 'r', 'i', 'c', 'k', 's', '.', 'c', 'o', 'm', '\0',
   /* "purplemoon.ch", true */ 'p', 'u', 'r', 'p', 'l', 'e', 'm', 'o', 'o', 'n', '.', 'c', 'h', '\0',
   /* "purpleplains.net", true */ 'p', 'u', 'r', 'p', 'l', 'e', 'p', 'l', 'a', 'i', 'n', 's', '.', 'n', 'e', 't', '\0',
   /* "purplestar.ch", true */ 'p', 'u', 'r', 'p', 'l', 'e', 's', 't', 'a', 'r', '.', 'c', 'h', '\0',
   /* "purplestar.com", true */ 'p', 'u', 'r', 'p', 'l', 'e', 's', 't', 'a', 'r', '.', 'c', 'o', 'm', '\0',
   /* "puryearlaw.com", true */ 'p', 'u', 'r', 'y', 'e', 'a', 'r', 'l', 'a', 'w', '.', 'c', 'o', 'm', '\0',
   /* "push.world", true */ 'p', 'u', 's', 'h', '.', 'w', 'o', 'r', 'l', 'd', '\0',
@@ -10219,16 +10209,17 @@ static const char kSTSHostTable[] = {
   /* "reinaertvandecruys.me", true */ 'r', 'e', 'i', 'n', 'a', 'e', 'r', 't', 'v', 'a', 'n', 'd', 'e', 'c', 'r', 'u', 'y', 's', '.', 'm', 'e', '\0',
   /* "reinencaressa.be", true */ 'r', 'e', 'i', 'n', 'e', 'n', 'c', 'a', 'r', 'e', 's', 's', 'a', '.', 'b', 'e', '\0',
   /* "reinhardtsgrimma.de", true */ 'r', 'e', 'i', 'n', 'h', 'a', 'r', 'd', 't', 's', 'g', 'r', 'i', 'm', 'm', 'a', '.', 'd', 'e', '\0',
   /* "reishunger.de", true */ 'r', 'e', 'i', 's', 'h', 'u', 'n', 'g', 'e', 'r', '.', 'd', 'e', '\0',
   /* "reisyukaku.org", true */ 'r', 'e', 'i', 's', 'y', 'u', 'k', 'a', 'k', 'u', '.', 'o', 'r', 'g', '\0',
   /* "reithguard-it.de", true */ 'r', 'e', 'i', 't', 'h', 'g', 'u', 'a', 'r', 'd', '-', 'i', 't', '.', 'd', 'e', '\0',
   /* "relaxhavefun.com", true */ 'r', 'e', 'l', 'a', 'x', 'h', 'a', 'v', 'e', 'f', 'u', 'n', '.', 'c', 'o', 'm', '\0',
   /* "relaxpointhyncice.cz", true */ 'r', 'e', 'l', 'a', 'x', 'p', 'o', 'i', 'n', 't', 'h', 'y', 'n', 'c', 'i', 'c', 'e', '.', 'c', 'z', '\0',
+  /* "relayawards.com", true */ 'r', 'e', 'l', 'a', 'y', 'a', 'w', 'a', 'r', 'd', 's', '.', 'c', 'o', 'm', '\0',
   /* "release-monitoring.org", true */ 'r', 'e', 'l', 'e', 'a', 's', 'e', '-', 'm', 'o', 'n', 'i', 't', 'o', 'r', 'i', 'n', 'g', '.', 'o', 'r', 'g', '\0',
   /* "reliable-mail.de", true */ 'r', 'e', 'l', 'i', 'a', 'b', 'l', 'e', '-', 'm', 'a', 'i', 'l', '.', 'd', 'e', '\0',
   /* "reliancebank.bank", true */ 'r', 'e', 'l', 'i', 'a', 'n', 'c', 'e', 'b', 'a', 'n', 'k', '.', 'b', 'a', 'n', 'k', '\0',
   /* "rema.site", true */ 'r', 'e', 'm', 'a', '.', 's', 'i', 't', 'e', '\0',
   /* "remaimodern.org", true */ 'r', 'e', 'm', 'a', 'i', 'm', 'o', 'd', 'e', 'r', 'n', '.', 'o', 'r', 'g', '\0',
   /* "remambo.jp", true */ 'r', 'e', 'm', 'a', 'm', 'b', 'o', '.', 'j', 'p', '\0',
   /* "rememberthemilk.com", false */ 'r', 'e', 'm', 'e', 'm', 'b', 'e', 'r', 't', 'h', 'e', 'm', 'i', 'l', 'k', '.', 'c', 'o', 'm', '\0',
   /* "remonti.info", true */ 'r', 'e', 'm', 'o', 'n', 't', 'i', '.', 'i', 'n', 'f', 'o', '\0',
@@ -10327,17 +10318,16 @@ static const char kSTSHostTable[] = {
   /* "ricozienke.de", true */ 'r', 'i', 'c', 'o', 'z', 'i', 'e', 'n', 'k', 'e', '.', 'd', 'e', '\0',
   /* "ride-up.com", true */ 'r', 'i', 'd', 'e', '-', 'u', 'p', '.', 'c', 'o', 'm', '\0',
   /* "rideaudiscount.com", true */ 'r', 'i', 'd', 'e', 'a', 'u', 'd', 'i', 's', 'c', 'o', 'u', 'n', 't', '.', 'c', 'o', 'm', '\0',
   /* "rideforwade.com", true */ 'r', 'i', 'd', 'e', 'f', 'o', 'r', 'w', 'a', 'd', 'e', '.', 'c', 'o', 'm', '\0',
   /* "rideforwade.net", true */ 'r', 'i', 'd', 'e', 'f', 'o', 'r', 'w', 'a', 'd', 'e', '.', 'n', 'e', 't', '\0',
   /* "rideforwade.org", true */ 'r', 'i', 'd', 'e', 'f', 'o', 'r', 'w', 'a', 'd', 'e', '.', 'o', 'r', 'g', '\0',
   /* "ridingboutique.de", true */ 'r', 'i', 'd', 'i', 'n', 'g', 'b', 'o', 'u', 't', 'i', 'q', 'u', 'e', '.', 'd', 'e', '\0',
   /* "riesenmagnete.de", true */ 'r', 'i', 'e', 's', 'e', 'n', 'm', 'a', 'g', 'n', 'e', 't', 'e', '.', 'd', 'e', '\0',
-  /* "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',
@@ -10385,31 +10375,31 @@ static const char kSTSHostTable[] = {
   /* "robi-net.it", true */ 'r', 'o', 'b', 'i', '-', 'n', 'e', 't', '.', 'i', 't', '\0',
   /* "robin.info", true */ 'r', 'o', 'b', 'i', 'n', '.', 'i', 'n', 'f', 'o', '\0',
   /* "robinadr.com", true */ 'r', 'o', 'b', 'i', 'n', 'a', 'd', 'r', '.', 'c', 'o', 'm', '\0',
   /* "robinhoodbingo.com", true */ 'r', 'o', 'b', 'i', 'n', 'h', 'o', 'o', 'd', 'b', 'i', 'n', 'g', 'o', '.', 'c', 'o', 'm', '\0',
   /* "robinsonyu.com", true */ 'r', 'o', 'b', 'i', 'n', 's', 'o', 'n', 'y', 'u', '.', 'c', 'o', 'm', '\0',
   /* "robinwinslow.uk", true */ 'r', 'o', 'b', 'i', 'n', 'w', 'i', 'n', 's', 'l', 'o', 'w', '.', 'u', 'k', '\0',
   /* "robjager-fotografie.nl", true */ 'r', 'o', 'b', 'j', 'a', 'g', 'e', 'r', '-', 'f', 'o', 't', 'o', 'g', 'r', 'a', 'f', 'i', 'e', '.', 'n', 'l', '\0',
   /* "robodeidentidad.gov", true */ 'r', 'o', 'b', 'o', 'd', 'e', 'i', 'd', 'e', 'n', 't', 'i', 'd', 'a', 'd', '.', 'g', 'o', 'v', '\0',
+  /* "robohash.org", true */ 'r', 'o', 'b', 'o', 'h', 'a', 's', 'h', '.', 'o', 'r', 'g', '\0',
   /* "robspc.repair", true */ 'r', 'o', 'b', 's', 'p', 'c', '.', 'r', 'e', 'p', 'a', 'i', 'r', '\0',
   /* "robteix.com", true */ 'r', 'o', 'b', 't', 'e', 'i', 'x', '.', 'c', 'o', 'm', '\0',
   /* "robud.info", true */ 'r', 'o', 'b', 'u', 'd', '.', 'i', 'n', 'f', 'o', '\0',
   /* "rockcanyonbank.com", true */ 'r', 'o', 'c', 'k', 'c', 'a', 'n', 'y', 'o', 'n', 'b', 'a', 'n', 'k', '.', 'c', 'o', 'm', '\0',
   /* "rocketr.net", true */ 'r', 'o', 'c', 'k', 'e', 't', 'r', '.', 'n', 'e', 't', '\0',
   /* "rockeyscrivo.com", true */ 'r', 'o', 'c', 'k', 'e', 'y', 's', 'c', 'r', 'i', 'v', 'o', '.', 'c', 'o', 'm', '\0',
   /* "rockstarloan.com", true */ 'r', 'o', 'c', 'k', 's', 't', 'a', 'r', 'l', 'o', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "rocssti.net", true */ 'r', 'o', 'c', 's', 's', 't', 'i', '.', 'n', 'e', 't', '\0',
   /* "rodehutskors.net", true */ 'r', 'o', 'd', 'e', 'h', 'u', 't', 's', 'k', 'o', 'r', 's', '.', 'n', 'e', 't', '\0',
   /* "rodolfo.gs", true */ 'r', 'o', 'd', 'o', 'l', 'f', 'o', '.', 'g', 's', '\0',
   /* "rodrigocarvalho.blog.br", true */ 'r', 'o', 'd', 'r', 'i', 'g', 'o', 'c', 'a', 'r', 'v', 'a', 'l', 'h', 'o', '.', 'b', 'l', 'o', 'g', '.', 'b', 'r', '\0',
   /* "roeckx.be", true */ 'r', 'o', 'e', 'c', 'k', 'x', '.', 'b', 'e', '\0',
   /* "roeitijd.nl", true */ 'r', 'o', 'e', 'i', 't', 'i', 'j', 'd', '.', 'n', 'l', '\0',
   /* "roelf.org", true */ 'r', 'o', 'e', 'l', 'f', '.', 'o', 'r', 'g', '\0',
-  /* "roessner-network-solutions.com", true */ 'r', 'o', 'e', 's', 's', 'n', 'e', 'r', '-', 'n', 'e', 't', 'w', 'o', 'r', 'k', '-', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '.', 'c', 'o', 'm', '\0',
   /* "roffe.nu", true */ 'r', 'o', 'f', 'f', 'e', '.', 'n', 'u', '\0',
   /* "rogerbastien.com", true */ 'r', 'o', 'g', 'e', 'r', 'b', 'a', 's', 't', 'i', 'e', 'n', '.', 'c', 'o', 'm', '\0',
   /* "rogue-e.xyz", true */ 'r', 'o', 'g', 'u', 'e', '-', 'e', '.', 'x', 'y', 'z', '\0',
   /* "roguelikecenter.fr", true */ 'r', 'o', 'g', 'u', 'e', 'l', 'i', 'k', 'e', 'c', 'e', 'n', 't', 'e', 'r', '.', 'f', 'r', '\0',
   /* "roguesignal.net", true */ 'r', 'o', 'g', 'u', 'e', 's', 'i', 'g', 'n', 'a', 'l', '.', 'n', 'e', 't', '\0',
   /* "roguetechhub.org", true */ 'r', 'o', 'g', 'u', 'e', 't', 'e', 'c', 'h', 'h', 'u', 'b', '.', 'o', 'r', 'g', '\0',
   /* "rohedaten.de", true */ 'r', 'o', 'h', 'e', 'd', 'a', 't', 'e', 'n', '.', 'd', 'e', '\0',
   /* "rohitagr.com", true */ 'r', 'o', 'h', 'i', 't', 'a', 'g', 'r', '.', 'c', 'o', 'm', '\0',
@@ -10815,16 +10805,17 @@ static const char kSTSHostTable[] = {
   /* "sech.me", true */ 's', 'e', 'c', 'h', '.', 'm', 'e', '\0',
   /* "secnews.gr", true */ 's', 'e', 'c', 'n', 'e', 'w', 's', '.', 'g', 'r', '\0',
   /* "secondary-survivor.com", true */ 's', 'e', 'c', 'o', 'n', 'd', 'a', 'r', 'y', '-', 's', 'u', 'r', 'v', 'i', 'v', 'o', 'r', '.', 'c', 'o', 'm', '\0',
   /* "secondary-survivor.help", true */ 's', 'e', 'c', 'o', 'n', 'd', 'a', 'r', 'y', '-', 's', 'u', 'r', 'v', 'i', 'v', 'o', 'r', '.', 'h', 'e', 'l', 'p', '\0',
   /* "secondary-survivor.net", true */ 's', 'e', 'c', 'o', 'n', 'd', 'a', 'r', 'y', '-', 's', 'u', 'r', 'v', 'i', 'v', 'o', 'r', '.', 'n', 'e', 't', '\0',
   /* "secondarysurvivor.help", true */ 's', 'e', 'c', 'o', 'n', 'd', 'a', 'r', 'y', 's', 'u', 'r', 'v', 'i', 'v', 'o', 'r', '.', 'h', 'e', 'l', 'p', '\0',
   /* "secondarysurvivorportal.com", true */ 's', 'e', 'c', 'o', 'n', 'd', 'a', 'r', 'y', 's', 'u', 'r', 'v', 'i', 'v', 'o', 'r', 'p', 'o', 'r', 't', 'a', 'l', '.', 'c', 'o', 'm', '\0',
   /* "secondarysurvivorportal.help", true */ 's', 'e', 'c', 'o', 'n', 'd', 'a', 'r', 'y', 's', 'u', 'r', 'v', 'i', 'v', 'o', 'r', 'p', 'o', 'r', 't', 'a', 'l', '.', 'h', 'e', 'l', 'p', '\0',
+  /* "secondpay.nl", true */ 's', 'e', 'c', 'o', 'n', 'd', 'p', 'a', 'y', '.', 'n', 'l', '\0',
   /* "secondspace.ca", true */ 's', 'e', 'c', 'o', 'n', 'd', 's', 'p', 'a', 'c', 'e', '.', 'c', 'a', '\0',
   /* "seconfig.sytes.net", true */ 's', 'e', 'c', 'o', 'n', 'f', 'i', 'g', '.', 's', 'y', 't', 'e', 's', '.', 'n', 'e', 't', '\0',
   /* "secretpanties.com", true */ 's', 'e', 'c', 'r', 'e', 't', 'p', 'a', 'n', 't', 'i', 'e', 's', '.', 'c', 'o', 'm', '\0',
   /* "secretserveronline.com", true */ 's', 'e', 'c', 'r', 'e', 't', 's', 'e', 'r', 'v', 'e', 'r', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0',
   /* "sectest.ml", true */ 's', 'e', 'c', 't', 'e', 's', 't', '.', 'm', 'l', '\0',
   /* "sectio-aurea.org", true */ 's', 'e', 'c', 't', 'i', 'o', '-', 'a', 'u', 'r', 'e', 'a', '.', 'o', 'r', 'g', '\0',
   /* "section.io", true */ 's', 'e', 'c', 't', 'i', 'o', 'n', '.', 'i', 'o', '\0',
   /* "securai.de", true */ 's', 'e', 'c', 'u', 'r', 'a', 'i', '.', 'd', 'e', '\0',
@@ -10852,17 +10843,16 @@ static const char kSTSHostTable[] = {
   /* "securitymap.wiki", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 'm', 'a', 'p', '.', 'w', 'i', 'k', 'i', '\0',
   /* "securityprimes.in", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 'p', 'r', 'i', 'm', 'e', 's', '.', 'i', 'n', '\0',
   /* "securitysnobs.com", false */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 's', 'n', 'o', 'b', 's', '.', 'c', 'o', 'm', '\0',
   /* "securitystreak.com", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 's', 't', 'r', 'e', 'a', 'k', '.', 'c', 'o', 'm', '\0',
   /* "securitywithoutborders.org", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 'w', 'i', 't', 'h', 'o', 'u', 't', 'b', 'o', 'r', 'd', 'e', 'r', 's', '.', 'o', 'r', 'g', '\0',
   /* "secuvera.de", true */ 's', 'e', 'c', 'u', 'v', 'e', 'r', 'a', '.', 'd', 'e', '\0',
   /* "sedoexpert.nl", true */ 's', 'e', 'd', 'o', 'e', 'x', 'p', 'e', 'r', 't', '.', 'n', 'l', '\0',
   /* "sedoexperts.nl", true */ 's', 'e', 'd', 'o', 'e', 'x', 'p', 'e', 'r', 't', 's', '.', 'n', 'l', '\0',
-  /* "sedrubal.de", true */ 's', 'e', 'd', 'r', 'u', 'b', 'a', 'l', '.', 'd', 'e', '\0',
   /* "sedussa.ro", true */ 's', 'e', 'd', 'u', 's', 's', 'a', '.', 'r', 'o', '\0',
   /* "sedziapilkarski.pl", true */ 's', 'e', 'd', 'z', 'i', 'a', 'p', 'i', 'l', 'k', 'a', 'r', 's', 'k', 'i', '.', 'p', 'l', '\0',
   /* "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',
   /* "seeks.ru", true */ 's', 'e', 'e', 'k', 's', '.', 'r', 'u', '\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',
@@ -11098,16 +11088,17 @@ static const char kSTSHostTable[] = {
   /* "silver-heart.co.uk", true */ 's', 'i', 'l', 'v', 'e', 'r', '-', 'h', 'e', 'a', 'r', 't', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "silverback.is", true */ 's', 'i', 'l', 'v', 'e', 'r', 'b', 'a', 'c', 'k', '.', 'i', 's', '\0',
   /* "silverbowflyshop.com", true */ 's', 'i', 'l', 'v', 'e', 'r', 'b', 'o', 'w', 'f', 'l', 'y', 's', 'h', 'o', 'p', '.', 'c', 'o', 'm', '\0',
   /* "silverdragonart.com", true */ 's', 'i', 'l', 'v', 'e', 'r', 'd', 'r', 'a', 'g', 'o', 'n', 'a', 'r', 't', '.', 'c', 'o', 'm', '\0',
   /* "silvergoldbull.ca", true */ 's', 'i', 'l', 'v', 'e', 'r', 'g', 'o', 'l', 'd', 'b', 'u', 'l', 'l', '.', 'c', 'a', '\0',
   /* "silvergoldbull.com", true */ 's', 'i', 'l', 'v', 'e', 'r', 'g', 'o', 'l', 'd', 'b', 'u', 'l', 'l', '.', 'c', 'o', 'm', '\0',
   /* "silvergoldbull.de", true */ 's', 'i', 'l', 'v', 'e', 'r', 'g', 'o', 'l', 'd', 'b', 'u', 'l', 'l', '.', 'd', 'e', '\0',
   /* "silvergoldbull.kr", true */ 's', 'i', 'l', 'v', 'e', 'r', 'g', 'o', 'l', 'd', 'b', 'u', 'l', 'l', '.', 'k', 'r', '\0',
+  /* "silverhome.ninja", false */ 's', 'i', 'l', 'v', 'e', 'r', 'h', 'o', 'm', 'e', '.', 'n', 'i', 'n', 'j', 'a', '\0',
   /* "silvistefi.com", true */ 's', 'i', 'l', 'v', 'i', 's', 't', 'e', 'f', 'i', '.', 'c', 'o', 'm', '\0',
   /* "simbihaiti.com", false */ 's', 'i', 'm', 'b', 'i', 'h', 'a', 'i', 't', 'i', '.', 'c', 'o', 'm', '\0',
   /* "simfed.org", true */ 's', 'i', 'm', 'f', 'e', 'd', '.', 'o', 'r', 'g', '\0',
   /* "simlau.net", true */ 's', 'i', 'm', 'l', 'a', 'u', '.', 'n', 'e', 't', '\0',
   /* "simnovo.net", true */ 's', 'i', 'm', 'n', 'o', 'v', 'o', '.', 'n', 'e', 't', '\0',
   /* "simobilklub.si", true */ 's', 'i', 'm', 'o', 'b', 'i', 'l', 'k', 'l', 'u', 'b', '.', 's', 'i', '\0',
   /* "simon-hofmann.org", true */ 's', 'i', 'm', 'o', 'n', '-', 'h', 'o', 'f', 'm', 'a', 'n', 'n', '.', 'o', 'r', 'g', '\0',
   /* "simoncommunity.org.uk", true */ 's', 'i', 'm', 'o', 'n', 'c', 'o', 'm', 'm', 'u', 'n', 'i', 't', 'y', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0',
@@ -11158,17 +11149,16 @@ static const char kSTSHostTable[] = {
   /* "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", false */ 's', 'i', 't', 'e', 'n', 'n', 'i', 's', 'c', 'l', 'u', 'b', '.', 'c', 'o', 'm', '\0',
   /* "siterip.org", true */ 's', 'i', 't', 'e', 'r', 'i', 'p', '.', 'o', 'r', 'g', '\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',
   /* "sixtwentyten.com", true */ 's', 'i', 'x', 't', 'w', 'e', 'n', 't', 'y', 't', 'e', 'n', '.', 'c', 'o', 'm', '\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',
@@ -11773,17 +11763,16 @@ static const char kSTSHostTable[] = {
   /* "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',
   /* "stylefast.com.au", true */ 's', 't', 'y', 'l', 'e', 'f', 'a', 's', 't', '.', 'c', 'o', 'm', '.', 'a', 'u', '\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',
   /* "sublimebits.com", true */ 's', 'u', 'b', 'l', 'i', 'm', 'e', 'b', 'i', 't', 's', '.', 'c', 'o', 'm', '\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',
   /* "succ.in", true */ 's', 'u', 'c', 'c', '.', 'i', 'n', '\0',
@@ -11798,20 +11787,20 @@ static const char kSTSHostTable[] = {
   /* "sufix.cz", true */ 's', 'u', 'f', 'i', 'x', '.', 'c', 'z', '\0',
   /* "suitocracy.com", true */ 's', 'u', 'i', 't', 'o', 'c', 'r', 'a', 'c', 'y', '.', 'c', 'o', 'm', '\0',
   /* "suki.moe", true */ 's', 'u', 'k', 'i', '.', 'm', 'o', 'e', '\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',
   /* "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',
-  /* "sunyanzi.tk", true */ 's', 'u', 'n', 'y', 'a', 'n', 'z', 'i', '.', 't', 'k', '\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',
   /* "superbart.nl", true */ 's', 'u', 'p', 'e', 'r', 'b', 'a', 'r', 't', '.', 'n', 'l', '\0',
   /* "superbshare.com", true */ 's', 'u', 'p', 'e', 'r', 'b', 's', 'h', 'a', 'r', 'e', '.', 'c', 'o', 'm', '\0',
   /* "supercentenarian.com", true */ 's', 'u', 'p', 'e', 'r', 'c', 'e', 'n', 't', 'e', 'n', 'a', 'r', 'i', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "superhome.com.au", true */ 's', 'u', 'p', 'e', 'r', 'h', 'o', 'm', 'e', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
@@ -11887,16 +11876,17 @@ static const char kSTSHostTable[] = {
   /* "sync-it.no", true */ 's', 'y', 'n', 'c', '-', 'i', 't', '.', 'n', 'o', '\0',
   /* "syncaddict.net", true */ 's', 'y', 'n', 'c', 'a', 'd', 'd', 'i', 'c', 't', '.', 'n', 'e', 't', '\0',
   /* "syncappate.com", true */ 's', 'y', 'n', 'c', 'a', 'p', 'p', 'a', 't', 'e', '.', 'c', 'o', 'm', '\0',
   /* "synchrocube.com", true */ 's', 'y', 'n', 'c', 'h', 'r', 'o', 'c', 'u', 'b', 'e', '.', 'c', 'o', 'm', '\0',
   /* "synchtu.be", false */ 's', 'y', 'n', 'c', 'h', 't', 'u', '.', 'b', 'e', '\0',
   /* "syncmylife.net", true */ 's', 'y', 'n', 'c', 'm', 'y', 'l', 'i', 'f', 'e', '.', 'n', 'e', 't', '\0',
   /* "syncrise.co.jp", true */ 's', 'y', 'n', 'c', 'r', 'i', 's', 'e', '.', 'c', 'o', '.', 'j', 'p', '\0',
   /* "syndic-discount.fr", false */ 's', 'y', 'n', 'd', 'i', 'c', '-', 'd', 'i', 's', 'c', 'o', 'u', 'n', 't', '.', 'f', 'r', '\0',
+  /* "synfin.org", true */ 's', 'y', 'n', 'f', 'i', 'n', '.', 'o', 'r', 'g', '\0',
   /* "synony.me", true */ 's', 'y', 'n', 'o', 'n', 'y', '.', 'm', 'e', '\0',
   /* "syntaxnightmare.com", true */ 's', 'y', 'n', 't', 'a', 'x', 'n', 'i', 'g', 'h', 't', 'm', 'a', 'r', 'e', '.', 'c', 'o', 'm', '\0',
   /* "syriatalk.biz", true */ 's', 'y', 'r', 'i', 'a', 't', 'a', 'l', 'k', '.', 'b', 'i', 'z', '\0',
   /* "syriatalk.org", true */ 's', 'y', 'r', 'i', 'a', 't', 'a', 'l', 'k', '.', 'o', 'r', 'g', '\0',
   /* "syrocon.ch", true */ 's', 'y', 'r', 'o', 'c', 'o', 'n', '.', 'c', 'h', '\0',
   /* "sys.tf", true */ 's', 'y', 's', '.', 't', 'f', '\0',
   /* "sysadmin.xyz", true */ 's', 'y', 's', 'a', 'd', 'm', 'i', 'n', '.', 'x', 'y', 'z', '\0',
   /* "sysadmins.ro", true */ 's', 'y', 's', 'a', 'd', 'm', 'i', 'n', 's', '.', 'r', 'o', '\0',
@@ -12025,16 +12015,17 @@ static const char kSTSHostTable[] = {
   /* "teamnetsol.com", true */ 't', 'e', 'a', 'm', 'n', 'e', 't', 's', 'o', 'l', '.', 'c', 'o', 'm', '\0',
   /* "teamnorthgermany.de", true */ 't', 'e', 'a', 'm', 'n', 'o', 'r', 't', 'h', 'g', 'e', 'r', 'm', 'a', 'n', 'y', '.', 'd', 'e', '\0',
   /* "teampaddymurphy.ch", true */ 't', 'e', 'a', 'm', 'p', 'a', 'd', 'd', 'y', 'm', 'u', 'r', 'p', 'h', 'y', '.', 'c', 'h', '\0',
   /* "teampaddymurphy.ie", true */ 't', 'e', 'a', 'm', 'p', 'a', 'd', 'd', 'y', 'm', 'u', 'r', 'p', 'h', 'y', '.', 'i', 'e', '\0',
   /* "teampoint.cz", true */ 't', 'e', 'a', 'm', 'p', 'o', 'i', 'n', 't', '.', 'c', 'z', '\0',
   /* "teamtouring.net", true */ 't', 'e', 'a', 'm', 't', 'o', 'u', 'r', 'i', 'n', 'g', '.', 'n', 'e', 't', '\0',
   /* "teamtrack.uk", true */ 't', 'e', 'a', 'm', 't', 'r', 'a', 'c', 'k', '.', 'u', 'k', '\0',
   /* "teamupturn.com", true */ 't', 'e', 'a', 'm', 'u', 'p', 't', 'u', 'r', 'n', '.', 'c', 'o', 'm', '\0',
+  /* "teamx-gaming.de", true */ 't', 'e', 'a', 'm', 'x', '-', 'g', 'a', 'm', 'i', 'n', 'g', '.', 'd', 'e', '\0',
   /* "teasenetwork.com", true */ 't', 'e', 'a', 's', 'e', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'c', 'o', 'm', '\0',
   /* "tecart-cloud.de", true */ 't', 'e', 'c', 'a', 'r', 't', '-', 'c', 'l', 'o', 'u', 'd', '.', 'd', 'e', '\0',
   /* "tecart-system.de", true */ 't', 'e', 'c', 'a', 'r', 't', '-', 's', 'y', 's', 't', 'e', 'm', '.', 'd', 'e', '\0',
   /* "tecartcrm.de", true */ 't', 'e', 'c', 'a', 'r', 't', 'c', 'r', 'm', '.', 'd', 'e', '\0',
   /* "tech-clips.com", true */ 't', 'e', 'c', 'h', '-', 'c', 'l', 'i', 'p', 's', '.', 'c', 'o', 'm', '\0',
   /* "tech-essential.com", true */ 't', 'e', 'c', 'h', '-', 'e', 's', 's', 'e', 'n', 't', 'i', 'a', 'l', '.', 'c', 'o', 'm', '\0',
   /* "tech-rat.com", true */ 't', 'e', 'c', 'h', '-', 'r', 'a', 't', '.', 'c', 'o', 'm', '\0',
   /* "tech-seminar.jp", true */ 't', 'e', 'c', 'h', '-', 's', 'e', 'm', 'i', 'n', 'a', 'r', '.', 'j', 'p', '\0',
@@ -12058,17 +12049,16 @@ static const char kSTSHostTable[] = {
   /* "techorbiter.com", true */ 't', 'e', 'c', 'h', 'o', 'r', 'b', 'i', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "techpivot.net", true */ 't', 'e', 'c', 'h', 'p', 'i', 'v', 'o', 't', '.', 'n', 'e', 't', '\0',
   /* "techtalks.no", true */ 't', 'e', 'c', 'h', 't', 'a', 'l', 'k', 's', '.', 'n', 'o', '\0',
   /* "techwords.io", true */ 't', 'e', 'c', 'h', 'w', 'o', 'r', 'd', 's', '.', 'i', 'o', '\0',
   /* "tecnogaming.com", true */ 't', 'e', 'c', 'n', 'o', 'g', 'a', 'm', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "tecture.de", true */ 't', 'e', 'c', 't', 'u', 'r', 'e', '.', 'd', 'e', '\0',
   /* "teddy.ch", true */ 't', 'e', 'd', 'd', 'y', '.', 'c', 'h', '\0',
   /* "tedeh.net", true */ 't', 'e', 'd', 'e', 'h', '.', 'n', 'e', 't', '\0',
-  /* "tedovo.com", true */ 't', 'e', 'd', 'o', 'v', 'o', '.', 'c', 'o', 'm', '\0',
   /* "tee-idf.net", true */ 't', 'e', 'e', '-', 'i', 'd', 'f', '.', 'n', 'e', 't', '\0',
   /* "teebeedee.org", true */ 't', 'e', 'e', 'b', 'e', 'e', 'd', 'e', 'e', '.', 'o', 'r', 'g', '\0',
   /* "teemo.gg", true */ 't', 'e', 'e', 'm', 'o', '.', 'g', 'g', '\0',
   /* "teemperor.de", true */ 't', 'e', 'e', 'm', 'p', 'e', 'r', 'o', 'r', '.', 'd', 'e', '\0',
   /* "tege-elektronik.hu", true */ 't', 'e', 'g', 'e', '-', 'e', 'l', 'e', 'k', 't', 'r', 'o', 'n', 'i', 'k', '.', 'h', 'u', '\0',
   /* "tehotuotanto.net", true */ 't', 'e', 'h', 'o', 't', 'u', 'o', 't', 'a', 'n', 't', 'o', '.', 'n', 'e', 't', '\0',
   /* "tehrabbitt.com", false */ 't', 'e', 'h', 'r', 'a', 'b', 'b', 'i', 't', 't', '.', 'c', 'o', 'm', '\0',
   /* "teknologi.or.id", true */ 't', 'e', 'k', 'n', 'o', 'l', 'o', 'g', 'i', '.', 'o', 'r', '.', 'i', 'd', '\0',
@@ -12133,26 +12123,25 @@ static const char kSTSHostTable[] = {
   /* "teunstuinposters.nl", false */ 't', 'e', 'u', 'n', 's', 't', 'u', 'i', 'n', 'p', 'o', 's', 't', 'e', 'r', 's', '.', 'n', 'l', '\0',
   /* "textburst.com", true */ 't', 'e', 'x', 't', 'b', 'u', 'r', 's', 't', '.', 'c', 'o', 'm', '\0',
   /* "texte-zur-taufe.de", true */ 't', 'e', 'x', 't', 'e', '-', 'z', 'u', 'r', '-', 't', 'a', 'u', 'f', 'e', '.', 'd', 'e', '\0',
   /* "texterseo.at", true */ 't', 'e', 'x', 't', 'e', 'r', 's', 'e', 'o', '.', 'a', 't', '\0',
   /* "textualapp.com", true */ 't', 'e', 'x', 't', 'u', 'a', 'l', 'a', 'p', 'p', '.', 'c', 'o', 'm', '\0',
   /* "texy.info", true */ 't', 'e', 'x', 'y', '.', 'i', 'n', 'f', 'o', '\0',
   /* "tf-network.de", true */ 't', 'f', '-', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'd', 'e', '\0',
   /* "tf2b.com", true */ 't', 'f', '2', 'b', '.', 'c', 'o', 'm', '\0',
-  /* "tffans.com", true */ 't', 'f', 'f', 'a', 'n', 's', '.', 'c', 'o', 'm', '\0',
+  /* "tffans.com", false */ 't', 'f', 'f', 'a', 'n', 's', '.', 'c', 'o', 'm', '\0',
   /* "tflite.com", true */ 't', 'f', 'l', 'i', 't', 'e', '.', 'c', 'o', 'm', '\0',
   /* "tfnapps.de", true */ 't', 'f', 'n', 'a', 'p', 'p', 's', '.', 'd', 'e', '\0',
   /* "tgbyte.com", true */ 't', 'g', 'b', 'y', 't', 'e', '.', 'c', 'o', 'm', '\0',
   /* "tgbyte.de", true */ 't', 'g', 'b', 'y', 't', 'e', '.', 'd', 'e', '\0',
   /* "th.search.yahoo.com", false */ 't', 'h', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0',
   /* "thackbarth.net", true */ 't', 'h', 'a', 'c', 'k', 'b', 'a', 'r', 't', 'h', '.', 'n', 'e', 't', '\0',
   /* "thaedal.net", true */ 't', 'h', 'a', 'e', 'd', 'a', 'l', '.', 'n', 'e', 't', '\0',
   /* "thai.dating", true */ 't', 'h', 'a', 'i', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0',
-  /* "thaianthro.com", true */ 't', 'h', 'a', 'i', 'a', 'n', 't', 'h', 'r', 'o', '.', 'c', 'o', 'm', '\0',
   /* "thaicyberpoint.com", true */ 't', 'h', 'a', 'i', 'c', 'y', 'b', 'e', 'r', 'p', 'o', 'i', 'n', 't', '.', 'c', 'o', 'm', '\0',
   /* "thaihomecooking.com", true */ 't', 'h', 'a', 'i', 'h', 'o', 'm', 'e', 'c', 'o', 'o', 'k', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "thaihostcool.com", true */ 't', 'h', 'a', 'i', 'h', 'o', 's', 't', 'c', 'o', 'o', 'l', '.', 'c', 'o', 'm', '\0',
   /* "thalan.fr", true */ 't', 'h', 'a', 'l', 'a', 'n', '.', 'f', 'r', '\0',
   /* "thalhammer.it", true */ 't', 'h', 'a', 'l', 'h', 'a', 'm', 'm', 'e', 'r', '.', 'i', 't', '\0',
   /* "thatgudstuff.com", true */ 't', 'h', 'a', 't', 'g', 'u', 'd', 's', 't', 'u', 'f', 'f', '.', 'c', 'o', 'm', '\0',
   /* "thatpodcast.io", true */ 't', 'h', 'a', 't', 'p', 'o', 'd', 'c', 'a', 's', 't', '.', 'i', 'o', '\0',
   /* "thca.ca", true */ 't', 'h', 'c', 'a', '.', 'c', 'a', '\0',
@@ -12445,17 +12434,16 @@ static const char kSTSHostTable[] = {
   /* "tomandshirley.com", true */ 't', 'o', 'm', 'a', 'n', 'd', 's', 'h', 'i', 'r', 'l', 'e', 'y', '.', 'c', 'o', 'm', '\0',
   /* "tomasjacik.cz", true */ 't', 'o', 'm', 'a', 's', 'j', 'a', 'c', 'i', 'k', '.', 'c', 'z', '\0',
   /* "tomask.info", true */ 't', 'o', 'm', 'a', 's', 'k', '.', 'i', 'n', 'f', 'o', '\0',
   /* "tomaspialek.cz", true */ 't', 'o', 'm', 'a', 's', 'p', 'i', 'a', 'l', 'e', 'k', '.', 'c', 'z', '\0',
   /* "tomatenaufdenaugen.de", true */ 't', 'o', 'm', 'a', 't', 'e', 'n', 'a', 'u', 'f', 'd', 'e', 'n', 'a', 'u', 'g', 'e', 'n', '.', 'd', 'e', '\0',
   /* "tomaw.net", true */ 't', 'o', 'm', 'a', 'w', '.', 'n', 'e', 't', '\0',
   /* "tombaker.me", true */ 't', 'o', 'm', 'b', 'a', 'k', 'e', 'r', '.', 'm', 'e', '\0',
   /* "tombrossman.com", true */ 't', 'o', 'm', 'b', 'r', 'o', 's', 's', 'm', 'a', 'n', '.', 'c', 'o', 'm', '\0',
-  /* "tomcort.com", true */ 't', 'o', 'm', 'c', 'o', 'r', 't', '.', 'c', 'o', 'm', '\0',
   /* "tomend.es", true */ 't', 'o', 'm', 'e', 'n', 'd', '.', 'e', 's', '\0',
   /* "tomfisher.eu", true */ 't', 'o', 'm', 'f', 'i', 's', 'h', 'e', 'r', '.', 'e', 'u', '\0',
   /* "tomharris.tech", true */ 't', 'o', 'm', 'h', 'a', 'r', 'r', 'i', 's', '.', 't', 'e', 'c', 'h', '\0',
   /* "tomli.me", true */ 't', 'o', 'm', 'l', 'i', '.', 'm', 'e', '\0',
   /* "tomm.yt", true */ 't', 'o', 'm', 'm', '.', 'y', 't', '\0',
   /* "tommyads.com", true */ 't', 'o', 'm', 'm', 'y', 'a', 'd', 's', '.', 'c', 'o', 'm', '\0',
   /* "tomo.gr", false */ 't', 'o', 'm', 'o', '.', 'g', 'r', '\0',
   /* "tomrei.com", true */ 't', 'o', 'm', 'r', 'e', 'i', '.', 'c', 'o', 'm', '\0',
@@ -12630,16 +12618,17 @@ static const char kSTSHostTable[] = {
   /* "tresorit.com", true */ 't', 'r', 'e', 's', 'o', 'r', 'i', 't', '.', 'c', 'o', 'm', '\0',
   /* "tresorsecurity.com", true */ 't', 'r', 'e', 's', 'o', 'r', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0',
   /* "tretkowski.de", true */ 't', 'r', 'e', 't', 'k', 'o', 'w', 's', 'k', 'i', '.', 'd', 'e', '\0',
   /* "triadwars.com", true */ 't', 'r', 'i', 'a', 'd', 'w', 'a', 'r', 's', '.', 'c', 'o', 'm', '\0',
   /* "tribaldos.com", true */ 't', 'r', 'i', 'b', 'a', 'l', 'd', 'o', 's', '.', 'c', 'o', 'm', '\0',
   /* "tribut.de", true */ 't', 'r', 'i', 'b', 'u', 't', '.', 'd', 'e', '\0',
   /* "tributh.net", true */ 't', 'r', 'i', 'b', 'u', 't', 'h', '.', 'n', 'e', 't', '\0',
   /* "trident-online.de", true */ 't', 'r', 'i', 'd', 'e', 'n', 't', '-', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'd', 'e', '\0',
+  /* "trik.es", false */ 't', 'r', 'i', 'k', '.', 'e', 's', '\0',
   /* "trim-a-slab.com", true */ 't', 'r', 'i', 'm', '-', 'a', '-', 's', 'l', 'a', 'b', '.', 'c', 'o', 'm', '\0',
   /* "trimage.org", true */ 't', 'r', 'i', 'm', 'a', 'g', 'e', '.', 'o', 'r', 'g', '\0',
   /* "trineco.com", true */ 't', 'r', 'i', 'n', 'e', 'c', 'o', '.', 'c', 'o', 'm', '\0',
   /* "trineco.fi", true */ 't', 'r', 'i', 'n', 'e', 'c', 'o', '.', 'f', 'i', '\0',
   /* "trinnes.net", true */ 't', 'r', 'i', 'n', 'n', 'e', 's', '.', 'n', 'e', 't', '\0',
   /* "triop.se", true */ 't', 'r', 'i', 'o', 'p', '.', 's', 'e', '\0',
   /* "trior.net", true */ 't', 'r', 'i', 'o', 'r', '.', 'n', 'e', 't', '\0',
   /* "tripcombi.com", true */ 't', 'r', 'i', 'p', 'c', 'o', 'm', 'b', 'i', '.', 'c', 'o', 'm', '\0',
@@ -12788,17 +12777,16 @@ static const char kSTSHostTable[] = {
   /* "udomain.net", true */ 'u', 'd', 'o', 'm', 'a', 'i', 'n', '.', 'n', 'e', 't', '\0',
   /* "udruga-point.hr", true */ 'u', 'd', 'r', 'u', 'g', 'a', '-', 'p', 'o', 'i', 'n', 't', '.', 'h', 'r', '\0',
   /* "uerdingen.info", true */ 'u', 'e', 'r', 'd', 'i', 'n', 'g', 'e', 'n', '.', 'i', 'n', 'f', 'o', '\0',
   /* "uesociedadlimitada.com", true */ 'u', 'e', 's', 'o', 'c', 'i', 'e', 'd', 'a', 'd', 'l', 'i', 'm', 'i', 't', 'a', 'd', 'a', '.', 'c', 'o', 'm', '\0',
   /* "ueu.me", true */ 'u', 'e', 'u', '.', 'm', 'e', '\0',
   /* "ufindme.at", true */ 'u', 'f', 'i', 'n', 'd', 'm', 'e', '.', 'a', 't', '\0',
   /* "ugcdn.com", true */ 'u', 'g', 'c', 'd', 'n', '.', 'c', 'o', 'm', '\0',
   /* "uhc.gg", true */ 'u', 'h', 'c', '.', 'g', 'g', '\0',
-  /* "uhm.io", true */ 'u', 'h', 'm', '.', 'i', 'o', '\0',
   /* "uhrenlux.de", true */ 'u', 'h', 'r', 'e', 'n', 'l', 'u', 'x', '.', 'd', 'e', '\0',
   /* "uicchy.com", true */ 'u', 'i', 'c', 'c', 'h', 'y', '.', 'c', 'o', 'm', '\0',
   /* "uiop.link", true */ 'u', 'i', 'o', 'p', '.', 'l', 'i', 'n', 'k', '\0',
   /* "uk.search.yahoo.com", false */ 'u', 'k', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0',
   /* "ukchemicalresearch.org", true */ 'u', 'k', 'c', 'h', 'e', 'm', 'i', 'c', 'a', 'l', 'r', 'e', 's', 'e', 'a', 'r', 'c', 'h', '.', 'o', 'r', 'g', '\0',
   /* "ukdefencejournal.org.uk", true */ 'u', 'k', 'd', 'e', 'f', 'e', 'n', 'c', 'e', 'j', 'o', 'u', 'r', 'n', 'a', 'l', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0',
   /* "ukhas.net", true */ 'u', 'k', 'h', 'a', 's', '.', 'n', 'e', 't', '\0',
   /* "ukk.dk", false */ 'u', 'k', 'k', '.', 'd', 'k', '\0',
@@ -13178,16 +13166,17 @@ static const char kSTSHostTable[] = {
   /* "vmoagents.com", false */ 'v', 'm', 'o', 'a', 'g', 'e', 'n', 't', 's', '.', 'c', 'o', 'm', '\0',
   /* "vn.search.yahoo.com", false */ 'v', 'n', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0',
   /* "vnd.cloud", true */ 'v', 'n', 'd', '.', 'c', 'l', 'o', 'u', 'd', '\0',
   /* "vnvisa.center", true */ 'v', 'n', 'v', 'i', 's', 'a', '.', 'c', 'e', 'n', 't', 'e', 'r', '\0',
   /* "vnvisa.ru", true */ 'v', 'n', 'v', 'i', 's', 'a', '.', 'r', 'u', '\0',
   /* "vocab.guru", true */ 'v', 'o', 'c', 'a', 'b', '.', 'g', 'u', 'r', 'u', '\0',
   /* "vocaloid.my", true */ 'v', 'o', 'c', 'a', 'l', 'o', 'i', 'd', '.', 'm', 'y', '\0',
   /* "vodpay.com", true */ 'v', 'o', 'd', 'p', 'a', 'y', '.', 'c', 'o', 'm', '\0',
+  /* "vogler.name", true */ 'v', 'o', 'g', 'l', 'e', 'r', '.', 'n', 'a', 'm', 'e', '\0',
   /* "vogt.tech", true */ 'v', 'o', 'g', 't', '.', 't', 'e', 'c', 'h', '\0',
   /* "voidi.ca", true */ 'v', 'o', 'i', 'd', 'i', '.', 'c', 'a', '\0',
   /* "voidpay.com", true */ 'v', 'o', 'i', 'd', 'p', 'a', 'y', '.', 'c', 'o', 'm', '\0',
   /* "vokeapp.com", true */ 'v', 'o', 'k', 'e', 'a', 'p', 'p', '.', 'c', 'o', 'm', '\0',
   /* "volcain.io", true */ 'v', 'o', 'l', 'c', 'a', 'i', 'n', '.', 'i', 'o', '\0',
   /* "volkden.com", true */ 'v', 'o', 'l', 'k', 'd', 'e', 'n', '.', 'c', 'o', 'm', '\0',
   /* "volker-gropp.de", true */ 'v', 'o', 'l', 'k', 'e', 'r', '-', 'g', 'r', 'o', 'p', 'p', '.', 'd', 'e', '\0',
   /* "volkergropp.de", true */ 'v', 'o', 'l', 'k', 'e', 'r', 'g', 'r', 'o', 'p', 'p', '.', 'd', 'e', '\0',
@@ -13319,16 +13308,17 @@ static const char kSTSHostTable[] = {
   /* "wearegenki.com", true */ 'w', 'e', 'a', 'r', 'e', 'g', 'e', 'n', 'k', 'i', '.', 'c', 'o', 'm', '\0',
   /* "wearepapermill.co", true */ 'w', 'e', 'a', 'r', 'e', 'p', 'a', 'p', 'e', 'r', 'm', 'i', 'l', 'l', '.', 'c', 'o', '\0',
   /* "wearvr.com", true */ 'w', 'e', 'a', 'r', 'v', 'r', '.', 'c', 'o', 'm', '\0',
   /* "weather-and-climate.com", false */ 'w', 'e', 'a', 't', 'h', 'e', 'r', '-', 'a', 'n', 'd', '-', 'c', 'l', 'i', 'm', 'a', 't', 'e', '.', 'c', 'o', 'm', '\0',
   /* "weathermyway.rocks", true */ 'w', 'e', 'a', 't', 'h', 'e', 'r', 'm', 'y', 'w', 'a', 'y', '.', 'r', 'o', 'c', 'k', 's', '\0',
   /* "web-hotel.gr", true */ 'w', 'e', 'b', '-', 'h', 'o', 't', 'e', 'l', '.', 'g', 'r', '\0',
   /* "web-industry.fr", true */ 'w', 'e', 'b', '-', 'i', 'n', 'd', 'u', 's', 't', 'r', 'y', '.', 'f', 'r', '\0',
   /* "web-torrent.com", false */ 'w', 'e', 'b', '-', 't', 'o', 'r', 'r', 'e', 'n', 't', '.', 'c', 'o', 'm', '\0',
+  /* "web-vision.de", true */ 'w', 'e', 'b', '-', 'v', 'i', 's', 'i', 'o', 'n', '.', 'd', 'e', '\0',
   /* "web.cc", true */ 'w', 'e', 'b', '.', 'c', 'c', '\0',
   /* "web2033.com", true */ 'w', 'e', 'b', '2', '0', '3', '3', '.', 'c', 'o', 'm', '\0',
   /* "webandmore.de", false */ 'w', 'e', 'b', 'a', 'n', 'd', 'm', 'o', 'r', 'e', '.', 'd', 'e', '\0',
   /* "webbhuset.se", false */ 'w', 'e', 'b', 'b', 'h', 'u', 's', 'e', 't', '.', 's', 'e', '\0',
   /* "webcamtoy.com", true */ 'w', 'e', 'b', 'c', 'a', 'm', 't', 'o', 'y', '.', 'c', 'o', 'm', '\0',
   /* "webchat.domains", false */ 'w', 'e', 'b', 'c', 'h', 'a', 't', '.', 'd', 'o', 'm', 'a', 'i', 'n', 's', '\0',
   /* "webcollect.org.uk", true */ 'w', 'e', 'b', 'c', 'o', 'l', 'l', 'e', 'c', 't', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0',
   /* "webdesigneauclaire.com", true */ 'w', 'e', 'b', 'd', 'e', 's', 'i', 'g', 'n', 'e', 'a', 'u', 'c', 'l', 'a', 'i', 'r', 'e', '.', 'c', 'o', 'm', '\0',
@@ -13893,17 +13883,16 @@ static const char kSTSHostTable[] = {
   /* "yakmade.com", true */ 'y', 'a', 'k', 'm', 'a', 'd', 'e', '.', 'c', 'o', 'm', '\0',
   /* "yakmoo.se", true */ 'y', 'a', 'k', 'm', 'o', 'o', '.', 's', 'e', '\0',
   /* "yal.sh", true */ 'y', 'a', 'l', '.', 's', 'h', '\0',
   /* "yalook.com", true */ 'y', 'a', 'l', 'o', 'o', 'k', '.', 'c', 'o', 'm', '\0',
   /* "yamadaya.tv", true */ 'y', 'a', 'm', 'a', 'd', 'a', 'y', 'a', '.', 't', 'v', '\0',
   /* "yameveo.com", false */ 'y', 'a', 'm', 'e', 'v', 'e', 'o', '.', 'c', 'o', 'm', '\0',
   /* "yanovich.net", true */ 'y', 'a', 'n', 'o', 'v', 'i', 'c', 'h', '.', 'n', 'e', 't', '\0',
   /* "yantrasthal.com", true */ 'y', 'a', 'n', 't', 'r', 'a', 's', 't', 'h', 'a', 'l', '.', 'c', 'o', 'm', '\0',
-  /* "yanwh.xyz", true */ 'y', 'a', 'n', 'w', 'h', '.', 'x', 'y', 'z', '\0',
   /* "yaoidreams.com", true */ 'y', 'a', 'o', 'i', 'd', 'r', 'e', 'a', 'm', 's', '.', 'c', 'o', 'm', '\0',
   /* "yapbreak.fr", true */ 'y', 'a', 'p', 'b', 'r', 'e', 'a', 'k', '.', 'f', 'r', '\0',
   /* "yarcom.ru", false */ 'y', 'a', 'r', 'c', 'o', 'm', '.', 'r', 'u', '\0',
   /* "yarogneva.ru", true */ 'y', 'a', 'r', 'o', 'g', 'n', 'e', 'v', 'a', '.', 'r', 'u', '\0',
   /* "yatesun.com", true */ 'y', 'a', 't', 'e', 's', 'u', 'n', '.', 'c', 'o', 'm', '\0',
   /* "yaup.tk", true */ 'y', 'a', 'u', 'p', '.', 't', 'k', '\0',
   /* "yawen.tw", true */ 'y', 'a', 'w', 'e', 'n', '.', 't', 'w', '\0',
   /* "yawnbox.com", true */ 'y', 'a', 'w', 'n', 'b', 'o', 'x', '.', 'c', 'o', 'm', '\0',
@@ -13964,16 +13953,17 @@ static const char kSTSHostTable[] = {
   /* "yourself.today", true */ 'y', 'o', 'u', 'r', 's', 'e', 'l', 'f', '.', 't', 'o', 'd', 'a', 'y', '\0',
   /* "yourznc.com", true */ 'y', 'o', 'u', 'r', 'z', 'n', 'c', '.', 'c', 'o', 'm', '\0',
   /* "youtous.me", true */ 'y', 'o', 'u', 't', 'o', 'u', 's', '.', 'm', 'e', '\0',
   /* "youtubedownloader.com", true */ 'y', 'o', 'u', 't', 'u', 'b', 'e', 'd', 'o', 'w', 'n', 'l', 'o', 'a', 'd', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "youyoulemon.com", true */ 'y', 'o', 'u', 'y', 'o', 'u', 'l', 'e', 'm', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "yoyoost.duckdns.org", true */ 'y', 'o', 'y', 'o', 'o', 's', 't', '.', 'd', 'u', 'c', 'k', 'd', 'n', 's', '.', 'o', 'r', 'g', '\0',
   /* "ypart.eu", true */ 'y', 'p', 'a', 'r', 't', '.', 'e', 'u', '\0',
   /* "ypcs.fi", true */ 'y', 'p', 'c', 's', '.', 'f', 'i', '\0',
+  /* "ypid.de", true */ 'y', 'p', 'i', 'd', '.', 'd', 'e', '\0',
   /* "ypiresia.fr", false */ 'y', 'p', 'i', 'r', 'e', 's', 'i', 'a', '.', 'f', 'r', '\0',
   /* "yplanapp.com", true */ 'y', 'p', 'l', 'a', 'n', 'a', 'p', 'p', '.', 'c', 'o', 'm', '\0',
   /* "ys-shop.biz", true */ 'y', 's', '-', 's', 'h', 'o', 'p', '.', 'b', 'i', 'z', '\0',
   /* "ytcuber.xyz", true */ 'y', 't', 'c', 'u', 'b', 'e', 'r', '.', 'x', 'y', 'z', '\0',
   /* "ytuquelees.net", true */ 'y', 't', 'u', 'q', 'u', 'e', 'l', 'e', 'e', 's', '.', 'n', 'e', 't', '\0',
   /* "ytvwld.de", true */ 'y', 't', 'v', 'w', 'l', 'd', '.', 'd', 'e', '\0',
   /* "yuanben.io", true */ 'y', 'u', 'a', 'n', 'b', 'e', 'n', '.', 'i', 'o', '\0',
   /* "yuanbenlian.com", true */ 'y', 'u', 'a', 'n', 'b', 'e', 'n', 'l', 'i', 'a', 'n', '.', 'c', 'o', 'm', '\0',
@@ -14019,16 +14009,17 @@ static const char kSTSHostTable[] = {
   /* "zaoshanghao-dajia.rhcloud.com", true */ 'z', 'a', 'o', 's', 'h', 'a', 'n', 'g', 'h', 'a', 'o', '-', 'd', 'a', 'j', 'i', 'a', '.', 'r', 'h', 'c', 'l', 'o', 'u', 'd', '.', 'c', 'o', 'm', '\0',
   /* "zapier.com", true */ 'z', 'a', 'p', 'i', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "zappbuildapps.com", true */ 'z', 'a', 'p', 'p', 'b', 'u', 'i', 'l', 'd', 'a', 'p', 'p', 's', '.', 'c', 'o', 'm', '\0',
   /* "zary.me", true */ 'z', 'a', 'r', 'y', '.', 'm', 'e', '\0',
   /* "zaufanatrzeciastrona.pl", true */ 'z', 'a', 'u', 'f', 'a', 'n', 'a', 't', 'r', 'z', 'e', 'c', 'i', 'a', 's', 't', 'r', 'o', 'n', 'a', '.', 'p', 'l', '\0',
   /* "zavca.com", true */ 'z', 'a', 'v', 'c', 'a', '.', 'c', 'o', 'm', '\0',
   /* "zbasenem.pl", true */ 'z', 'b', 'a', 's', 'e', 'n', 'e', 'm', '.', 'p', 'l', '\0',
   /* "zbchen.com", true */ 'z', 'b', 'c', 'h', 'e', 'n', '.', 'c', 'o', 'm', '\0',
+  /* "zberger.com", true */ 'z', 'b', 'e', 'r', 'g', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "zbrane-doplnky.cz", true */ 'z', 'b', 'r', 'a', 'n', 'e', '-', 'd', 'o', 'p', 'l', 'n', 'k', 'y', '.', 'c', 'z', '\0',
   /* "zbyga.cz", true */ 'z', 'b', 'y', 'g', 'a', '.', 'c', 'z', '\0',
   /* "zcarot.com", true */ 'z', 'c', 'a', 'r', 'o', 't', '.', 'c', 'o', 'm', '\0',
   /* "zcarrot.com", true */ 'z', 'c', 'a', 'r', 'r', 'o', 't', '.', 'c', 'o', 'm', '\0',
   /* "zcon.nl", true */ 'z', 'c', 'o', 'n', '.', 'n', 'l', '\0',
   /* "zcr.ca", true */ 'z', 'c', 'r', '.', 'c', 'a', '\0',
   /* "zdbl.de", true */ 'z', 'd', 'b', 'l', '.', 'd', 'e', '\0',
   /* "zdrojak.cz", true */ 'z', 'd', 'r', 'o', 'j', 'a', 'k', '.', 'c', 'z', '\0',
@@ -14064,17 +14055,16 @@ static const char kSTSHostTable[] = {
   /* "zetorzeszow.pl", true */ 'z', 'e', 't', 'o', 'r', 'z', 'e', 's', 'z', 'o', 'w', '.', 'p', 'l', '\0',
   /* "zettaplan.ru", true */ 'z', 'e', 't', 't', 'a', 'p', 'l', 'a', 'n', '.', 'r', 'u', '\0',
   /* "zewtie.com", true */ 'z', 'e', 'w', 't', 'i', 'e', '.', 'c', 'o', 'm', '\0',
   /* "zgrep.org", true */ 'z', 'g', 'r', 'e', 'p', '.', 'o', 'r', 'g', '\0',
   /* "zhang-hao.com", true */ 'z', 'h', 'a', 'n', 'g', '-', 'h', 'a', 'o', '.', 'c', 'o', 'm', '\0',
   /* "zhanghao.me", true */ 'z', 'h', 'a', 'n', 'g', 'h', 'a', 'o', '.', 'm', 'e', '\0',
   /* "zhangruilin.com", true */ 'z', 'h', 'a', 'n', 'g', 'r', 'u', 'i', 'l', 'i', 'n', '.', 'c', 'o', 'm', '\0',
   /* "zhangyuhao.com", true */ 'z', 'h', 'a', 'n', 'g', 'y', 'u', 'h', 'a', 'o', '.', 'c', 'o', 'm', '\0',
-  /* "zhaochen.xyz", true */ 'z', 'h', 'a', 'o', 'c', 'h', 'e', 'n', '.', 'x', 'y', 'z', '\0',
   /* "zhaofeng.li", true */ 'z', 'h', 'a', 'o', 'f', 'e', 'n', 'g', '.', 'l', 'i', '\0',
   /* "zhengjie.com", true */ 'z', 'h', 'e', 'n', 'g', 'j', 'i', 'e', '.', 'c', 'o', 'm', '\0',
   /* "zhengzexin.com", true */ 'z', 'h', 'e', 'n', 'g', 'z', 'e', 'x', 'i', 'n', '.', 'c', 'o', 'm', '\0',
   /* "zhh.in", true */ 'z', 'h', 'h', '.', 'i', 'n', '\0',
   /* "zhihua-lai.com", true */ 'z', 'h', 'i', 'h', 'u', 'a', '-', 'l', 'a', 'i', '.', 'c', 'o', 'm', '\0',
   /* "zhovner.com", true */ 'z', 'h', 'o', 'v', 'n', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "zi0r.com", true */ 'z', 'i', '0', 'r', '.', 'c', 'o', 'm', '\0',
   /* "zifb.in", true */ 'z', 'i', 'f', 'b', '.', 'i', 'n', '\0',
@@ -14336,13958 +14326,13948 @@ static const nsSTSPreload kSTSPreloadLis
   { 2099, true },
   { 2108, true },
   { 2120, true },
   { 2129, true },
   { 2150, true },
   { 2174, true },
   { 2189, true },
   { 2200, true },
-  { 2206, true },
-  { 2219, true },
-  { 2231, true },
-  { 2243, true },
-  { 2253, true },
-  { 2270, true },
-  { 2277, true },
-  { 2286, true },
-  { 2307, true },
-  { 2320, false },
-  { 2333, true },
-  { 2343, true },
-  { 2396, true },
-  { 2408, true },
-  { 2417, true },
-  { 2426, true },
-  { 2436, true },
-  { 2446, true },
-  { 2457, true },
-  { 2465, true },
-  { 2477, true },
-  { 2487, true },
-  { 2506, true },
-  { 2517, true },
-  { 2528, true },
-  { 2537, true },
-  { 2550, true },
-  { 2570, true },
-  { 2585, true },
-  { 2600, true },
-  { 2608, true },
-  { 2618, true },
-  { 2635, true },
-  { 2650, true },
-  { 2660, true },
-  { 2667, true },
-  { 2678, true },
-  { 2693, true },
-  { 2712, true },
-  { 2722, true },
-  { 2733, true },
-  { 2751, true },
-  { 2762, true },
-  { 2776, true },
-  { 2788, true },
-  { 2810, true },
-  { 2826, true },
-  { 2837, false },
-  { 2853, false },
-  { 2865, true },
-  { 2878, true },
-  { 2891, true },
-  { 2908, true },
-  { 2933, false },
-  { 2941, true },
-  { 2965, true },
-  { 2978, true },
-  { 2990, true },
-  { 3001, true },
-  { 3025, true },
-  { 3038, true },
-  { 3047, true },
-  { 3064, true },
+  { 2213, true },
+  { 2225, true },
+  { 2237, true },
+  { 2247, true },
+  { 2264, true },
+  { 2271, true },
+  { 2280, true },
+  { 2301, true },
+  { 2314, false },
+  { 2327, true },
+  { 2337, true },
+  { 2390, true },
+  { 2402, true },
+  { 2411, true },
+  { 2420, true },
+  { 2430, true },
+  { 2440, true },
+  { 2451, true },
+  { 2459, true },
+  { 2471, true },
+  { 2481, true },
+  { 2500, true },
+  { 2511, true },
+  { 2522, true },
+  { 2531, true },
+  { 2544, true },
+  { 2564, true },
+  { 2579, true },
+  { 2594, true },
+  { 2602, true },
+  { 2612, true },
+  { 2629, true },
+  { 2644, true },
+  { 2654, true },
+  { 2661, true },
+  { 2672, true },
+  { 2687, true },
+  { 2706, true },
+  { 2716, true },
+  { 2727, true },
+  { 2745, true },
+  { 2756, true },
+  { 2770, true },
+  { 2782, true },
+  { 2804, true },
+  { 2820, true },
+  { 2831, false },
+  { 2847, false },
+  { 2859, true },
+  { 2872, true },
+  { 2889, true },
+  { 2914, false },
+  { 2922, true },
+  { 2946, true },
+  { 2959, true },
+  { 2971, true },
+  { 2982, true },
+  { 3006, true },
+  { 3019, true },
+  { 3028, true },
+  { 3045, true },
+  { 3057, true },
   { 3076, true },
-  { 3095, true },
-  { 3118, true },
-  { 3132, true },
-  { 3148, true },
-  { 3161, true },
-  { 3178, true },
-  { 3198, true },
-  { 3213, true },
-  { 3234, true },
-  { 3254, true },
-  { 3266, true },
-  { 3277, true },
-  { 3296, false },
-  { 3303, true },
-  { 3315, true },
-  { 3336, true },
-  { 3348, true },
-  { 3365, true },
-  { 3378, true },
-  { 3394, true },
-  { 3406, true },
-  { 3419, true },
-  { 3434, false },
-  { 3443, false },
-  { 3453, true },
-  { 3468, true },
-  { 3485, true },
-  { 3499, true },
-  { 3515, true },
-  { 3526, true },
-  { 3538, true },
-  { 3559, false },
-  { 3569, true },
-  { 3584, true },
-  { 3598, false },
-  { 3611, true },
-  { 3620, true },
-  { 3634, true },
-  { 3646, true },
-  { 3661, true },
-  { 3674, true },
-  { 3686, true },
-  { 3698, true },
-  { 3710, true },
-  { 3722, true },
+  { 3099, true },
+  { 3113, true },
+  { 3129, true },
+  { 3142, true },
+  { 3159, true },
+  { 3179, true },
+  { 3194, true },
+  { 3215, true },
+  { 3235, true },
+  { 3247, true },
+  { 3258, true },
+  { 3277, false },
+  { 3284, true },
+  { 3296, true },
+  { 3317, true },
+  { 3329, true },
+  { 3346, true },
+  { 3359, true },
+  { 3375, true },
+  { 3387, true },
+  { 3400, true },
+  { 3415, false },
+  { 3424, false },
+  { 3434, true },
+  { 3449, true },
+  { 3466, true },
+  { 3480, true },
+  { 3496, true },
+  { 3507, true },
+  { 3519, true },
+  { 3540, false },
+  { 3550, true },
+  { 3565, true },
+  { 3579, false },
+  { 3592, true },
+  { 3601, true },
+  { 3615, true },
+  { 3627, true },
+  { 3642, true },
+  { 3655, true },
+  { 3667, true },
+  { 3679, true },
+  { 3691, true },
+  { 3703, true },
+  { 3715, true },
+  { 3723, true },
   { 3734, true },
-  { 3742, true },
-  { 3753, true },
-  { 3767, true },
-  { 3783, true },
-  { 3796, true },
-  { 3813, true },
-  { 3828, true },
-  { 3843, true },
-  { 3861, true },
-  { 3870, true },
-  { 3883, true },
+  { 3748, true },
+  { 3764, true },
+  { 3777, true },
+  { 3794, true },
+  { 3809, true },
+  { 3824, true },
+  { 3842, true },
+  { 3851, true },
+  { 3864, true },
+  { 3885, true },
+  { 3894, true },
   { 3904, true },
-  { 3913, true },
-  { 3923, true },
-  { 3948, true },
+  { 3929, true },
+  { 3940, true },
   { 3959, true },
-  { 3978, true },
+  { 3971, true },
   { 3990, true },
   { 4009, true },
   { 4028, true },
-  { 4047, true },
-  { 4059, true },
-  { 4074, true },
-  { 4085, true },
-  { 4098, true },
-  { 4110, true },
-  { 4123, true },
-  { 4137, true },
-  { 4148, true },
-  { 4157, true },
-  { 4171, true },
-  { 4183, true },
-  { 4210, true },
-  { 4236, true },
-  { 4249, true },
-  { 4260, true },
-  { 4284, true },
-  { 4301, true },
-  { 4329, true },
+  { 4040, true },
+  { 4055, true },
+  { 4066, true },
+  { 4079, true },
+  { 4091, true },
+  { 4104, true },
+  { 4118, true },
+  { 4129, true },
+  { 4138, true },
+  { 4152, true },
+  { 4164, true },
+  { 4191, true },
+  { 4217, true },
+  { 4230, true },
+  { 4241, true },
+  { 4265, true },
+  { 4282, true },
+  { 4310, true },
+  { 4326, true },
+  { 4335, true },
   { 4345, true },
-  { 4354, true },
-  { 4364, true },
+  { 4359, true },
   { 4378, true },
-  { 4397, true },
-  { 4407, true },
-  { 4421, true },
-  { 4429, false },
-  { 4450, true },
-  { 4468, true },
+  { 4388, true },
+  { 4402, true },
+  { 4410, false },
+  { 4431, true },
+  { 4449, true },
+  { 4458, true },
   { 4477, true },
-  { 4496, true },
+  { 4491, true },
   { 4510, true },
-  { 4529, true },
-  { 4542, true },
-  { 4553, true },
-  { 4573, true },
-  { 4591, true },
-  { 4609, false },
-  { 4628, true },
-  { 4642, true },
-  { 4663, true },
-  { 4679, true },
-  { 4689, true },
-  { 4702, true },
-  { 4715, true },
-  { 4729, true },
-  { 4743, true },
-  { 4753, true },
-  { 4763, true },
-  { 4773, true },
-  { 4783, true },
-  { 4793, true },
-  { 4803, true },
-  { 4820, true },
-  { 4830, false },
-  { 4838, true },
-  { 4849, true },
-  { 4860, true },
-  { 4871, true },
-  { 4880, true },
-  { 4900, true },
-  { 4911, true },
-  { 4928, true },
-  { 4952, true },
+  { 4523, true },
+  { 4534, true },
+  { 4554, true },
+  { 4572, true },
+  { 4590, false },
+  { 4609, true },
+  { 4623, true },
+  { 4644, true },
+  { 4660, true },
+  { 4670, true },
+  { 4683, true },
+  { 4696, true },
+  { 4710, true },
+  { 4724, true },
+  { 4734, true },
+  { 4744, true },
+  { 4754, true },
+  { 4764, true },
+  { 4774, true },
+  { 4784, true },
+  { 4801, true },
+  { 4811, false },
+  { 4819, true },
+  { 4830, true },
+  { 4841, true },
+  { 4852, true },
+  { 4861, true },
+  { 4881, true },
+  { 4892, true },
+  { 4909, true },
+  { 4933, true },
+  { 4947, true },
   { 4966, true },
-  { 4985, true },
-  { 4997, true },
-  { 5013, true },
-  { 5024, true },
-  { 5038, true },
-  { 5054, true },
-  { 5069, true },
-  { 5077, true },
-  { 5094, true },
-  { 5106, true },
-  { 5123, true },
-  { 5131, false },
-  { 5147, true },
-  { 5155, true },
-  { 5169, true },
-  { 5181, true },
-  { 5194, true },
-  { 5206, true },
-  { 5218, true },
-  { 5232, true },
-  { 5244, true },
-  { 5254, true },
-  { 5262, true },
-  { 5272, true },
-  { 5286, true },
-  { 5299, true },
+  { 4978, true },
+  { 4994, true },
+  { 5005, true },
+  { 5019, true },
+  { 5035, true },
+  { 5050, true },
+  { 5058, true },
+  { 5075, true },
+  { 5087, true },
+  { 5104, true },
+  { 5112, false },
+  { 5128, true },
+  { 5136, true },
+  { 5150, true },
+  { 5162, true },
+  { 5175, true },
+  { 5187, true },
+  { 5199, true },
+  { 5213, true },
+  { 5225, true },
+  { 5235, true },
+  { 5243, true },
+  { 5253, true },
+  { 5267, true },
+  { 5280, true },
+  { 5292, true },
   { 5311, true },
   { 5330, true },
-  { 5349, true },
-  { 5382, true },
-  { 5392, true },
-  { 5406, true },
-  { 5413, true },
-  { 5430, true },
-  { 5439, true },
-  { 5446, true },
+  { 5363, true },
+  { 5373, true },
+  { 5387, true },
+  { 5394, true },
+  { 5411, true },
+  { 5420, true },
+  { 5427, true },
+  { 5441, true },
+  { 5449, true },
   { 5460, true },
-  { 5468, true },
-  { 5479, true },
-  { 5494, true },
-  { 5509, true },
-  { 5526, true },
-  { 5536, true },
-  { 5547, true },
-  { 5562, true },
-  { 5573, true },
-  { 5585, true },
-  { 5596, true },
-  { 5616, true },
-  { 5627, true },
-  { 5638, true },
-  { 5649, true },
-  { 5662, true },
-  { 5680, true },
-  { 5692, true },
-  { 5701, true },
-  { 5715, true },
-  { 5726, true },
-  { 5743, true },
-  { 5754, true },
-  { 5763, false },
-  { 5789, true },
-  { 5800, true },
-  { 5810, false },
-  { 5827, true },
-  { 5837, true },
-  { 5851, true },
-  { 5863, true },
-  { 5872, true },
-  { 5889, true },
-  { 5896, true },
-  { 5920, true },
-  { 5936, true },
-  { 5956, true },
-  { 5981, true },
-  { 6006, true },
-  { 6031, true },
-  { 6043, true },
-  { 6055, true },
-  { 6064, true },
-  { 6091, true },
-  { 6104, false },
-  { 6113, true },
-  { 6129, true },
-  { 6145, true },
-  { 6157, true },
-  { 6171, true },
-  { 6191, true },
-  { 6206, true },
-  { 6227, true },
-  { 6239, true },
-  { 6249, true },
-  { 6261, true },
-  { 6273, true },
-  { 6282, true },
+  { 5475, true },
+  { 5490, true },
+  { 5507, true },
+  { 5517, true },
+  { 5528, true },
+  { 5543, true },
+  { 5554, true },
+  { 5566, true },
+  { 5577, true },
+  { 5597, true },
+  { 5608, true },
+  { 5619, true },
+  { 5630, true },
+  { 5643, true },
+  { 5661, true },
+  { 5673, true },
+  { 5682, true },
+  { 5696, true },
+  { 5707, true },
+  { 5724, true },
+  { 5735, true },
+  { 5744, false },
+  { 5770, true },
+  { 5781, true },
+  { 5791, false },
+  { 5808, true },
+  { 5818, true },
+  { 5832, true },
+  { 5844, true },
+  { 5853, true },
+  { 5870, true },
+  { 5877, true },
+  { 5901, true },
+  { 5917, true },
+  { 5937, true },
+  { 5962, true },
+  { 5987, true },
+  { 6012, true },
+  { 6024, true },
+  { 6036, true },
+  { 6045, true },
+  { 6072, true },
+  { 6085, false },
+  { 6094, true },
+  { 6110, true },
+  { 6126, true },
+  { 6138, true },
+  { 6152, true },
+  { 6172, true },
+  { 6187, true },
+  { 6208, true },
+  { 6220, true },
+  { 6230, true },
+  { 6242, true },
+  { 6254, true },
+  { 6263, true },
+  { 6275, true },
   { 6294, true },
-  { 6313, true },
-  { 6326, true },
-  { 6337, true },
-  { 6346, true },
-  { 6360, true },
-  { 6374, true },
-  { 6390, true },
-  { 6406, true },
-  { 6426, true },
-  { 6447, true },
-  { 6461, true },
-  { 6471, true },
-  { 6486, true },
-  { 6496, true },
-  { 6511, true },
-  { 6529, true },
-  { 6543, true },
-  { 6555, true },
-  { 6570, true },
-  { 6584, true },
-  { 6599, true },
-  { 6609, true },
-  { 6623, true },
-  { 6640, true },
-  { 6655, true },
-  { 6669, true },
-  { 6683, true },
-  { 6699, true },
-  { 6711, false },
-  { 6726, true },
-  { 6738, true },
-  { 6753, true },
-  { 6767, true },
-  { 6789, true },
-  { 6801, true },
-  { 6822, true },
-  { 6834, true },
-  { 6847, true },
-  { 6859, true },
-  { 6872, true },
-  { 6887, true },
-  { 6898, true },
-  { 6914, true },
-  { 6925, true },
-  { 6937, true },
-  { 6950, true },
-  { 6970, true },
-  { 6983, true },
-  { 7001, true },
-  { 7018, true },
+  { 6307, true },
+  { 6318, true },
+  { 6327, true },
+  { 6341, true },
+  { 6355, true },
+  { 6371, true },
+  { 6387, true },
+  { 6407, true },
+  { 6428, true },
+  { 6442, true },
+  { 6452, true },
+  { 6467, true },
+  { 6477, true },
+  { 6492, true },
+  { 6510, true },
+  { 6524, true },
+  { 6536, true },
+  { 6551, true },
+  { 6565, true },
+  { 6580, true },
+  { 6590, true },
+  { 6604, true },
+  { 6621, true },
+  { 6636, true },
+  { 6650, true },
+  { 6664, true },
+  { 6680, true },
+  { 6692, false },
+  { 6707, true },
+  { 6719, true },
+  { 6734, true },
+  { 6748, true },
+  { 6770, true },
+  { 6782, true },
+  { 6803, true },
+  { 6815, true },
+  { 6828, true },
+  { 6840, true },
+  { 6853, true },
+  { 6868, true },
+  { 6879, true },
+  { 6895, true },
+  { 6906, true },
+  { 6918, true },
+  { 6931, true },
+  { 6951, true },
+  { 6964, true },
+  { 6982, true },
+  { 6999, true },
+  { 7023, true },
   { 7042, true },
-  { 7061, true },
-  { 7072, true },
-  { 7086, true },
+  { 7053, true },
+  { 7067, true },
+  { 7083, true },
   { 7102, true },
-  { 7121, true },
-  { 7134, true },
-  { 7155, true },
-  { 7175, true },
-  { 7195, true },
-  { 7208, false },
-  { 7221, true },
-  { 7233, true },
-  { 7243, true },
-  { 7256, true },
-  { 7270, true },
-  { 7286, true },
-  { 7300, true },
-  { 7316, true },
-  { 7328, true },
-  { 7342, true },
-  { 7355, true },
-  { 7369, true },
-  { 7377, true },
-  { 7390, true },
+  { 7115, true },
+  { 7136, true },
+  { 7156, true },
+  { 7176, true },
+  { 7189, false },
+  { 7202, true },
+  { 7214, true },
+  { 7224, true },
+  { 7237, true },
+  { 7251, true },
+  { 7267, true },
+  { 7281, true },
+  { 7297, true },
+  { 7309, true },
+  { 7323, true },
+  { 7336, true },
+  { 7350, true },
+  { 7358, true },
+  { 7371, true },
+  { 7386, true },
   { 7405, true },
-  { 7424, true },
-  { 7436, true },
-  { 7450, true },
-  { 7464, true },
-  { 7476, true },
-  { 7491, true },
-  { 7502, true },
-  { 7513, true },
+  { 7417, true },
+  { 7431, true },
+  { 7445, true },
+  { 7457, true },
+  { 7472, true },
+  { 7483, true },
+  { 7494, true },
+  { 7506, true },
+  { 7514, true },
   { 7525, true },
   { 7533, true },
-  { 7544, true },
-  { 7552, true },
-  { 7560, true },
-  { 7568, true },
-  { 7576, true },
-  { 7589, true },
-  { 7596, true },
-  { 7606, true },
-  { 7619, true },
-  { 7631, true },
-  { 7644, true },
-  { 7664, true },
-  { 7676, true },
-  { 7687, true },
-  { 7705, true },
-  { 7718, true },
-  { 7727, true },
-  { 7739, true },
-  { 7752, true },
-  { 7763, true },
-  { 7773, true },
-  { 7784, true },
-  { 7794, true },
-  { 7805, true },
-  { 7814, true },
-  { 7823, true },
-  { 7839, true },
-  { 7855, true },
-  { 7883, true },
-  { 7902, true },
-  { 7917, true },
-  { 7937, true },
-  { 7949, true },
-  { 7961, true },
-  { 7972, true },
-  { 7983, true },
-  { 7998, true },
-  { 8018, true },
-  { 8036, true },
-  { 8046, false },
-  { 8057, true },
-  { 8067, true },
-  { 8084, true },
-  { 8095, true },
-  { 8104, true },
-  { 8115, true },
-  { 8134, true },
-  { 8145, true },
-  { 8163, true },
-  { 8189, true },
-  { 8211, true },
-  { 8225, true },
-  { 8240, true },
-  { 8254, true },
-  { 8268, true },
-  { 8283, true },
-  { 8304, true },
-  { 8314, true },
-  { 8325, true },
-  { 8346, true },
-  { 8364, true },
-  { 8377, true },
-  { 8385, true },
-  { 8398, true },
-  { 8412, true },
-  { 8430, true },
-  { 8452, true },
-  { 8467, true },
-  { 8484, true },
-  { 8506, true },
-  { 8521, true },
-  { 8538, true },
-  { 8554, true },
-  { 8570, true },
-  { 8587, true },
-  { 8602, true },
-  { 8621, true },
-  { 8638, true },
-  { 8655, true },
-  { 8667, true },
-  { 8685, true },
-  { 8702, true },
-  { 8717, true },
-  { 8731, true },
-  { 8748, true },
-  { 8766, true },
-  { 8781, true },
-  { 8793, true },
-  { 8806, true },
-  { 8826, true },
-  { 8837, true },
-  { 8848, true },
-  { 8859, true },
-  { 8870, true },
-  { 8881, true },
-  { 8892, true },
-  { 8904, true },
-  { 8917, true },
-  { 8936, true },
-  { 8947, true },
-  { 8960, true },
-  { 8974, false },
-  { 8987, false },
-  { 8996, true },
-  { 9013, true },
-  { 9033, true },
-  { 9044, true },
-  { 9062, true },
-  { 9094, true },
-  { 9121, true },
-  { 9131, true },
-  { 9149, true },
-  { 9164, true },
-  { 9176, true },
-  { 9188, true },
-  { 9208, true },
-  { 9227, true },
-  { 9247, true },
-  { 9270, true },
-  { 9294, true },
-  { 9306, true },
-  { 9317, true },
-  { 9329, true },
-  { 9341, true },
-  { 9357, true },
-  { 9374, true },
-  { 9393, true },
-  { 9407, true },
-  { 9418, true },
-  { 9429, true },
-  { 9442, true },
-  { 9454, false },
-  { 9478, true },
-  { 9494, true },
-  { 9510, true },
-  { 9522, true },
-  { 9538, true },
-  { 9555, true },
-  { 9569, true },
-  { 9580, true },
-  { 9598, true },
-  { 9614, true },
-  { 9635, true },
-  { 9649, true },
-  { 9664, true },
-  { 9674, true },
+  { 7541, true },
+  { 7549, true },
+  { 7557, true },
+  { 7570, true },
+  { 7577, true },
+  { 7587, true },
+  { 7600, true },
+  { 7612, true },
+  { 7625, true },
+  { 7645, true },
+  { 7657, true },
+  { 7668, true },
+  { 7686, true },
+  { 7699, true },
+  { 7708, true },
+  { 7720, true },
+  { 7734, true },
+  { 7747, true },
+  { 7758, true },
+  { 7768, true },
+  { 7779, true },
+  { 7789, true },
+  { 7800, true },
+  { 7809, true },
+  { 7818, true },
+  { 7834, true },
+  { 7850, true },
+  { 7878, true },
+  { 7897, true },
+  { 7912, true },
+  { 7932, true },
+  { 7944, true },
+  { 7956, true },
+  { 7967, true },
+  { 7978, true },
+  { 7993, true },
+  { 8013, true },
+  { 8031, true },
+  { 8041, false },
+  { 8052, true },
+  { 8062, true },
+  { 8079, true },
+  { 8090, true },
+  { 8099, true },
+  { 8110, true },
+  { 8129, true },
+  { 8140, true },
+  { 8158, true },
+  { 8184, true },
+  { 8206, true },
+  { 8220, true },
+  { 8235, true },
+  { 8249, true },
+  { 8263, true },
+  { 8278, true },
+  { 8299, true },
+  { 8309, true },
+  { 8320, true },
+  { 8341, true },
+  { 8359, true },
+  { 8372, true },
+  { 8380, true },
+  { 8393, true },
+  { 8407, true },
+  { 8425, true },
+  { 8447, true },
+  { 8462, true },
+  { 8479, true },
+  { 8501, true },
+  { 8516, true },
+  { 8533, true },
+  { 8549, true },
+  { 8565, true },
+  { 8582, true },
+  { 8597, true },
+  { 8616, true },
+  { 8633, true },
+  { 8650, true },
+  { 8662, true },
+  { 8680, true },
+  { 8697, true },
+  { 8712, true },
+  { 8726, true },
+  { 8743, true },
+  { 8761, true },
+  { 8776, true },
+  { 8788, true },
+  { 8801, true },
+  { 8821, true },
+  { 8832, true },
+  { 8843, true },
+  { 8854, true },
+  { 8865, true },
+  { 8876, true },
+  { 8887, true },
+  { 8899, true },
+  { 8912, true },
+  { 8931, true },
+  { 8942, true },
+  { 8955, true },
+  { 8969, false },
+  { 8982, false },
+  { 8991, true },
+  { 9008, true },
+  { 9028, true },
+  { 9039, true },
+  { 9057, true },
+  { 9089, true },
+  { 9116, true },
+  { 9126, true },
+  { 9144, true },
+  { 9159, true },
+  { 9171, true },
+  { 9183, true },
+  { 9203, true },
+  { 9222, true },
+  { 9242, true },
+  { 9265, true },
+  { 9289, true },
+  { 9301, true },
+  { 9312, true },
+  { 9324, true },
+  { 9336, true },
+  { 9352, true },
+  { 9369, true },
+  { 9388, true },
+  { 9402, true },
+  { 9413, true },
+  { 9424, true },
+  { 9437, true },
+  { 9449, false },
+  { 9473, true },
+  { 9489, true },
+  { 9505, true },
+  { 9517, true },
+  { 9533, true },
+  { 9550, true },
+  { 9564, true },
+  { 9575, true },
+  { 9593, true },
+  { 9609, true },
+  { 9623, true },
+  { 9638, true },
+  { 9648, true },
+  { 9665, true },
+  { 9678, true },
   { 9691, true },
-  { 9704, true },
-  { 9717, true },
-  { 9733, true },
-  { 9744, true },
+  { 9707, true },
+  { 9718, true },
+  { 9730, true },
+  { 9741, true },
+  { 9748, true },
   { 9756, true },
-  { 9767, true },
-  { 9774, true },
-  { 9782, true },
-  { 9795, true },
-  { 9805, true },
-  { 9819, false },
-  { 9833, true },
-  { 9849, true },
-  { 9879, true },
-  { 9902, true },
-  { 9915, true },
-  { 9934, true },
-  { 9947, false },
-  { 9966, true },
-  { 9982, false },
-  { 9998, true },
-  { 10014, false },
-  { 10029, false },
-  { 10042, true },
-  { 10058, true },
-  { 10070, true },
-  { 10089, true },
-  { 10104, true },
-  { 10125, true },
-  { 10138, true },
-  { 10151, true },
-  { 10161, true },
-  { 10172, true },
-  { 10183, true },
-  { 10197, true },
-  { 10213, true },
-  { 10230, false },
-  { 10247, true },
-  { 10260, true },
-  { 10286, true },
-  { 10299, true },
-  { 10313, true },
-  { 10332, true },
-  { 10353, true },
-  { 10365, true },
-  { 10379, true },
-  { 10403, true },
-  { 10416, true },
-  { 10429, true },
-  { 10443, true },
-  { 10454, true },
-  { 10463, true },
-  { 10476, true },
-  { 10489, true },
-  { 10501, false },
-  { 10519, true },
-  { 10542, true },
-  { 10569, true },
-  { 10588, true },
-  { 10608, true },
-  { 10619, true },
-  { 10631, true },
-  { 10645, true },
-  { 10653, true },
-  { 10670, true },
-  { 10683, true },
+  { 9769, false },
+  { 9777, true },
+  { 9787, true },
+  { 9801, false },
+  { 9815, true },
+  { 9831, true },
+  { 9861, true },
+  { 9884, true },
+  { 9897, true },
+  { 9916, true },
+  { 9929, false },
+  { 9948, true },
+  { 9964, false },
+  { 9980, true },
+  { 9996, false },
+  { 10011, false },
+  { 10024, true },
+  { 10040, true },
+  { 10052, true },
+  { 10071, true },
+  { 10086, true },
+  { 10107, true },
+  { 10120, true },
+  { 10133, true },
+  { 10143, true },
+  { 10154, true },
+  { 10165, true },
+  { 10179, true },
+  { 10195, true },
+  { 10212, false },
+  { 10229, true },
+  { 10242, true },
+  { 10268, true },
+  { 10281, true },
+  { 10295, true },
+  { 10314, true },
+  { 10335, true },
+  { 10347, true },
+  { 10361, true },
+  { 10385, true },
+  { 10398, true },
+  { 10411, true },
+  { 10425, true },
+  { 10436, true },
+  { 10445, true },
+  { 10458, true },
+  { 10471, true },
+  { 10483, false },
+  { 10501, true },
+  { 10524, true },
+  { 10551, true },
+  { 10570, true },
+  { 10590, true },
+  { 10601, true },
+  { 10613, true },
+  { 10627, true },
+  { 10635, true },
+  { 10652, true },
+  { 10665, true },
+  { 10677, true },
   { 10695, true },
-  { 10713, true },
-  { 10736, false },
+  { 10718, false },
+  { 10734, true },
+  { 10740, true },
   { 10752, true },
-  { 10758, true },
-  { 10770, true },
-  { 10781, true },
-  { 10798, true },
-  { 10817, true },
-  { 10829, true },
-  { 10858, true },
-  { 10874, true },
-  { 10887, true },
-  { 10901, true },
-  { 10917, true },
-  { 10930, true },
-  { 10941, true },
-  { 10950, true },
-  { 10962, true },
-  { 10978, true },
-  { 10992, true },
-  { 11008, true },
-  { 11022, true },
-  { 11036, true },
-  { 11056, true },
-  { 11068, true },
-  { 11084, true },
-  { 11098, false },
-  { 11111, true },
-  { 11126, true },
-  { 11140, true },
-  { 11149, true },
+  { 10763, true },
+  { 10780, true },
+  { 10799, true },
+  { 10811, true },
+  { 10840, true },
+  { 10856, true },
+  { 10869, true },
+  { 10883, true },
+  { 10899, true },
+  { 10912, true },
+  { 10923, true },
+  { 10932, true },
+  { 10944, true },
+  { 10960, true },
+  { 10974, true },
+  { 10990, true },
+  { 11004, true },
+  { 11018, true },
+  { 11038, true },
+  { 11050, true },
+  { 11066, true },
+  { 11080, false },
+  { 11093, true },
+  { 11108, true },
+  { 11122, true },
+  { 11131, true },
+  { 11143, true },
   { 11161, true },
-  { 11179, true },
-  { 11192, true },
-  { 11202, true },
-  { 11216, true },
-  { 11242, true },
-  { 11252, true },
-  { 11266, true },
-  { 11280, true },
-  { 11298, true },
-  { 11316, false },
-  { 11332, true },
-  { 11342, true },
-  { 11353, true },
-  { 11369, true },
-  { 11377, true },
-  { 11385, true },
-  { 11396, true },
-  { 11406, true },
-  { 11421, true },
-  { 11440, true },
-  { 11453, true },
-  { 11468, true },
-  { 11486, false },
+  { 11171, true },
+  { 11185, true },
+  { 11211, true },
+  { 11221, true },
+  { 11235, true },
+  { 11249, true },
+  { 11267, true },
+  { 11285, false },
+  { 11301, true },
+  { 11311, true },
+  { 11322, true },
+  { 11338, true },
+  { 11346, true },
+  { 11354, true },
+  { 11365, true },
+  { 11375, true },
+  { 11390, true },
+  { 11409, true },
+  { 11422, true },
+  { 11437, true },
+  { 11455, false },
+  { 11470, true },
+  { 11490, true },
   { 11501, true },
-  { 11521, true },
-  { 11532, true },
-  { 11544, true },
-  { 11557, true },
-  { 11577, false },
+  { 11513, true },
+  { 11526, true },
+  { 11546, false },
+  { 11560, true },
+  { 11573, true },
   { 11591, true },
-  { 11604, true },
-  { 11622, true },
-  { 11636, true },
-  { 11649, true },
-  { 11661, true },
-  { 11675, true },
-  { 11687, true },
-  { 11698, true },
-  { 11709, true },
-  { 11722, true },
-  { 11737, true },
-  { 11748, true },
-  { 11759, true },
-  { 11774, true },
-  { 11785, true },
-  { 11795, true },
-  { 11804, true },
-  { 11811, true },
-  { 11825, false },
-  { 11838, true },
-  { 11848, true },
-  { 11861, true },
-  { 11874, true },
-  { 11886, true },
-  { 11900, true },
-  { 11910, true },
-  { 11928, true },
-  { 11938, true },
-  { 11950, true },
-  { 11964, true },
-  { 11980, true },
-  { 11991, true },
-  { 12008, true },
-  { 12030, true },
-  { 12056, true },
-  { 12071, true },
+  { 11605, true },
+  { 11618, true },
+  { 11630, true },
+  { 11644, true },
+  { 11656, true },
+  { 11667, true },
+  { 11678, true },
+  { 11691, true },
+  { 11706, true },
+  { 11717, true },
+  { 11728, true },
+  { 11743, true },
+  { 11754, true },
+  { 11764, true },
+  { 11773, true },
+  { 11780, true },
+  { 11794, false },
+  { 11807, true },
+  { 11817, true },
+  { 11830, true },
+  { 11843, true },
+  { 11855, true },
+  { 11869, true },
+  { 11879, true },
+  { 11897, true },
+  { 11907, true },
+  { 11919, true },
+  { 11933, true },
+  { 11949, true },
+  { 11960, true },
+  { 11977, true },
+  { 11999, true },
+  { 12025, true },
+  { 12040, true },
+  { 12058, true },
+  { 12069, true },
+  { 12079, true },
   { 12089, true },
-  { 12100, true },
-  { 12110, true },
-  { 12120, true },
-  { 12139, true },
-  { 12159, true },
+  { 12108, true },
+  { 12128, true },
+  { 12140, true },
+  { 12154, true },
+  { 12161, true },
   { 12171, true },
-  { 12185, true },
-  { 12192, true },
-  { 12202, true },
-  { 12220, true },
-  { 12242, true },
-  { 12254, true },
-  { 12266, true },
-  { 12279, true },
-  { 12288, true },
-  { 12296, true },
-  { 12308, false },
-  { 12328, true },
-  { 12335, true },
+  { 12189, true },
+  { 12211, true },
+  { 12223, true },
+  { 12235, true },
+  { 12248, true },
+  { 12257, true },
+  { 12265, true },
+  { 12277, false },
+  { 12297, true },
+  { 12304, true },
+  { 12320, true },
+  { 12336, true },
   { 12351, true },
-  { 12367, true },
-  { 12382, true },
-  { 12392, true },
-  { 12410, true },
-  { 12437, true },
-  { 12454, true },
-  { 12472, true },
-  { 12480, true },
-  { 12494, true },
-  { 12505, true },
-  { 12514, true },
-  { 12541, true },
-  { 12551, true },
-  { 12567, true },
-  { 12579, true },
-  { 12594, true },
-  { 12606, true },
-  { 12621, true },
-  { 12636, true },
-  { 12648, true },
-  { 12669, true },
-  { 12686, true },
-  { 12700, true },
-  { 12712, true },
-  { 12722, true },
-  { 12732, true },
-  { 12747, true },
-  { 12762, true },
-  { 12775, true },
-  { 12787, true },
-  { 12795, true },
-  { 12808, true },
-  { 12826, true },
-  { 12847, true },
+  { 12361, true },
+  { 12379, true },
+  { 12396, true },
+  { 12414, true },
+  { 12422, true },
+  { 12436, true },
+  { 12447, true },
+  { 12456, true },
+  { 12483, true },
+  { 12493, true },
+  { 12509, true },
+  { 12521, true },
+  { 12536, true },
+  { 12548, true },
+  { 12563, true },
+  { 12578, true },
+  { 12590, true },
+  { 12611, true },
+  { 12628, true },
+  { 12642, true },
+  { 12654, true },
+  { 12664, true },
+  { 12674, true },
+  { 12689, true },
+  { 12704, true },
+  { 12717, true },
+  { 12729, true },
+  { 12737, true },
+  { 12750, true },
+  { 12768, true },
+  { 12789, true },
+  { 12803, true },
+  { 12819, true },
+  { 12829, true },
+  { 12842, true },
   { 12861, true },
-  { 12877, true },
   { 12887, true },
-  { 12900, true },
-  { 12919, true },
-  { 12945, true },
-  { 12957, true },
-  { 12973, true },
-  { 12985, true },
-  { 13004, true },
-  { 13017, true },
-  { 13028, true },
-  { 13039, true },
-  { 13057, true },
-  { 13087, true },
+  { 12899, true },
+  { 12915, true },
+  { 12927, true },
+  { 12946, true },
+  { 12959, true },
+  { 12970, true },
+  { 12981, true },
+  { 12999, true },
+  { 13029, true },
+  { 13052, true },
+  { 13065, false },
+  { 13073, true },
+  { 13085, true },
+  { 13095, true },
   { 13110, true },
-  { 13123, false },
-  { 13131, true },
-  { 13143, true },
-  { 13153, true },
-  { 13168, true },
-  { 13186, true },
-  { 13196, true },
-  { 13217, true },
-  { 13246, true },
-  { 13262, true },
-  { 13278, true },
-  { 13299, true },
-  { 13310, true },
-  { 13322, true },
-  { 13334, true },
-  { 13352, true },
-  { 13373, true },
-  { 13398, true },
-  { 13412, true },
-  { 13425, true },
-  { 13440, true },
-  { 13453, true },
-  { 13466, true },
-  { 13477, true },
-  { 13493, true },
-  { 13503, true },
-  { 13515, true },
-  { 13532, true },
-  { 13544, true },
-  { 13557, true },
-  { 13565, true },
-  { 13576, true },
-  { 13587, true },
-  { 13605, true },
-  { 13620, true },
-  { 13638, true },
-  { 13647, true },
-  { 13658, true },
+  { 13128, true },
+  { 13138, true },
+  { 13159, true },
+  { 13188, true },
+  { 13204, true },
+  { 13220, true },
+  { 13241, true },
+  { 13252, true },
+  { 13264, true },
+  { 13276, true },
+  { 13294, true },
+  { 13315, true },
+  { 13340, true },
+  { 13354, true },
+  { 13367, true },
+  { 13382, true },
+  { 13395, true },
+  { 13408, true },
+  { 13419, true },
+  { 13435, true },
+  { 13445, true },
+  { 13457, true },
+  { 13474, true },
+  { 13486, true },
+  { 13499, true },
+  { 13507, true },
+  { 13518, true },
+  { 13529, true },
+  { 13547, true },
+  { 13562, true },
+  { 13580, true },
+  { 13589, true },
+  { 13600, true },
+  { 13614, true },
+  { 13625, true },
+  { 13633, true },
+  { 13643, true },
+  { 13654, true },
+  { 13662, true },
   { 13672, true },
-  { 13683, true },
-  { 13691, true },
-  { 13701, true },
-  { 13712, true },
-  { 13720, true },
-  { 13730, true },
-  { 13745, true },
-  { 13765, true },
-  { 13773, true },
-  { 13798, true },
-  { 13814, true },
-  { 13821, true },
-  { 13829, true },
-  { 13838, false },
-  { 13847, true },
-  { 13863, true },
-  { 13876, true },
-  { 13885, true },
-  { 13894, true },
-  { 13909, true },
+  { 13687, true },
+  { 13707, true },
+  { 13715, true },
+  { 13740, true },
+  { 13756, true },
+  { 13763, true },
+  { 13771, true },
+  { 13780, false },
+  { 13789, true },
+  { 13805, true },
+  { 13818, true },
+  { 13827, true },
+  { 13836, true },
+  { 13851, true },
+  { 13861, true },
+  { 13873, true },
+  { 13891, false },
+  { 13907, true },
   { 13919, true },
-  { 13931, true },
-  { 13949, false },
-  { 13965, true },
-  { 13977, true },
+  { 13929, true },
+  { 13939, true },
+  { 13949, true },
+  { 13961, true },
+  { 13974, true },
   { 13987, true },
   { 13997, true },
   { 14007, true },
-  { 14019, true },
-  { 14032, true },
-  { 14045, true },
-  { 14055, true },
-  { 14065, true },
-  { 14077, false },
-  { 14089, true },
-  { 14105, true },
-  { 14116, false },
-  { 14126, true },
-  { 14134, true },
-  { 14143, true },
-  { 14157, true },
-  { 14172, false },
-  { 14181, true },
-  { 14195, true },
+  { 14017, true },
+  { 14029, false },
+  { 14041, true },
+  { 14057, true },
+  { 14068, false },
+  { 14078, true },
+  { 14086, true },
+  { 14095, true },
+  { 14109, true },
+  { 14124, false },
+  { 14133, true },
+  { 14147, true },
+  { 14161, true },
+  { 14172, true },
+  { 14185, true },
   { 14209, true },
-  { 14220, true },
-  { 14233, true },
-  { 14257, true },
-  { 14270, true },
+  { 14222, true },
+  { 14234, true },
+  { 14251, true },
+  { 14262, true },
   { 14282, true },
-  { 14299, true },
-  { 14310, true },
-  { 14330, true },
-  { 14348, true },
-  { 14366, true },
-  { 14381, true },
-  { 14402, true },
-  { 14426, true },
-  { 14436, true },
-  { 14446, true },
-  { 14456, true },
-  { 14467, true },
-  { 14492, true },
-  { 14521, true },
-  { 14534, true },
-  { 14546, true },
+  { 14300, true },
+  { 14318, true },
+  { 14333, true },
+  { 14354, true },
+  { 14378, true },
+  { 14388, true },
+  { 14398, true },
+  { 14408, true },
+  { 14419, true },
+  { 14444, true },
+  { 14473, true },
+  { 14486, true },
+  { 14498, true },
+  { 14508, true },
+  { 14516, true },
+  { 14525, true },
+  { 14539, false },
   { 14556, true },
-  { 14564, true },
-  { 14573, true },
-  { 14587, false },
-  { 14604, true },
-  { 14616, true },
-  { 14631, true },
+  { 14568, true },
+  { 14583, true },
+  { 14590, true },
+  { 14603, true },
+  { 14615, true },
+  { 14623, true },
   { 14638, true },
-  { 14651, true },
-  { 14663, true },
-  { 14671, true },
+  { 14647, true },
+  { 14659, true },
+  { 14670, true },
   { 14686, true },
-  { 14695, true },
-  { 14707, true },
-  { 14718, true },
-  { 14734, true },
-  { 14744, true },
-  { 14759, true },
-  { 14776, true },
-  { 14789, true },
-  { 14799, true },
-  { 14812, true },
-  { 14826, true },
-  { 14840, true },
-  { 14852, true },
-  { 14867, true },
-  { 14883, true },
-  { 14898, true },
-  { 14912, true },
-  { 14925, true },
-  { 14941, true },
-  { 14953, true },
-  { 14967, true },
-  { 14979, true },
-  { 14991, true },
-  { 15002, true },
-  { 15013, true },
-  { 15028, true },
-  { 15043, false },
-  { 15059, true },
-  { 15077, true },
-  { 15094, true },
-  { 15112, true },
-  { 15123, true },
-  { 15136, true },
-  { 15153, true },
-  { 15169, true },
-  { 15189, true },
-  { 15204, true },
-  { 15215, true },
-  { 15227, true },
-  { 15240, true },
-  { 15254, true },
-  { 15267, true },
-  { 15285, true },
-  { 15303, true },
-  { 15321, true },
-  { 15338, true },
-  { 15348, true },
-  { 15361, true },
-  { 15370, true },
-  { 15385, true },
-  { 15396,