From 1de6877d89591adb5a25f89d2af4ef2d549dfa84 Mon Sep 17 00:00:00 2001 From: Shih-Chiang Chien Date: Thu, 24 Nov 2016 17:51:23 +0800 Subject: [PATCH 01/53] Bug 1319682 - fix compile warning/error in TaskTracer, r=sinker MozReview-Commit-ID: 4E0ThIAZAxC --HG-- extra : rebase_source : d1cb4ae28e7d10b5bdd3d87d6a97413e2d204057 --- tools/profiler/tasktracer/GeckoTaskTracer.cpp | 20 ++++++++++++++----- tools/profiler/tasktracer/GeckoTaskTracer.h | 4 ++-- .../profiler/tasktracer/GeckoTaskTracerImpl.h | 2 +- tools/profiler/tasktracer/TracedTaskCommon.h | 4 ++-- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/tools/profiler/tasktracer/GeckoTaskTracer.cpp b/tools/profiler/tasktracer/GeckoTaskTracer.cpp index 4ddee7c788c9..2772ad8bc5b1 100644 --- a/tools/profiler/tasktracer/GeckoTaskTracer.cpp +++ b/tools/profiler/tasktracer/GeckoTaskTracer.cpp @@ -16,10 +16,16 @@ #include "nsString.h" #include "nsThreadUtils.h" +#include "platform.h" #include "prtime.h" #include +#ifdef XP_WIN +#include +#define getpid GetCurrentProcessId +#endif + #define MAX_SIZE_LOG (1024 * 128) // NS_ENSURE_TRUE_VOID() without the warning on the debug build. @@ -181,7 +187,11 @@ InitTaskTracer(uint32_t aFlags) MOZ_ASSERT(!sTraceInfos); - sTraceInfoTLS.init(); + bool success = sTraceInfoTLS.init(); + if (!success) { + MOZ_CRASH(); + } + // A memory barrier is necessary here. sTraceInfos = new nsTArray>(); } @@ -225,7 +235,7 @@ GetOrCreateTraceInfo() } if (!info) { - info = AllocTraceInfo(gettid()); + info = AllocTraceInfo(Thread::GetCurrentId()); sTraceInfoTLS.set(info); } @@ -238,7 +248,7 @@ GenNewUniqueTaskId() TraceInfo* info = GetOrCreateTraceInfo(); ENSURE_TRUE(info, 0); - pid_t tid = gettid(); + Thread::tid_t tid = Thread::GetCurrentId(); uint64_t taskid = ((uint64_t)tid << 32) | ++info->mLastUniqueTaskId; return taskid; } @@ -325,7 +335,7 @@ LogBegin(uint64_t aTaskId, uint64_t aSourceEventId) log->mBegin.mTaskId = aTaskId; log->mBegin.mTime = GetTimestamp(); log->mBegin.mPid = getpid(); - log->mBegin.mTid = gettid(); + log->mBegin.mTid = Thread::GetCurrentId(); } } @@ -479,7 +489,7 @@ GetLoggedData(TimeStamp aTimeStamp) return result; } -const PRTime +PRTime GetStartTime() { return sStartTime; diff --git a/tools/profiler/tasktracer/GeckoTaskTracer.h b/tools/profiler/tasktracer/GeckoTaskTracer.h index 1844567fa2bc..074a51731689 100644 --- a/tools/profiler/tasktracer/GeckoTaskTracer.h +++ b/tools/profiler/tasktracer/GeckoTaskTracer.h @@ -57,7 +57,7 @@ public: class AutoSourceEvent : public AutoSaveCurTraceInfo { public: - AutoSourceEvent(SourceEventType aType); + explicit AutoSourceEvent(SourceEventType aType); ~AutoSourceEvent(); }; @@ -73,7 +73,7 @@ void StopLogging(); UniquePtr> GetLoggedData(TimeStamp aStartTime); // Returns the timestamp when Task Tracer is enabled in this process. -const PRTime GetStartTime(); +PRTime GetStartTime(); /** * Internal functions. diff --git a/tools/profiler/tasktracer/GeckoTaskTracerImpl.h b/tools/profiler/tasktracer/GeckoTaskTracerImpl.h index 9d811cb19561..428d020edbd0 100644 --- a/tools/profiler/tasktracer/GeckoTaskTracerImpl.h +++ b/tools/profiler/tasktracer/GeckoTaskTracerImpl.h @@ -66,7 +66,7 @@ struct TraceInfoLogNode { struct TraceInfo { - TraceInfo(uint32_t aThreadId) + explicit TraceInfo(uint32_t aThreadId) : mCurTraceSourceId(0) , mCurTaskId(0) , mCurTraceSourceType(Unknown) diff --git a/tools/profiler/tasktracer/TracedTaskCommon.h b/tools/profiler/tasktracer/TracedTaskCommon.h index 6ddadc72e889..fb9d96a80cdd 100644 --- a/tools/profiler/tasktracer/TracedTaskCommon.h +++ b/tools/profiler/tasktracer/TracedTaskCommon.h @@ -51,7 +51,7 @@ class TracedRunnable : public TracedTaskCommon public: NS_DECL_NSIRUNNABLE - TracedRunnable(already_AddRefed&& aOriginalObj); + explicit TracedRunnable(already_AddRefed&& aOriginalObj); private: virtual ~TracedRunnable(); @@ -95,7 +95,7 @@ public: class AutoRunTask : public AutoSaveCurTraceInfo { VirtualTask* mTask; public: - AutoRunTask(VirtualTask *aTask); + explicit AutoRunTask(VirtualTask *aTask); ~AutoRunTask(); }; }; From 31ce204c2476f1fb9a33643b464226a2e90153ca Mon Sep 17 00:00:00 2001 From: Luca Greco Date: Fri, 11 Nov 2016 18:20:13 +0100 Subject: [PATCH 02/53] Bug 1315251 - Fix excluded 'devtools/server/tests' in .eslintignore. r=ochameau MozReview-Commit-ID: L5V89Frof6K --HG-- extra : rebase_source : 113992624ebbeb4fe0ac15983a1bc37edc1f00fb --- .eslintignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.eslintignore b/.eslintignore index 63a7a069c652..192f0a673894 100644 --- a/.eslintignore +++ b/.eslintignore @@ -119,7 +119,9 @@ devtools/server/actors/** !devtools/server/actors/webbrowser.js !devtools/server/actors/webextension.js devtools/server/performance/** -devtools/server/tests/** +devtools/server/tests/browser/** +devtools/server/tests/mochitest/** +devtools/server/tests/unit/** devtools/shared/*.js !devtools/shared/async-storage.js !devtools/shared/async-utils.js From 34df30a2de115ec058b59a5637ff643a3b297ad6 Mon Sep 17 00:00:00 2001 From: Luca Greco Date: Thu, 17 Nov 2016 19:31:06 +0100 Subject: [PATCH 03/53] Bug 1315251 - Create a DevTools Remote Debugger Actor as a backend for the WebExtension DevTools API. r=ochameau MozReview-Commit-ID: E6eNG8BgBwF --HG-- extra : rebase_source : 84ca2206bfca41b0167f3de00a4874e811d41a47 --- .eslintignore | 2 + devtools/server/actors/moz.build | 1 + .../actors/webextension-inspected-window.js | 469 ++++++++++++++++++ devtools/server/main.js | 5 + devtools/server/tests/browser/browser.ini | 2 + .../browser_webextension_inspected_window.js | 364 ++++++++++++++ .../browser/inspectedwindow-reload-target.sjs | 75 +++ devtools/shared/fronts/moz.build | 1 + .../fronts/webextension-inspected-window.js | 27 + devtools/shared/specs/moz.build | 1 + .../specs/webextension-inspected-window.js | 106 ++++ 11 files changed, 1053 insertions(+) create mode 100644 devtools/server/actors/webextension-inspected-window.js create mode 100644 devtools/server/tests/browser/browser_webextension_inspected_window.js create mode 100644 devtools/server/tests/browser/inspectedwindow-reload-target.sjs create mode 100644 devtools/shared/fronts/webextension-inspected-window.js create mode 100644 devtools/shared/specs/webextension-inspected-window.js diff --git a/.eslintignore b/.eslintignore index 192f0a673894..b2213566789f 100644 --- a/.eslintignore +++ b/.eslintignore @@ -118,8 +118,10 @@ devtools/server/actors/** !devtools/server/actors/styles.js !devtools/server/actors/webbrowser.js !devtools/server/actors/webextension.js +!devtools/server/actors/webextension-inspected-window.js devtools/server/performance/** devtools/server/tests/browser/** +!devtools/server/tests/browser/browser_webextension_inspected_window.js devtools/server/tests/mochitest/** devtools/server/tests/unit/** devtools/shared/*.js diff --git a/devtools/server/actors/moz.build b/devtools/server/actors/moz.build index 5980876e21c6..92ca1bd2a52c 100644 --- a/devtools/server/actors/moz.build +++ b/devtools/server/actors/moz.build @@ -63,6 +63,7 @@ DevToolsModules( 'webaudio.js', 'webbrowser.js', 'webconsole.js', + 'webextension-inspected-window.js', 'webextension.js', 'webgl.js', 'worker.js', diff --git a/devtools/server/actors/webextension-inspected-window.js b/devtools/server/actors/webextension-inspected-window.js new file mode 100644 index 000000000000..bf55cf7856cd --- /dev/null +++ b/devtools/server/actors/webextension-inspected-window.js @@ -0,0 +1,469 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +const protocol = require("devtools/shared/protocol"); + +const {Ci, Cu, Cr} = require("chrome"); + +const Services = require("Services"); + +const { + XPCOMUtils, +} = Cu.import("resource://gre/modules/XPCOMUtils.jsm", {}); + +const { + webExtensionInspectedWindowSpec, +} = require("devtools/shared/specs/webextension-inspected-window"); + +function CustomizedReload(params) { + this.docShell = params.tabActor.window + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDocShell); + this.docShell.QueryInterface(Ci.nsIWebProgress); + + this.inspectedWindowEval = params.inspectedWindowEval; + this.callerInfo = params.callerInfo; + + this.ignoreCache = params.ignoreCache; + this.injectedScript = params.injectedScript; + this.userAgent = params.userAgent; + + this.customizedReloadWindows = new WeakSet(); +} + +CustomizedReload.prototype = { + QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, + Ci.nsISupportsWeakReference, + Ci.nsISupports]), + get window() { + return this.docShell.DOMWindow; + }, + + get webNavigation() { + return this.docShell + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebNavigation); + }, + + start() { + if (!this.waitForReloadCompleted) { + this.waitForReloadCompleted = new Promise((resolve, reject) => { + this.resolveReloadCompleted = resolve; + this.rejectReloadCompleted = reject; + + if (this.userAgent) { + this.docShell.customUserAgent = this.userAgent; + } + + let reloadFlags = Ci.nsIWebNavigation.LOAD_FLAGS_NONE; + + if (this.ignoreCache) { + reloadFlags |= Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_CACHE; + } + + try { + if (this.injectedScript) { + // Listen to the newly created document elements only if there is an + // injectedScript to evaluate. + Services.obs.addObserver(this, "document-element-inserted", false); + } + + // Watch the loading progress and clear the current CustomizedReload once the + // page has been reloaded (or if its reloading has been interrupted). + this.docShell.addProgressListener(this, + Ci.nsIWebProgress.NOTIFY_STATE_DOCUMENT); + + this.webNavigation.reload(reloadFlags); + } catch (err) { + // Cancel the injected script listener if the reload fails + // (which will also report the error by rejecting the promise). + this.stop(err); + } + }); + } + + return this.waitForReloadCompleted; + }, + + observe(subject, topic, data) { + if (topic !== "document-element-inserted") { + return; + } + + const document = subject; + const window = document && document.defaultView; + + // Filter out non interesting documents. + if (!document || !document.location || !window) { + return; + } + + let subjectDocShell = window.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebNavigation) + .QueryInterface(Ci.nsIDocShell); + + // Keep track of the set of window objects where we are going to inject + // the injectedScript: the top level window and all its descendant + // that are still of type content (filtering out loaded XUL pages, if any). + if (window == this.window) { + this.customizedReloadWindows.add(window); + } else if (subjectDocShell.sameTypeParent) { + let parentWindow = subjectDocShell.sameTypeParent + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDOMWindow); + if (parentWindow && this.customizedReloadWindows.has(parentWindow)) { + this.customizedReloadWindows.add(window); + } + } + + if (this.customizedReloadWindows.has(window)) { + const { + apiErrorResult + } = this.inspectedWindowEval(this.callerInfo, this.injectedScript, {}, window); + + // Log only apiErrorResult, because no one is waiting for the + // injectedScript result, and any exception is going to be logged + // in the inspectedWindow webconsole. + if (apiErrorResult) { + console.error( + "Unexpected Error in injectedScript during inspectedWindow.reload for", + `${this.callerInfo.url}:${this.callerInfo.lineNumber}`, + apiErrorResult + ); + } + } + }, + + onStateChange(webProgress, request, state, status) { + if (webProgress.DOMWindow !== this.window) { + return; + } + + if (state & Ci.nsIWebProgressListener.STATE_STOP) { + if (status == Cr.NS_BINDING_ABORTED) { + // The customized reload has been interrupted and we can clear + // the CustomizedReload and reject the promise. + const url = this.window.location.href; + this.stop(new Error( + `devtools.inspectedWindow.reload on ${url} has been interrupted` + )); + } else { + // Once the top level frame has been loaded, we can clear the customized reload + // and resolve the promise. + this.stop(); + } + } + }, + + stop(error) { + if (this.stopped) { + return; + } + + this.docShell.removeProgressListener(this); + + if (this.injectedScript) { + Services.obs.removeObserver(this, "document-element-inserted", false); + } + + // Reset the customized user agent. + if (this.userAgent && this.docShell.customUserAgent == this.userAgent) { + this.docShell.customUserAgent = null; + } + + if (error) { + this.rejectReloadCompleted(error); + } else { + this.resolveReloadCompleted(); + } + + this.stopped = true; + } +}; + +var WebExtensionInspectedWindowActor = protocol.ActorClassWithSpec( + webExtensionInspectedWindowSpec, + { + /** + * Created the WebExtension InspectedWindow actor + */ + initialize(conn, tabActor) { + protocol.Actor.prototype.initialize.call(this, conn); + this.tabActor = tabActor; + }, + + destroy(conn) { + protocol.Actor.prototype.destroy.call(this, conn); + if (this.customizedReload) { + this.customizedReload.stop( + new Error("WebExtensionInspectedWindowActor destroyed") + ); + delete this.customizedReload; + } + + if (this._dbg) { + this._dbg.enabled = false; + delete this._dbg; + } + }, + + isSystemPrincipal(window) { + const principal = window.document.nodePrincipal; + return Services.scriptSecurityManager.isSystemPrincipal(principal); + }, + + get dbg() { + if (this._dbg) { + return this._dbg; + } + + this._dbg = this.tabActor.makeDebugger(); + return this._dbg; + }, + + get window() { + return this.tabActor.window; + }, + + get webNavigation() { + return this.tabActor.webNavigation; + }, + + /** + * Reload the target tab, optionally bypass cache, customize the userAgent and/or + * inject a script in targeted document or any of its sub-frame. + * + * @param {webExtensionCallerInfo} callerInfo + * the addonId and the url (the addon base url or the url of the actual caller + * filename and lineNumber) used to log useful debugging information in the + * produced error logs and eval stack trace. + * + * @param {webExtensionReloadOptions} options + * used to optionally enable the reload customizations. + * @param {boolean|undefined} options.ignoreCache + * enable/disable the cache bypass headers. + * @param {string|undefined} options.userAgent + * customize the userAgent during the page reload. + * @param {string|undefined} options.injectedScript + * evaluate the provided javascript code in the top level and every sub-frame + * created during the page reload, before any other script in the page has been + * executed. + */ + reload(callerInfo, {ignoreCache, userAgent, injectedScript}) { + if (this.isSystemPrincipal(this.window)) { + console.error("Ignored inspectedWindow.reload on system principal target for " + + `${callerInfo.url}:${callerInfo.lineNumber}`); + return {}; + } + + const delayedReload = () => { + // This won't work while the browser is shutting down and we don't really + // care. + if (Services.startup.shuttingDown) { + return; + } + + if (injectedScript || userAgent) { + if (this.customizedReload) { + // TODO(rpl): check what chrome does, and evaluate if queue the new reload + // after the current one has been completed. + console.error( + "Reload already in progress. Ignored inspectedWindow.reload for " + + `${callerInfo.url}:${callerInfo.lineNumber}` + ); + return; + } + + try { + this.customizedReload = new CustomizedReload({ + tabActor: this.tabActor, + inspectedWindowEval: this.eval.bind(this), + callerInfo, injectedScript, userAgent, ignoreCache, + }); + + this.customizedReload.start() + .then(() => { + delete this.customizedReload; + }) + .catch(err => { + delete this.customizedReload; + throw err; + }); + } catch (err) { + // Cancel the customized reload (if any) on exception during the + // reload setup. + if (this.customizedReload) { + this.customizedReload.stop(err); + } + + throw err; + } + } else { + // If there is no custom user agent and/or injected script, then + // we can reload the target without subscribing any observer/listener. + let reloadFlags = Ci.nsIWebNavigation.LOAD_FLAGS_NONE; + if (ignoreCache) { + reloadFlags |= Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_CACHE; + } + this.webNavigation.reload(reloadFlags); + } + }; + + // Execute the reload in a dispatched runnable, so that we can + // return the reply to the caller before the reload is actually + // started. + Services.tm.currentThread.dispatch(delayedReload, 0); + + return {}; + }, + + /** + * Evaluate the provided javascript code in a target window (that is always the + * tabActor window when called through RDP protocol, or the passed customTargetWindow + * when called directly from the CustomizedReload instances). + * + * @param {webExtensionCallerInfo} callerInfo + * the addonId and the url (the addon base url or the url of the actual caller + * filename and lineNumber) used to log useful debugging information in the + * produced error logs and eval stack trace. + * + * @param {string} expression + * the javascript code to be evaluated in the target window + * + * @param {webExtensionEvalOptions} evalOptions + * used to optionally enable the eval customizations. + * NOTE: none of the eval options is currently implemented, they will be already + * reported as unsupported by the WebExtensions schema validation wrappers, but + * an additional level of error reporting is going to be applied here, so that + * if the server and the client have different ideas of which option is supported + * the eval call result will contain detailed informations (in the format usually + * expected for errors not raised in the evaluated javascript code). + * + * @param {DOMWindow|undefined} customTargetWindow + * Used in the CustomizedReload instances to evaluate the `injectedScript` + * javascript code in every sub-frame of the target window during the tab reload. + * NOTE: this parameter is not part of the RDP protocol exposed by this actor, when + * it is called over the remote debugging protocol the target window is always + * `tabActor.window`. + */ + eval(callerInfo, expression, options, customTargetWindow) { + const window = customTargetWindow || this.window; + + if (Object.keys(options).length > 0) { + return { + exceptionInfo: { + isError: true, + code: "E_PROTOCOLERROR", + description: "Inspector protocol error: %s", + details: [ + "The inspectedWindow.eval options are currently not supported", + ], + }, + }; + } + + if (!window) { + return { + exceptionInfo: { + isError: true, + code: "E_PROTOCOLERROR", + description: "Inspector protocol error: %s", + details: [ + "The target window is not defined. inspectedWindow.eval not executed.", + ], + }, + }; + } + + if (this.isSystemPrincipal(window)) { + // On denied JS evaluation, report it using the same data format + // used in the corresponding chrome API method to report issues that are + // not exceptions raised in the evaluated javascript code. + return { + exceptionInfo: { + isError: true, + code: "E_PROTOCOLERROR", + description: "Inspector protocol error: %s", + details: [ + "This target has a system principal. inspectedWindow.eval denied.", + ], + }, + }; + } + + const dbgWindow = this.dbg.makeGlobalObjectReference(window); + + let evalCalledFrom = callerInfo.url; + if (callerInfo.lineNumber) { + evalCalledFrom += `:${callerInfo.lineNumber}`; + } + // TODO(rpl): add $0 and inspect(...) bindings (Bug 1300590) + const result = dbgWindow.executeInGlobalWithBindings(expression, {}, { + url: `debugger eval called from ${evalCalledFrom} - eval code`, + }); + + let evalResult; + + if (result) { + if ("return" in result) { + evalResult = result.return; + } else if ("yield" in result) { + evalResult = result.yield; + } else if ("throw" in result) { + const throwErr = result.throw; + + // XXXworkers: Calling unsafeDereference() returns an object with no + // toString method in workers. See Bug 1215120. + const unsafeDereference = throwErr && (typeof throwErr === "object") && + throwErr.unsafeDereference(); + const message = unsafeDereference && unsafeDereference.toString ? + unsafeDereference.toString() : String(throwErr); + const stack = unsafeDereference && unsafeDereference.stack ? + unsafeDereference.stack : null; + + return { + exceptionInfo: { + isException: true, + value: `${message}\n\t${stack}`, + }, + }; + } + } else { + // TODO(rpl): can the result of executeInGlobalWithBinding be null or + // undefined? (which means that it is not a return, a yield or a throw). + console.error("Unexpected empty inspectedWindow.eval result for", + `${callerInfo.url}:${callerInfo.lineNumber}`); + } + + if (evalResult) { + try { + if (evalResult && typeof evalResult === "object") { + evalResult = evalResult.unsafeDereference(); + } + evalResult = JSON.parse(JSON.stringify(evalResult)); + } catch (err) { + // The evaluation result cannot be sent over the RDP Protocol, + // report it as with the same data format used in the corresponding + // chrome API method. + return { + exceptionInfo: { + isError: true, + code: "E_PROTOCOLERROR", + description: "Inspector protocol error: %s", + details: [ + String(err), + ], + }, + }; + } + } + + return {value: evalResult}; + } + } +); + +exports.WebExtensionInspectedWindowActor = WebExtensionInspectedWindowActor; diff --git a/devtools/server/main.js b/devtools/server/main.js index 45cb7fde66b4..d7a6e4f1c77f 100644 --- a/devtools/server/main.js +++ b/devtools/server/main.js @@ -569,6 +569,11 @@ var DebuggerServer = { constructor: "EmulationActor", type: { tab: true } }); + this.registerModule("devtools/server/actors/webextension-inspected-window", { + prefix: "webExtensionInspectedWindow", + constructor: "WebExtensionInspectedWindowActor", + type: { tab: true } + }); }, /** diff --git a/devtools/server/tests/browser/browser.ini b/devtools/server/tests/browser/browser.ini index b7929e2b0bae..3ca89fe16b6e 100644 --- a/devtools/server/tests/browser/browser.ini +++ b/devtools/server/tests/browser/browser.ini @@ -9,6 +9,7 @@ support-files = doc_force_gc.html doc_innerHTML.html doc_perf.html + inspectedwindow-reload-target.sjs navigate-first.html navigate-second.html storage-cookies-same-name.html @@ -97,3 +98,4 @@ skip-if = e10s # Bug 1183605 - devtools/server/tests/browser/ tests are still di [browser_directorscript_actors.js] skip-if = e10s # Bug 1183605 - devtools/server/tests/browser/ tests are still disabled in E10S [browser_register_actor.js] +[browser_webextension_inspected_window.js] \ No newline at end of file diff --git a/devtools/server/tests/browser/browser_webextension_inspected_window.js b/devtools/server/tests/browser/browser_webextension_inspected_window.js new file mode 100644 index 000000000000..1a21e08fb4fb --- /dev/null +++ b/devtools/server/tests/browser/browser_webextension_inspected_window.js @@ -0,0 +1,364 @@ +/* vim: set ft=javascript ts=2 et sw=2 tw=80: */ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +const { + WebExtensionInspectedWindowFront +} = require("devtools/shared/fronts/webextension-inspected-window"); + +const TEST_RELOAD_URL = `${MAIN_DOMAIN}/inspectedwindow-reload-target.sjs`; + +const FAKE_CALLER_INFO = { + url: "moz-extension://fake-webextension-uuid/fake-caller-script.js", + lineNumber: 1, + addonId: "fake-webextension-uuid", +}; + +function* setup(pageUrl) { + yield addTab(pageUrl); + initDebuggerServer(); + + const client = new DebuggerClient(DebuggerServer.connectPipe()); + const form = yield connectDebuggerClient(client); + + const [, tabClient] = yield client.attachTab(form.actor); + + const [, consoleClient] = yield client.attachConsole(form.consoleActor, []); + + const inspectedWindowFront = new WebExtensionInspectedWindowFront(client, form); + + return { + client, form, + tabClient, consoleClient, + inspectedWindowFront, + }; +} + +function* teardown({client}) { + yield client.close(); + DebuggerServer.destroy(); + gBrowser.removeCurrentTab(); +} + +function waitForNextTabNavigated(client) { + return new Promise(resolve => { + client.addListener("tabNavigated", function tabNavigatedListener(evt, pkt) { + if (pkt.state == "stop" && pkt.isFrameSwitching == false) { + client.removeListener("tabNavigated", tabNavigatedListener); + resolve(); + } + }); + }); +} + +function consoleEvalJS(consoleClient, jsCode) { + return new Promise(resolve => { + consoleClient.evaluateJS(jsCode, resolve); + }); +} + +// Script used as the injectedScript option in the inspectedWindow.reload tests. +function injectedScript() { + if (!window.pageScriptExecutedFirst) { + window.addEventListener("DOMContentLoaded", function listener() { + window.removeEventListener("DOMContentLoaded", listener); + if (document.querySelector("pre")) { + document.querySelector("pre").textContent = "injected script executed first"; + } + }); + } +} + +// Script evaluated in the target tab, to collect the results of injectedScript +// evaluation in the inspectedWindow.reload tests. +function collectEvalResults() { + let results = []; + let iframeDoc = document; + + while (iframeDoc) { + if (iframeDoc.querySelector("pre")) { + results.push(iframeDoc.querySelector("pre").textContent); + } + const iframe = iframeDoc.querySelector("iframe"); + iframeDoc = iframe ? iframe.contentDocument : null; + } + return JSON.stringify(results); +} + +add_task(function* test_successfull_inspectedWindowEval_result() { + const {client, inspectedWindowFront} = yield setup(MAIN_DOMAIN); + const result = yield inspectedWindowFront.eval(FAKE_CALLER_INFO, "window.location", {}); + + ok(result.value, "Got a result from inspectedWindow eval"); + is(result.value.href, MAIN_DOMAIN, + "Got the expected window.location.href property value"); + is(result.value.protocol, "http:", + "Got the expected window.location.protocol property value"); + + yield teardown({client}); +}); + +add_task(function* test_error_inspectedWindowEval_result() { + const {client, inspectedWindowFront} = yield setup(MAIN_DOMAIN); + const result = yield inspectedWindowFront.eval(FAKE_CALLER_INFO, "window", {}); + + ok(!result.value, "Got a null result from inspectedWindow eval"); + ok(result.exceptionInfo.isError, "Got an API Error result from inspectedWindow eval"); + ok(!result.exceptionInfo.isException, "An error isException is false as expected"); + is(result.exceptionInfo.code, "E_PROTOCOLERROR", + "Got the expected 'code' property in the error result"); + is(result.exceptionInfo.description, "Inspector protocol error: %s", + "Got the expected 'description' property in the error result"); + is(result.exceptionInfo.details.length, 1, + "The 'details' array property should contains 1 element"); + ok(result.exceptionInfo.details[0].includes("cyclic object value"), + "Got the expected content in the error results's details"); + + yield teardown({client}); +}); + +add_task(function* test_system_principal_denied_error_inspectedWindowEval_result() { + const {client, inspectedWindowFront} = yield setup("about:addons"); + const result = yield inspectedWindowFront.eval(FAKE_CALLER_INFO, "window", {}); + + ok(!result.value, "Got a null result from inspectedWindow eval"); + ok(result.exceptionInfo.isError, + "Got an API Error result from inspectedWindow eval on a system principal page"); + is(result.exceptionInfo.code, "E_PROTOCOLERROR", + "Got the expected 'code' property in the error result"); + is(result.exceptionInfo.description, "Inspector protocol error: %s", + "Got the expected 'description' property in the error result"); + is(result.exceptionInfo.details.length, 1, + "The 'details' array property should contains 1 element"); + is(result.exceptionInfo.details[0], + "This target has a system principal. inspectedWindow.eval denied.", + "Got the expected content in the error results's details"); + + yield teardown({client}); +}); + +add_task(function* test_exception_inspectedWindowEval_result() { + const {client, inspectedWindowFront} = yield setup(MAIN_DOMAIN); + const result = yield inspectedWindowFront.eval( + FAKE_CALLER_INFO, "throw Error('fake eval error');", {}); + + ok(result.exceptionInfo.isException, "Got an exception as expected"); + ok(!result.value, "Got an undefined eval value"); + ok(!result.exceptionInfo.isError, "An exception should not be isError=true"); + ok(result.exceptionInfo.value.includes("Error: fake eval error"), + "Got the expected exception message"); + + const expectedCallerInfo = + `called from ${FAKE_CALLER_INFO.url}:${FAKE_CALLER_INFO.lineNumber}`; + ok(result.exceptionInfo.value.includes(expectedCallerInfo), + "Got the expected caller info in the exception message"); + + const expectedStack = `eval code:1:7`; + ok(result.exceptionInfo.value.includes(expectedStack), + "Got the expected stack trace in the exception message"); + + yield teardown({client}); +}); + +add_task(function* test_exception_inspectedWindowReload() { + const { + client, consoleClient, inspectedWindowFront, + } = yield setup(`${TEST_RELOAD_URL}?test=cache`); + + // Test reload with bypassCache=false. + + const waitForNoBypassCacheReload = waitForNextTabNavigated(client); + const reloadResult = yield inspectedWindowFront.reload(FAKE_CALLER_INFO, + {ignoreCache: false}); + + ok(!reloadResult, "Got the expected undefined result from inspectedWindow reload"); + + yield waitForNoBypassCacheReload; + + const noBypassCacheEval = yield consoleEvalJS(consoleClient, + "document.body.textContent"); + + is(noBypassCacheEval.result, "empty cache headers", + "Got the expected result with reload forceBypassCache=false"); + + // Test reload with bypassCache=true. + + const waitForForceBypassCacheReload = waitForNextTabNavigated(client); + yield inspectedWindowFront.reload(FAKE_CALLER_INFO, {ignoreCache: true}); + + yield waitForForceBypassCacheReload; + + const forceBypassCacheEval = yield consoleEvalJS(consoleClient, + "document.body.textContent"); + + is(forceBypassCacheEval.result, "no-cache:no-cache", + "Got the expected result with reload forceBypassCache=true"); + + yield teardown({client}); +}); + +add_task(function* test_exception_inspectedWindowReload_customUserAgent() { + const { + client, consoleClient, inspectedWindowFront, + } = yield setup(`${TEST_RELOAD_URL}?test=user-agent`); + + // Test reload with custom userAgent. + + const waitForCustomUserAgentReload = waitForNextTabNavigated(client); + yield inspectedWindowFront.reload(FAKE_CALLER_INFO, + {userAgent: "Customized User Agent"}); + + yield waitForCustomUserAgentReload; + + const customUserAgentEval = yield consoleEvalJS(consoleClient, + "document.body.textContent"); + + is(customUserAgentEval.result, "Customized User Agent", + "Got the expected result on reload with a customized userAgent"); + + // Test reload with no custom userAgent. + + const waitForNoCustomUserAgentReload = waitForNextTabNavigated(client); + yield inspectedWindowFront.reload(FAKE_CALLER_INFO, {}); + + yield waitForNoCustomUserAgentReload; + + const noCustomUserAgentEval = yield consoleEvalJS(consoleClient, + "document.body.textContent"); + + is(noCustomUserAgentEval.result, window.navigator.userAgent, + "Got the expected result with reload without a customized userAgent"); + + yield teardown({client}); +}); + +add_task(function* test_exception_inspectedWindowReload_injectedScript() { + const { + client, consoleClient, inspectedWindowFront, + } = yield setup(`${TEST_RELOAD_URL}?test=injected-script&frames=3`); + + // Test reload with an injectedScript. + + const waitForInjectedScriptReload = waitForNextTabNavigated(client); + yield inspectedWindowFront.reload(FAKE_CALLER_INFO, + {injectedScript: `new ${injectedScript}`}); + yield waitForInjectedScriptReload; + + const injectedScriptEval = yield consoleEvalJS(consoleClient, + `(${collectEvalResults})()`); + + const expectedResult = (new Array(4)).fill("injected script executed first"); + + SimpleTest.isDeeply(JSON.parse(injectedScriptEval.result), expectedResult, + "Got the expected result on reload with an injected script"); + + // Test reload without an injectedScript. + + const waitForNoInjectedScriptReload = waitForNextTabNavigated(client); + yield inspectedWindowFront.reload(FAKE_CALLER_INFO, {}); + yield waitForNoInjectedScriptReload; + + const noInjectedScriptEval = yield consoleEvalJS(consoleClient, + `(${collectEvalResults})()`); + + const newExpectedResult = (new Array(4)).fill("injected script NOT executed"); + + SimpleTest.isDeeply(JSON.parse(noInjectedScriptEval.result), newExpectedResult, + "Got the expected result on reload with no injected script"); + + yield teardown({client}); +}); + +add_task(function* test_exception_inspectedWindowReload_multiple_calls() { + const { + client, consoleClient, inspectedWindowFront, + } = yield setup(`${TEST_RELOAD_URL}?test=user-agent`); + + // Test reload with custom userAgent three times (and then + // check that only the first one has affected the page reload. + + const waitForCustomUserAgentReload = waitForNextTabNavigated(client); + + inspectedWindowFront.reload(FAKE_CALLER_INFO, {userAgent: "Customized User Agent 1"}); + inspectedWindowFront.reload(FAKE_CALLER_INFO, {userAgent: "Customized User Agent 2"}); + + yield waitForCustomUserAgentReload; + + const customUserAgentEval = yield consoleEvalJS(consoleClient, + "document.body.textContent"); + + is(customUserAgentEval.result, "Customized User Agent 1", + "Got the expected result on reload with a customized userAgent"); + + // Test reload with no custom userAgent. + + const waitForNoCustomUserAgentReload = waitForNextTabNavigated(client); + yield inspectedWindowFront.reload(FAKE_CALLER_INFO, {}); + + yield waitForNoCustomUserAgentReload; + + const noCustomUserAgentEval = yield consoleEvalJS(consoleClient, + "document.body.textContent"); + + is(noCustomUserAgentEval.result, window.navigator.userAgent, + "Got the expected result with reload without a customized userAgent"); + + yield teardown({client}); +}); + +add_task(function* test_exception_inspectedWindowReload_stopped() { + const { + client, consoleClient, inspectedWindowFront, + } = yield setup(`${TEST_RELOAD_URL}?test=injected-script&frames=3`); + + // Test reload on a page that calls window.stop() immediately during the page loading + + const waitForPageLoad = waitForNextTabNavigated(client); + yield inspectedWindowFront.eval(FAKE_CALLER_INFO, + "window.location += '&stop=windowStop'"); + + info("Load a webpage that calls 'window.stop()' while is still loading"); + yield waitForPageLoad; + + info("Starting a reload with an injectedScript"); + const waitForInjectedScriptReload = waitForNextTabNavigated(client); + yield inspectedWindowFront.reload(FAKE_CALLER_INFO, + {injectedScript: `new ${injectedScript}`}); + yield waitForInjectedScriptReload; + + const injectedScriptEval = yield consoleEvalJS(consoleClient, + `(${collectEvalResults})()`); + + // The page should have stopped during the reload and only one injected script + // is expected. + const expectedResult = (new Array(1)).fill("injected script executed first"); + + SimpleTest.isDeeply(JSON.parse(injectedScriptEval.result), expectedResult, + "The injected script has been executed on the 'stopped' page reload"); + + // Reload again with no options. + + info("Reload the tab again without any reload options"); + const waitForNoInjectedScriptReload = waitForNextTabNavigated(client); + yield inspectedWindowFront.reload(FAKE_CALLER_INFO, {}); + yield waitForNoInjectedScriptReload; + + const noInjectedScriptEval = yield consoleEvalJS(consoleClient, + `(${collectEvalResults})()`); + + // The page should have stopped during the reload and no injected script should + // have been executed during this second reload (or it would mean that the previous + // customized reload was still pending and has wrongly affected the second reload) + const newExpectedResult = (new Array(1)).fill("injected script NOT executed"); + + SimpleTest.isDeeply( + JSON.parse(noInjectedScriptEval.result), newExpectedResult, + "No injectedScript should have been evaluated during the second reload" + ); + + yield teardown({client}); +}); + +// TODO: check eval with $0 binding once implemented (Bug 1300590) diff --git a/devtools/server/tests/browser/inspectedwindow-reload-target.sjs b/devtools/server/tests/browser/inspectedwindow-reload-target.sjs new file mode 100644 index 000000000000..9af6c4ce7304 --- /dev/null +++ b/devtools/server/tests/browser/inspectedwindow-reload-target.sjs @@ -0,0 +1,75 @@ +Components.utils.importGlobalProperties(["URLSearchParams"]); + +function handleRequest(request, response) { + let params = new URLSearchParams(request.queryString); + + switch(params.get("test")) { + case "cache": + handleCacheTestRequest(request, response); + break; + + case "user-agent": + handleUserAgentTestRequest(request, response); + break; + + case "injected-script": + handleInjectedScriptTestRequest(request, response, params); + break; + } +} + +function handleCacheTestRequest(request, response) { + response.setHeader("Content-Type", "text/plain; charset=UTF-8", false); + + if (request.hasHeader("pragma") && request.hasHeader("cache-control")) { + response.write(`${request.getHeader("pragma")}:${request.getHeader("cache-control")}`); + } else { + response.write("empty cache headers"); + } +} + +function handleUserAgentTestRequest(request, response) { + response.setHeader("Content-Type", "text/plain; charset=UTF-8", false); + + if (request.hasHeader("user-agent")) { + response.write(request.getHeader("user-agent")); + } else { + response.write("no user agent header"); + } +} + +function handleInjectedScriptTestRequest(request, response, params) { + response.setHeader("Content-Type", "text/html; charset=UTF-8", false); + + const frames = parseInt(params.get("frames")); + let content = ""; + + if (frames > 0) { + // Output an iframe in seamless mode, so that there is an higher chance that in case + // of test failures we get a screenshot where the nested iframes are all visible. + content = ``; + } + + if (params.get("stop") == "windowStop") { + content = "" + content; + } + + response.write(` + + + + + + +

IFRAME ${frames}

+
injected script NOT executed
+ + ${content} + + + `); +} \ No newline at end of file diff --git a/devtools/shared/fronts/moz.build b/devtools/shared/fronts/moz.build index 8a38d6b5d3aa..9f6a826552e8 100644 --- a/devtools/shared/fronts/moz.build +++ b/devtools/shared/fronts/moz.build @@ -37,5 +37,6 @@ DevToolsModules( 'stylesheets.js', 'timeline.js', 'webaudio.js', + 'webextension-inspected-window.js', 'webgl.js' ) diff --git a/devtools/shared/fronts/webextension-inspected-window.js b/devtools/shared/fronts/webextension-inspected-window.js new file mode 100644 index 000000000000..1bd418a24b22 --- /dev/null +++ b/devtools/shared/fronts/webextension-inspected-window.js @@ -0,0 +1,27 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +"use strict"; + +const { + webExtensionInspectedWindowSpec, +} = require("devtools/shared/specs/webextension-inspected-window"); + +const protocol = require("devtools/shared/protocol"); + +/** + * The corresponding Front object for the WebExtensionInspectedWindowActor. + */ +const WebExtensionInspectedWindowFront = protocol.FrontClassWithSpec( + webExtensionInspectedWindowSpec, + { + initialize: function (client, { webExtensionInspectedWindowActor }) { + protocol.Front.prototype.initialize.call(this, client, { + actor: webExtensionInspectedWindowActor + }); + this.manage(this); + } + } +); + +exports.WebExtensionInspectedWindowFront = WebExtensionInspectedWindowFront; diff --git a/devtools/shared/specs/moz.build b/devtools/shared/specs/moz.build index 52a8106373ee..f313690d6ac1 100644 --- a/devtools/shared/specs/moz.build +++ b/devtools/shared/specs/moz.build @@ -45,6 +45,7 @@ DevToolsModules( 'stylesheets.js', 'timeline.js', 'webaudio.js', + 'webextension-inspected-window.js', 'webgl.js', 'worker.js' ) diff --git a/devtools/shared/specs/webextension-inspected-window.js b/devtools/shared/specs/webextension-inspected-window.js new file mode 100644 index 000000000000..b43821374a85 --- /dev/null +++ b/devtools/shared/specs/webextension-inspected-window.js @@ -0,0 +1,106 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +const { + Arg, + RetVal, + generateActorSpec, + types, +} = require("devtools/shared/protocol"); + +/** + * Sent with the eval and reload requests, used to inform the + * webExtensionInspectedWindowActor about the caller information + * to be able to evaluate code as being executed from the caller + * WebExtension sources, or log errors with information that can + * help the addon developer to more easily identify the affected + * lines in his own addon code. + */ +types.addDictType("webExtensionCallerInfo", { + // Information related to the line of code that has originated + // the request. + url: "string", + lineNumber: "nullable:number", + + // The called addonId. + addonId: "string", +}); + +/** + * RDP type related to the inspectedWindow.eval method request. + */ +types.addDictType("webExtensionEvalOptions", { + frameURL: "nullable:string", + contextSecurityOrigin: "nullable:string", + useContentScriptContext: "nullable:boolean", +}); + +/** + * RDP type related to the inspectedWindow.eval method result errors. + * + * This type has been modelled on the same data format + * used in the corresponding chrome API method. + */ +types.addDictType("webExtensionEvalExceptionInfo", { + // The following properties are set if the error has not occurred + // in the evaluated JS code. + isError: "nullable:boolean", + code: "nullable:string", + description: "nullable:string", + details: "nullable:array:json", + + // The following properties are set if the error has occurred + // in the evaluated JS code. + isException: "nullable:string", + value: "nullable:string", +}); + +/** + * RDP type related to the inspectedWindow.eval method result. + */ +types.addDictType("webExtensionEvalResult", { + // The following properties are set if the evaluation has been + // completed successfully. + value: "nullable:json", + // The following properties are set if the evalutation has been + // completed with errors. + exceptionInfo: "nullable:webExtensionEvalExceptionInfo", +}); + +/** + * RDP type related to the inspectedWindow.reload method request. + */ +types.addDictType("webExtensionReloadOptions", { + ignoreCache: "nullable:boolean", + userAgent: "nullable:string", + injectedScript: "nullable:string", +}); + +const webExtensionInspectedWindowSpec = generateActorSpec({ + typeName: "webExtensionInspectedWindow", + + methods: { + reload: { + request: { + webExtensionCallerInfo: Arg(0, "webExtensionCallerInfo"), + options: Arg(1, "webExtensionReloadOptions"), + }, + }, + eval: { + request: { + webExtensionCallerInfo: Arg(0, "webExtensionCallerInfo"), + expression: Arg(1, "string"), + options: Arg(2, "webExtensionEvalOptions"), + }, + + response: { + evalResult: RetVal("webExtensionEvalResult"), + }, + }, + }, +}); + +exports.webExtensionInspectedWindowSpec = webExtensionInspectedWindowSpec; From bb51dce698d1db595c6770e033a7464c3b2b9363 Mon Sep 17 00:00:00 2001 From: Thomas Nguyen Date: Thu, 24 Nov 2016 11:13:54 +0800 Subject: [PATCH 04/53] Bug 1315893 - Add telemetry to measure update time for V2 and V4. r=francois MozReview-Commit-ID: KtrVJXHXMo --HG-- extra : rebase_source : 6aa4d0fd01afd24e9e45f55a5d45da255962ca92 --- toolkit/components/telemetry/Histograms.json | 10 ++++++---- .../telemetry/histogram-whitelists.json | 1 - toolkit/components/url-classifier/Classifier.cpp | 14 +++++++++++++- .../url-classifier/nsIUrlClassifierUtils.idl | 12 ++++++++++++ .../url-classifier/nsUrlClassifierUtils.cpp | 16 ++++++++++++++++ 5 files changed, 47 insertions(+), 6 deletions(-) diff --git a/toolkit/components/telemetry/Histograms.json b/toolkit/components/telemetry/Histograms.json index b5d039bb596c..c48a6994e2ed 100644 --- a/toolkit/components/telemetry/Histograms.json +++ b/toolkit/components/telemetry/Histograms.json @@ -4059,14 +4059,16 @@ "n_buckets": 10, "description": "Time spent per classifier lookup (ms)" }, - "URLCLASSIFIER_CL_UPDATE_TIME": { + "URLCLASSIFIER_CL_KEYED_UPDATE_TIME": { "alert_emails": ["safebrowsing-telemetry@mozilla.org"], "expires_in_version": "never", + "keyed": true, "kind": "exponential", "low": 20, - "high": 15000, - "n_buckets": 15, - "description": "Time spent per classifier update (ms)" + "high": 120000, + "n_buckets": 30, + "bug_numbers": [1315893], + "description": "Time spent per classifier update (ms), keyed by the name of the provider." }, "URLCLASSIFIER_PS_FILELOAD_TIME": { "alert_emails": ["safebrowsing-telemetry@mozilla.org"], diff --git a/toolkit/components/telemetry/histogram-whitelists.json b/toolkit/components/telemetry/histogram-whitelists.json index a1e0f450b0ec..e8c85b5680f7 100644 --- a/toolkit/components/telemetry/histogram-whitelists.json +++ b/toolkit/components/telemetry/histogram-whitelists.json @@ -1670,7 +1670,6 @@ "UPDATE_UNABLE_TO_APPLY_NOTIFY", "UPDATE_WIZ_LAST_PAGE_CODE", "URLCLASSIFIER_CL_CHECK_TIME", - "URLCLASSIFIER_CL_UPDATE_TIME", "URLCLASSIFIER_LC_COMPLETIONS", "URLCLASSIFIER_LC_PREFIXES", "URLCLASSIFIER_LOOKUP_TIME", diff --git a/toolkit/components/url-classifier/Classifier.cpp b/toolkit/components/url-classifier/Classifier.cpp index 257ea0564195..06d4df126b00 100644 --- a/toolkit/components/url-classifier/Classifier.cpp +++ b/toolkit/components/url-classifier/Classifier.cpp @@ -503,7 +503,19 @@ Classifier::Check(const nsACString& aSpec, nsresult Classifier::ApplyUpdates(nsTArray* aUpdates) { - Telemetry::AutoTimer timer; + if (!aUpdates || aUpdates->Length() == 0) { + return NS_OK; + } + + nsCOMPtr urlUtil = + do_GetService(NS_URLCLASSIFIERUTILS_CONTRACTID); + + nsCString provider; + // Assume all TableUpdate objects should have the same provider. + urlUtil->GetTelemetryProvider((*aUpdates)[0]->TableName(), provider); + + Telemetry::AutoTimer + keyedTimer(provider); PRIntervalTime clockStart = 0; if (LOG_ENABLED()) { diff --git a/toolkit/components/url-classifier/nsIUrlClassifierUtils.idl b/toolkit/components/url-classifier/nsIUrlClassifierUtils.idl index fa872ec27f1f..fbf5541b4c5f 100644 --- a/toolkit/components/url-classifier/nsIUrlClassifierUtils.idl +++ b/toolkit/components/url-classifier/nsIUrlClassifierUtils.idl @@ -31,6 +31,18 @@ interface nsIUrlClassifierUtils : nsISupports */ ACString getProvider(in ACString tableName); + /** + * Get the provider used for Telemetry. + * Because recording Telemetry will leak user-controlled strings, + * only built-in providers should be recorded. + * + * @param tableName The table name that we want to lookup + * + * @returns the filtered provider for telemetry. + * + */ + ACString getTelemetryProvider(in ACString tableName); + /** * Get the protocol version for the given provider. * diff --git a/toolkit/components/url-classifier/nsUrlClassifierUtils.cpp b/toolkit/components/url-classifier/nsUrlClassifierUtils.cpp index e4cf68c98204..642f5c66f770 100644 --- a/toolkit/components/url-classifier/nsUrlClassifierUtils.cpp +++ b/toolkit/components/url-classifier/nsUrlClassifierUtils.cpp @@ -287,6 +287,22 @@ nsUrlClassifierUtils::GetProvider(const nsACString& aTableName, return NS_OK; } +NS_IMETHODIMP +nsUrlClassifierUtils::GetTelemetryProvider(const nsACString& aTableName, + nsACString& aProvider) +{ + GetProvider(aTableName, aProvider); + // Filter out build-in providers: mozilla, google, google4 + // Empty provider is filtered as "other" + if (!NS_LITERAL_CSTRING("mozilla").Equals(aProvider) && + !NS_LITERAL_CSTRING("google").Equals(aProvider) && + !NS_LITERAL_CSTRING("google4").Equals(aProvider)) { + aProvider.Assign(NS_LITERAL_CSTRING("other")); + } + + return NS_OK; +} + NS_IMETHODIMP nsUrlClassifierUtils::GetProtocolVersion(const nsACString& aProvider, nsACString& aVersion) From 786ed1db981ec116c1bbf3b24bf3fb254f242f8f Mon Sep 17 00:00:00 2001 From: Kaku Kuo Date: Wed, 23 Nov 2016 19:04:56 +0800 Subject: [PATCH 05/53] Bug 1319725 - disable the test_reactivate.html; r=jwwang The test case itself does not really do what it claims. Disable it now (for landing bug 1244768) and will rework it later. MozReview-Commit-ID: H2sCX58eypr --HG-- extra : rebase_source : 0a5165df23cd79e4a3605fa2c2dbfb27055468cf --- dom/media/test/mochitest.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/dom/media/test/mochitest.ini b/dom/media/test/mochitest.ini index c5809e545279..751f67e7743e 100644 --- a/dom/media/test/mochitest.ini +++ b/dom/media/test/mochitest.ini @@ -812,6 +812,7 @@ skip-if = appname == "seamonkey" [test_preserve_playbackrate_after_ui_play.html] [test_progress.html] [test_reactivate.html] +skip-if = true # see bug 1319725 [test_readyState.html] [test_referer.html] [test_replay_metadata.html] From 1eb25ad96f056df19f731d41a3f4f4d41be56bcc Mon Sep 17 00:00:00 2001 From: Ted Mielczarek Date: Tue, 22 Nov 2016 09:45:37 -0500 Subject: [PATCH 06/53] bug 1319405 - fix --with-system-nss build. r=mshal MozReview-Commit-ID: EoZWWVnofYG --HG-- extra : rebase_source : adcd21e84342db9786caaf73da23ad4b1f3a4c4e --- security/manager/ssl/moz.build | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/security/manager/ssl/moz.build b/security/manager/ssl/moz.build index 19e1b4f4b141..eee56962aee3 100644 --- a/security/manager/ssl/moz.build +++ b/security/manager/ssl/moz.build @@ -184,9 +184,10 @@ for var in ('DLL_PREFIX', 'DLL_SUFFIX'): DEFINES['CERT_AddTempCertToPerm'] = '__CERT_AddTempCertToPerm' -USE_LIBS += [ - 'crmf', -] +if not CONFIG['MOZ_SYSTEM_NSS']: + USE_LIBS += [ + 'crmf', + ] include('/ipc/chromium/chromium-config.mozbuild') From b99cd7fcf509d07f662285191bd7563aea89236f Mon Sep 17 00:00:00 2001 From: Gijs Kruitbosch Date: Wed, 16 Nov 2016 18:25:50 +0000 Subject: [PATCH 07/53] Bug 1229426 - avoid dnd of js URIs, r=mak MozReview-Commit-ID: 70ApmoEYn5Z --HG-- extra : rebase_source : d1568a3c7c35dd11b191a04c1f9cac7b14ce5298 --- browser/base/content/browser.js | 2 +- browser/base/content/urlbarBindings.xml | 53 +++++++++++++++---------- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index 7bff3fc9547a..5b789cc6eabc 100755 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -5644,7 +5644,7 @@ function middleMousePaste(event) { function stripUnsafeProtocolOnPaste(pasteData) { // Don't allow pasting javascript URIs since we don't support // LOAD_FLAGS_DISALLOW_INHERIT_PRINCIPAL for those. - return pasteData.replace(/^(?:\s*javascript:)+/i, ""); + return pasteData.replace(/\r?\n/g, "").replace(/^(?:\s*javascript:)+/i, ""); } // handleDroppedLink has the following 2 overloads: diff --git a/browser/base/content/urlbarBindings.xml b/browser/base/content/urlbarBindings.xml index d14123fb3f19..d1120d227f3f 100644 --- a/browser/base/content/urlbarBindings.xml +++ b/browser/base/content/urlbarBindings.xml @@ -701,38 +701,51 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. ]]> - - - - var types = aEvent.dataTransfer.types; - if (types.includes("application/x-moz-file") || - types.includes("text/x-moz-url") || - types.includes("text/uri-list") || - types.includes("text/unicode")) - aEvent.preventDefault(); - - - - + 0 && links[0].url) { - let url = links[0].url; aEvent.preventDefault(); - this.value = url; - SetPageProxyState("invalid"); - this.focus(); + let url = links[0].url; + let strippedURL = stripUnsafeProtocolOnPaste(url); + if (strippedURL != url) { + aEvent.stopImmediatePropagation(); + return null; + } try { urlSecurityCheck(url, gBrowser.contentPrincipal, Ci.nsIScriptSecurityManager.DISALLOW_INHERIT_PRINCIPAL); } catch (ex) { - return; + return null; } + return url; + } + return null; + ]]> + + + + + + + + + + @@ -924,7 +937,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. // Unfortunately we're not allowed to set the bits being pasted // so cancel this event: aEvent.preventDefault(); - aEvent.stopPropagation(); + aEvent.stopImmediatePropagation(); this.inputField.value = oldStart + pasteData + oldEnd; // Fix up cursor/selection: From 25802c7daf56773fc67f03b61e267dd6e2505a33 Mon Sep 17 00:00:00 2001 From: Axel Hecht Date: Thu, 24 Nov 2016 14:30:31 +0100 Subject: [PATCH 08/53] bug 1315976, update compare-locales to 1.2.1, r=flod MozReview-Commit-ID: 6sZtRiw0mQs --HG-- extra : rebase_source : 9fe3ef84568e1356f60cd179cf234d5fdcf307df --- .../compare_locales/__init__.py | 2 +- .../compare_locales/commands.py | 147 ++--- .../compare_locales/compare.py | 44 +- .../compare-locales/compare_locales/parser.py | 591 ++++++++++-------- .../compare_locales/tests/__init__.py | 19 +- .../compare_locales/tests/test_checks.py | 12 +- .../compare_locales/tests/test_defines.py | 95 +++ .../compare_locales/tests/test_dtd.py | 69 +- .../compare_locales/tests/test_ini.py | 78 ++- .../compare_locales/tests/test_merge.py | 12 +- .../compare_locales/tests/test_parser.py | 44 ++ .../compare_locales/tests/test_properties.py | 63 +- .../compare_locales/webapps.py | 2 +- 13 files changed, 746 insertions(+), 432 deletions(-) create mode 100644 python/compare-locales/compare_locales/tests/test_defines.py create mode 100644 python/compare-locales/compare_locales/tests/test_parser.py diff --git a/python/compare-locales/compare_locales/__init__.py b/python/compare-locales/compare_locales/__init__.py index bad265e4fe3f..eb1d9a0ff04d 100644 --- a/python/compare-locales/compare_locales/__init__.py +++ b/python/compare-locales/compare_locales/__init__.py @@ -1 +1 @@ -version = "1.1" +version = "1.2.1" diff --git a/python/compare-locales/compare_locales/commands.py b/python/compare-locales/compare_locales/commands.py index 61b58ec4b2ec..4b8d5b0e3537 100644 --- a/python/compare-locales/compare_locales/commands.py +++ b/python/compare-locales/compare_locales/commands.py @@ -5,8 +5,9 @@ 'Commands exposed to commandlines' import logging -from optparse import OptionParser, make_option +from argparse import ArgumentParser +from compare_locales import version from compare_locales.paths import EnumerateApp from compare_locales.compare import compareApp, compareDirs from compare_locales.webapps import compare_web_app @@ -17,37 +18,35 @@ class BaseCommand(object): This handles command line parsing, and general sugar for setuptools entry_points. """ - options = [ - make_option('-v', '--verbose', action='count', dest='v', default=0, - help='Make more noise'), - make_option('-q', '--quiet', action='count', dest='q', default=0, - help='Make less noise'), - make_option('-m', '--merge', - help='''Use this directory to stage merged files, -use {ab_CD} to specify a different directory for each locale'''), - ] - data_option = make_option('--data', choices=['text', 'exhibit', 'json'], - default='text', - help='''Choose data and format (one of text, -exhibit, json); text: (default) Show which files miss which strings, together -with warnings and errors. Also prints a summary; json: Serialize the internal -tree, useful for tools. Also always succeeds; exhibit: Serialize the summary -data in a json useful for Exhibit -''') def __init__(self): self.parser = None def get_parser(self): - """Get an OptionParser, with class docstring as usage, and - self.options. + """Get an ArgumentParser, with class docstring as description. """ - parser = OptionParser() - parser.set_usage(self.__doc__) - for option in self.options: - parser.add_option(option) + parser = ArgumentParser(description=self.__doc__) + parser.add_argument('--version', action='version', + version='%(prog)s ' + version) + parser.add_argument('-v', '--verbose', action='count', dest='v', + default=0, help='Make more noise') + parser.add_argument('-q', '--quiet', action='count', dest='q', + default=0, help='Make less noise') + parser.add_argument('-m', '--merge', + help='''Use this directory to stage merged files, +use {ab_CD} to specify a different directory for each locale''') return parser + def add_data_argument(self, parser): + parser.add_argument('--data', choices=['text', 'exhibit', 'json'], + default='text', + help='''Choose data and format (one of text, +exhibit, json); text: (default) Show which files miss which strings, together +with warnings and errors. Also prints a summary; json: Serialize the internal +tree, useful for tools. Also always succeeds; exhibit: Serialize the summary +data in a json useful for Exhibit +''') + @classmethod def call(cls): """Entry_point for setuptools. @@ -60,15 +59,15 @@ data in a json useful for Exhibit def handle_(self): """The instance part of the classmethod call.""" self.parser = self.get_parser() - (options, args) = self.parser.parse_args() + args = self.parser.parse_args() # log as verbose or quiet as we want, warn by default logging.basicConfig() logging.getLogger().setLevel(logging.WARNING - - (options.v - options.q)*10) - observer = self.handle(args, options) - print observer.serialize(type=options.data).encode('utf-8', 'replace') + (args.v - args.q) * 10) + observer = self.handle(args) + print observer.serialize(type=args.data).encode('utf-8', 'replace') - def handle(self, args, options): + def handle(self, args): """Subclasses need to implement this method for the actual command handling. """ @@ -76,39 +75,42 @@ data in a json useful for Exhibit class CompareLocales(BaseCommand): - """usage: %prog [options] l10n.ini l10n_base_dir [locale ...] - -Check the localization status of a gecko application. + """Check the localization status of a gecko application. The first argument is a path to the l10n.ini file for the application, followed by the base directory of the localization repositories. Then you pass in the list of locale codes you want to compare. If there are not locales given, the list of locales will be taken from the all-locales file of the application\'s l10n.ini.""" - options = BaseCommand.options + [ - make_option('--clobber-merge', action="store_true", default=False, - dest='clobber', - help="""WARNING: DATALOSS. + def get_parser(self): + parser = super(CompareLocales, self).get_parser() + parser.add_argument('ini_file', metavar='l10n.ini', + help='INI file for the project') + parser.add_argument('l10n_base_dir', metavar='l10n-base-dir', + help='Parent directory of localizations') + parser.add_argument('locales', nargs='*', metavar='locale-code', + help='Locale code and top-level directory of ' + 'each localization') + parser.add_argument('--clobber-merge', action="store_true", + default=False, dest='clobber', + help="""WARNING: DATALOSS. Use this option with care. If specified, the merge directory will be clobbered for each module. That means, the subdirectory will be completely removed, any files that were there are lost. -Be careful to specify the right merge directory when using this option."""), - make_option('-r', '--reference', default='en-US', dest='reference', - help='Explicitly set the reference ' - 'localization. [default: en-US]'), - BaseCommand.data_option - ] +Be careful to specify the right merge directory when using this option.""") + parser.add_argument('-r', '--reference', default='en-US', + dest='reference', + help='Explicitly set the reference ' + 'localization. [default: en-US]') + self.add_data_argument(parser) + return parser - def handle(self, args, options): - if len(args) < 2: - self.parser.error('Need to pass in list of languages') - inipath, l10nbase = args[:2] - locales = args[2:] - app = EnumerateApp(inipath, l10nbase, locales) - app.reference = options.reference + def handle(self, args): + app = EnumerateApp(args.ini_file, args.l10n_base_dir, args.locales) + app.reference = args.reference try: - observer = compareApp(app, merge_stage=options.merge, - clobber=options.clobber) + observer = compareApp(app, merge_stage=args.merge, + clobber=args.clobber) except (OSError, IOError), exc: print "FAIL: " + str(exc) self.parser.exit(2) @@ -116,39 +118,38 @@ Be careful to specify the right merge directory when using this option."""), class CompareDirs(BaseCommand): - """usage: %prog [options] reference localization - -Check the localization status of a directory tree. + """Check the localization status of a directory tree. The first argument is a path to the reference data,the second is the localization to be tested.""" - options = BaseCommand.options + [ - BaseCommand.data_option - ] + def get_parser(self): + parser = super(CompareDirs, self).get_parser() + parser.add_argument('reference') + parser.add_argument('localization') + self.add_data_argument(parser) + return parser - def handle(self, args, options): - if len(args) != 2: - self.parser.error('Reference and localizatino required') - reference, locale = args - observer = compareDirs(reference, locale, merge_stage=options.merge) + def handle(self, args): + observer = compareDirs(args.reference, args.localization, + merge_stage=args.merge) return observer class CompareWebApp(BaseCommand): - """usage: %prog [options] webapp [locale locale] - -Check the localization status of a gaia-style web app. + """Check the localization status of a gaia-style web app. The first argument is the directory of the web app. Following arguments explicitly state the locales to test. If none are given, test all locales in manifest.webapp or files.""" - options = BaseCommand.options[:-1] + [ - BaseCommand.data_option] + def get_parser(self): + parser = super(CompareWebApp, self).get_parser() + parser.add_argument('webapp') + parser.add_argument('locales', nargs='*', metavar='locale-code', + help='Locale code and top-level directory of ' + 'each localization') + self.add_data_argument(parser) + return parser - def handle(self, args, options): - if len(args) < 1: - self.parser.error('Webapp directory required') - basedir = args[0] - locales = args[1:] - observer = compare_web_app(basedir, locales) + def handle(self, args): + observer = compare_web_app(args.webapp, args.locales) return observer diff --git a/python/compare-locales/compare_locales/compare.py b/python/compare-locales/compare_locales/compare.py index 4f71c46f8f4c..e7bc41546f23 100644 --- a/python/compare-locales/compare_locales/compare.py +++ b/python/compare-locales/compare_locales/compare.py @@ -383,13 +383,13 @@ class ContentComparer: self.merge_stage = merge_stage def merge(self, ref_entities, ref_map, ref_file, l10n_file, missing, - skips, p): + skips, ctx, canMerge, encoding): outfile = os.path.join(self.merge_stage, l10n_file.module, l10n_file.file) outdir = os.path.dirname(outfile) if not os.path.isdir(outdir): os.makedirs(outdir) - if not p.canMerge: + if not canMerge: shutil.copyfile(ref_file.fullpath, outfile) print "copied reference to " + outfile return @@ -402,16 +402,16 @@ class ContentComparer: if not isinstance(skip, parser.Junk)]) if skips: # we need to skip a few errornous blocks in the input, copy by hand - f = codecs.open(outfile, 'wb', p.encoding) + f = codecs.open(outfile, 'wb', encoding) offset = 0 for skip in skips: chunk = skip.span - f.write(p.contents[offset:chunk[0]]) + f.write(ctx.contents[offset:chunk[0]]) offset = chunk[1] - f.write(p.contents[offset:]) + f.write(ctx.contents[offset:]) else: shutil.copyfile(l10n_file.fullpath, outfile) - f = codecs.open(outfile, 'ab', p.encoding) + f = codecs.open(outfile, 'ab', encoding) print "adding to " + outfile def ensureNewline(s): @@ -458,20 +458,10 @@ class ContentComparer: try: p.readContents(l10n.getContents()) l10n_entities, l10n_map = p.parse() + l10n_ctx = p.ctx except Exception, e: self.notify('error', l10n, str(e)) return - lines = [] - - def _getLine(offset): - if not lines: - lines.append(0) - for m in self.nl.finditer(p.contents): - lines.append(m.end()) - for i in xrange(len(lines), 0, -1): - if offset >= lines[i - 1]: - return (i, offset - lines[i - 1]) - return (1, offset) l10n_list = l10n_map.keys() l10n_list.sort() @@ -501,9 +491,10 @@ class ContentComparer: if isinstance(l10n_entities[l10n_map[item_or_pair]], parser.Junk): junk = l10n_entities[l10n_map[item_or_pair]] - params = (junk.val,) + junk.span + params = (junk.val,) + junk.position() + junk.position(-1) self.notify('error', l10n, - 'Unparsed content "%s" at %d-%d' % params) + 'Unparsed content "%s" from line %d colum %d' + ' to line %d column %d' % params) if self.merge_stage is not None: skips.append(junk) elif self.notify('obsoleteEntity', l10n, @@ -528,17 +519,17 @@ class ContentComparer: for tp, pos, msg, cat in checker.check(refent, l10nent): # compute real src position, if first line, # col needs adjustment - _l, _offset = _getLine(l10nent.val_span[0]) if isinstance(pos, tuple): + _l, col = l10nent.value_position() # line, column if pos[0] == 1: - col = pos[1] + _offset + col = col + pos[1] else: col = pos[1] - _l += pos[0] - 1 + _l += pos[0] - 1 else: - _l, col = _getLine(l10nent.val_span[0] + pos) - # skip error entities when merging + _l, col = l10nent.value_position(pos) + # skip error entities when merging if tp == 'error' and self.merge_stage is not None: skips.append(l10nent) self.notify(tp, l10n, @@ -548,7 +539,10 @@ class ContentComparer: if missing: self.notify('missing', l10n, missing) if self.merge_stage is not None and (missings or skips): - self.merge(ref[0], ref[1], ref_file, l10n, missings, skips, p) + self.merge( + ref[0], ref[1], ref_file, + l10n, missings, skips, l10n_ctx, + p.canMerge, p.encoding) if report: self.notify('report', l10n, report) if obsolete: diff --git a/python/compare-locales/compare_locales/parser.py b/python/compare-locales/compare_locales/parser.py index a97cf201be00..0f95aafdec64 100644 --- a/python/compare-locales/compare_locales/parser.py +++ b/python/compare-locales/compare_locales/parser.py @@ -3,76 +3,93 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. import re +import bisect import codecs import logging -from HTMLParser import HTMLParser __constructors = [] -class Entity(object): +class EntityBase(object): ''' Abstraction layer for a localizable entity. Currently supported are grammars of the form: 1: pre white space - 2: pre comments - 3: entity definition - 4: entity key (name) - 5: entity value - 6: post comment (and white space) in the same line (dtd only) + 2: entity definition + 3: entity key (name) + 4: entity value + 5: post white space <--[1] - <--[2] - + - <-------[3]---------><------[6]------> + <-------[2]---------> ''' - def __init__(self, contents, pp, - span, pre_ws_span, pre_comment_span, def_span, + def __init__(self, ctx, pp, pre_comment, + span, pre_ws_span, def_span, key_span, val_span, post_span): - self.contents = contents + self.ctx = ctx self.span = span self.pre_ws_span = pre_ws_span - self.pre_comment_span = pre_comment_span self.def_span = def_span self.key_span = key_span self.val_span = val_span self.post_span = post_span self.pp = pp + self.pre_comment = pre_comment pass + def position(self, offset=0): + """Get the 1-based line and column of the character + with given offset into the Entity. + + If offset is negative, return the end of the Entity. + """ + if offset < 0: + pos = self.span[1] + else: + pos = self.span[0] + offset + return self.ctx.lines(pos)[0] + + def value_position(self, offset=0): + """Get the 1-based line and column of the character + with given offset into the value. + + If offset is negative, return the end of the value. + """ + if offset < 0: + pos = self.val_span[1] + else: + pos = self.val_span[0] + offset + return self.ctx.lines(pos)[0] + # getter helpers def get_all(self): - return self.contents[self.span[0]:self.span[1]] + return self.ctx.contents[self.span[0]:self.span[1]] def get_pre_ws(self): - return self.contents[self.pre_ws_span[0]:self.pre_ws_span[1]] - - def get_pre_comment(self): - return self.contents[self.pre_comment_span[0]: - self.pre_comment_span[1]] + return self.ctx.contents[self.pre_ws_span[0]:self.pre_ws_span[1]] def get_def(self): - return self.contents[self.def_span[0]:self.def_span[1]] + return self.ctx.contents[self.def_span[0]:self.def_span[1]] def get_key(self): - return self.contents[self.key_span[0]:self.key_span[1]] + return self.ctx.contents[self.key_span[0]:self.key_span[1]] def get_val(self): - return self.pp(self.contents[self.val_span[0]:self.val_span[1]]) + return self.pp(self.ctx.contents[self.val_span[0]:self.val_span[1]]) def get_raw_val(self): - return self.contents[self.val_span[0]:self.val_span[1]] + return self.ctx.contents[self.val_span[0]:self.val_span[1]] def get_post(self): - return self.contents[self.post_span[0]:self.post_span[1]] + return self.ctx.contents[self.post_span[0]:self.post_span[1]] # getters all = property(get_all) pre_ws = property(get_pre_ws) - pre_comment = property(get_pre_comment) definition = property(get_def) key = property(get_key) val = property(get_val) @@ -83,6 +100,32 @@ class Entity(object): return self.key +class Entity(EntityBase): + pass + + +class Comment(EntityBase): + def __init__(self, ctx, span, pre_ws_span, def_span, + post_span): + self.ctx = ctx + self.span = span + self.pre_ws_span = pre_ws_span + self.def_span = def_span + self.post_span = post_span + self.pp = lambda v: v + + @property + def key(self): + return None + + @property + def val(self): + return None + + def __repr__(self): + return self.all + + class Junk(object): ''' An almost-Entity, representing junk data that we didn't parse. @@ -91,16 +134,28 @@ class Junk(object): ''' junkid = 0 - def __init__(self, contents, span): - self.contents = contents + def __init__(self, ctx, span): + self.ctx = ctx self.span = span - self.pre_ws = self.pre_comment = self.definition = self.post = '' + self.pre_ws = self.definition = self.post = '' self.__class__.junkid += 1 self.key = '_junk_%d_%d-%d' % (self.__class__.junkid, span[0], span[1]) + def position(self, offset=0): + """Get the 1-based line and column of the character + with given offset into the Entity. + + If offset is negative, return the end of the Entity. + """ + if offset < 0: + pos = self.span[1] + else: + pos = self.span[0] + offset + return self.ctx.lines(pos)[0] + # getter helpers def get_all(self): - return self.contents[self.span[0]:self.span[1]] + return self.ctx.contents[self.span[0]:self.span[1]] # getters all = property(get_all) @@ -110,26 +165,65 @@ class Junk(object): return self.key +class Whitespace(EntityBase): + '''Entity-like object representing an empty file with whitespace, + if allowed + ''' + def __init__(self, ctx, span): + self.ctx = ctx + self.key_span = self.val_span = self.span = span + self.def_span = self.pre_ws_span = (span[0], span[0]) + self.post_span = (span[1], span[1]) + self.pp = lambda v: v + + def __repr__(self): + return self.raw_val + + class Parser: canMerge = True + tail = re.compile('\s+\Z') + + class Context(object): + "Fixture for content and line numbers" + def __init__(self, contents): + self.contents = contents + self._lines = None + + def lines(self, *positions): + # return line and column tuples, 1-based + if self._lines is None: + nl = re.compile('\n', re.M) + self._lines = [m.end() + for m in nl.finditer(self.contents)] + line_nrs = [bisect.bisect(self._lines, p) for p in positions] + # compute columns + pos_ = [ + (1 + line, 1 + p - (self._lines[line-1] if line else 0)) + for line, p in zip(line_nrs, positions)] + return pos_ def __init__(self): if not hasattr(self, 'encoding'): self.encoding = 'utf-8' - pass + self.ctx = None + self.last_comment = None def readFile(self, file): - f = codecs.open(file, 'r', self.encoding) - try: - self.contents = f.read() - except UnicodeDecodeError, e: - (logging.getLogger('locales') - .error("Can't read file: " + file + '; ' + str(e))) - self.contents = u'' - f.close() + with open(file, 'rU') as f: + try: + self.readContents(f.read()) + except UnicodeDecodeError, e: + (logging.getLogger('locales') + .error("Can't read file: " + file + '; ' + str(e))) def readContents(self, contents): - (self.contents, length) = codecs.getdecoder(self.encoding)(contents) + '''Read contents and create parsing context. + + contents are in native encoding, but with normalized line endings. + ''' + (contents, length) = codecs.getdecoder(self.encoding)(contents) + self.ctx = Parser.Context(contents) def parse(self): l = [] @@ -143,52 +237,57 @@ class Parser: return val def __iter__(self): - contents = self.contents + return self.walk(onlyEntities=True) + + def walk(self, onlyEntities=False): + if not self.ctx: + # loading file failed, or we just didn't load anything + return + ctx = self.ctx + contents = ctx.contents offset = 0 - self.header, offset = self.getHeader(contents, offset) - self.footer = '' - entity, offset = self.getEntity(contents, offset) + entity, offset = self.getEntity(ctx, offset) while entity: - yield entity - entity, offset = self.getEntity(contents, offset) - f = self.reFooter.match(contents, offset) - if f: - self.footer = f.group() - offset = f.end() + if (not onlyEntities or + type(entity) is Entity or + type(entity) is Junk): + yield entity + entity, offset = self.getEntity(ctx, offset) if len(contents) > offset: - yield Junk(contents, (offset, len(contents))) - pass + yield Junk(ctx, (offset, len(contents))) - def getHeader(self, contents, offset): - header = '' - h = self.reHeader.match(contents) - if h: - header = h.group() - offset = h.end() - return (header, offset) - - def getEntity(self, contents, offset): - m = self.reKey.match(contents, offset) + def getEntity(self, ctx, offset): + m = self.reKey.match(ctx.contents, offset) if m: offset = m.end() - entity = self.createEntity(contents, m) + entity = self.createEntity(ctx, m) return (entity, offset) - # first check if footer has a non-empty match, - # 'cause then we don't find junk - m = self.reFooter.match(contents, offset) - if m and m.end() > offset: - return (None, offset) - m = self.reKey.search(contents, offset) + m = self.reComment.match(ctx.contents, offset) if m: - # we didn't match, but search, so there's junk between offset - # and start. We'll match() on the next turn - junkend = m.start() - return (Junk(contents, (offset, junkend)), junkend) - return (None, offset) + offset = m.end() + self.last_comment = Comment(ctx, *[m.span(i) for i in xrange(4)]) + return (self.last_comment, offset) + return self.getTrailing(ctx, offset, self.reKey, self.reComment) - def createEntity(self, contents, m): - return Entity(contents, self.postProcessValue, - *[m.span(i) for i in xrange(7)]) + def getTrailing(self, ctx, offset, *expressions): + junkend = None + for exp in expressions: + m = exp.search(ctx.contents, offset) + if m: + junkend = min(junkend, m.start()) if junkend else m.start() + if junkend is None: + if self.tail.match(ctx.contents, offset): + white_end = len(ctx.contents) + return (Whitespace(ctx, (offset, white_end)), white_end) + else: + return (None, offset) + return (Junk(ctx, (offset, junkend)), junkend) + + def createEntity(self, ctx, m): + pre_comment = unicode(self.last_comment) if self.last_comment else '' + self.last_comment = '' + return Entity(ctx, self.postProcessValue, pre_comment, + *[m.span(i) for i in xrange(6)]) def getParser(path): @@ -230,22 +329,20 @@ class DTDParser(Parser): # [#x0300-#x036F] | [#x203F-#x2040] NameChar = NameStartChar + ur'\-\.0-9' + u'\xB7\u0300-\u036F\u203F-\u2040' Name = '[' + NameStartChar + '][' + NameChar + ']*' - reKey = re.compile('(?:(?P
\s*)(?P(?:' + XmlComment +
-                       '\s*)*)(?P' + Name +
+    reKey = re.compile('(?:(?P
\s*)(?P' + Name +
                        ')\s+(?P\"[^\"]*\"|\'[^\']*\'?)\s*>)'
-                       '(?P[ \t]*(?:' + XmlComment + '\s*)*\n?)?)',
-                       re.DOTALL)
+                       '(?P\s*)?)',
+                       re.DOTALL | re.M)
     # add BOM to DTDs, details in bug 435002
-    reHeader = re.compile(u'^\ufeff?'
-                          u'(\s*)?', re.S)
-    reFooter = re.compile('\s*(\s*)*$')
-    rePE = re.compile('(?:(\s*)((?:' + XmlComment + '\s*)*)'
-                      '(\s*%' + Name +
-                      ';)([ \t]*(?:' + XmlComment + '\s*)*\n?)?)')
+    reHeader = re.compile(u'^\ufeff')
+    reComment = re.compile('(\s*)()(\s*)' % CharMinusDash,
+                           re.S)
+    rePE = re.compile(u'(?:(\s*)'
+                      u'(\s*%' + Name +
+                      u';)([ \t]*(?:' + XmlComment + u'\s*)*\n?)?)')
 
-    def getEntity(self, contents, offset):
+    def getEntity(self, ctx, offset):
         '''
         Overload Parser.getEntity to special-case ParsedEntities.
         Just check for a parsed entity if that method claims junk.
@@ -253,20 +350,26 @@ class DTDParser(Parser):
         
         %foo;
         '''
-        entity, inneroffset = Parser.getEntity(self, contents, offset)
+        if offset is 0 and self.reHeader.match(ctx.contents):
+            offset += 1
+        entity, inneroffset = Parser.getEntity(self, ctx, offset)
         if (entity and isinstance(entity, Junk)) or entity is None:
-            m = self.rePE.match(contents, offset)
+            m = self.rePE.match(ctx.contents, offset)
             if m:
                 inneroffset = m.end()
-                entity = Entity(contents, self.postProcessValue,
-                                *[m.span(i) for i in xrange(7)])
+                self.last_comment = ''
+                entity = Entity(ctx, self.postProcessValue, '',
+                                *[m.span(i) for i in xrange(6)])
         return (entity, inneroffset)
 
-    def createEntity(self, contents, m):
+    def createEntity(self, ctx, m):
         valspan = m.span('val')
         valspan = (valspan[0]+1, valspan[1]-1)
-        return Entity(contents, self.postProcessValue, m.span(),
-                      m.span('pre'), m.span('precomment'),
+        pre_comment = unicode(self.last_comment) if self.last_comment else ''
+        self.last_comment = ''
+        return Entity(ctx, self.postProcessValue, pre_comment,
+                      m.span(),
+                      m.span('pre'),
                       m.span('entity'), m.span('key'), valspan,
                       m.span('post'))
 
@@ -278,30 +381,30 @@ class PropertiesParser(Parser):
 
     def __init__(self):
         self.reKey = re.compile('^(\s*)'
-                                '((?:[#!].*?\n\s*)*)'
                                 '([^#!\s\n][^=:\n]*?)\s*[:=][ \t]*', re.M)
-        self.reHeader = re.compile('^\s*([#!].*\s*)+')
-        self.reFooter = re.compile('\s*([#!].*\s*)*$')
+        self.reComment = re.compile('(\s*)(((?:[#!][^\n]*\n?)+))', re.M)
         self._escapedEnd = re.compile(r'\\+$')
-        self._trailingWS = re.compile(r'[ \t]*$')
+        self._trailingWS = re.compile(r'\s*(?:\n|\Z)', re.M)
         Parser.__init__(self)
 
-    def getHeader(self, contents, offset):
-        header = ''
-        h = self.reHeader.match(contents, offset)
-        if h:
-            candidate = h.group()
-            if 'http://mozilla.org/MPL/2.0/' in candidate or \
-                    'LICENSE BLOCK' in candidate:
-                header = candidate
-                offset = h.end()
-        return (header, offset)
-
-    def getEntity(self, contents, offset):
+    def getEntity(self, ctx, offset):
         # overwritten to parse values line by line
+        contents = ctx.contents
+        m = self.reComment.match(contents, offset)
+        if m:
+            spans = [m.span(i) for i in xrange(3)]
+            start_trailing = offset = m.end()
+            while offset < len(contents):
+                m = self._trailingWS.match(contents, offset)
+                if not m:
+                    break
+                offset = m.end()
+            spans.append((start_trailing, offset))
+            self.last_comment = Comment(ctx, *spans)
+            return (self.last_comment, offset)
         m = self.reKey.match(contents, offset)
         if m:
-            offset = m.end()
+            startline = offset = m.end()
             while True:
                 endval = nextline = contents.find('\n', offset)
                 if nextline == -1:
@@ -315,26 +418,24 @@ class PropertiesParser(Parser):
                 # backslashes at end of line, if 2*n, not escaped
                 if len(_e.group()) % 2 == 0:
                     break
+                startline = offset
             # strip trailing whitespace
-            ws = self._trailingWS.search(contents, m.end(), offset)
+            ws = self._trailingWS.search(contents, startline)
             if ws:
-                endval -= ws.end() - ws.start()
-            entity = Entity(contents, self.postProcessValue,
+                endval = ws.start()
+                offset = ws.end()
+            pre_comment = (unicode(self.last_comment) if self.last_comment
+                           else '')
+            self.last_comment = ''
+            entity = Entity(ctx, self.postProcessValue, pre_comment,
                             (m.start(), offset),   # full span
                             m.span(1),  # leading whitespan
-                            m.span(2),  # leading comment span
-                            (m.start(3), offset),   # entity def span
-                            m.span(3),   # key span
+                            (m.start(2), offset),   # entity def span
+                            m.span(2),   # key span
                             (m.end(), endval),   # value span
                             (offset, offset))  # post comment span, empty
             return (entity, offset)
-        m = self.reKey.search(contents, offset)
-        if m:
-            # we didn't match, but search, so there's junk between offset
-            # and start. We'll match() on the next turn
-            junkend = m.start()
-            return (Junk(contents, (offset, junkend)), junkend)
-        return (None, offset)
+        return self.getTrailing(ctx, offset, self.reKey, self.reComment)
 
     def postProcessValue(self, val):
 
@@ -349,18 +450,77 @@ class PropertiesParser(Parser):
         return val
 
 
+class DefinesInstruction(EntityBase):
+    '''Entity-like object representing processing instructions in inc files
+    '''
+    def __init__(self, ctx, span, pre_ws_span, def_span, val_span, post_span):
+        self.ctx = ctx
+        self.span = span
+        self.pre_ws_span = pre_ws_span
+        self.def_span = def_span
+        self.key_span = self.val_span = val_span
+        self.post_span = post_span
+        self.pp = lambda v: v
+
+    def __repr__(self):
+        return self.raw_val
+
+
 class DefinesParser(Parser):
     # can't merge, #unfilter needs to be the last item, which we don't support
     canMerge = False
+    tail = re.compile(r'(?!)')  # never match
 
     def __init__(self):
-        self.reKey = re.compile('^(\s*)((?:^#(?!define\s).*\s*)*)'
-                                '(#define[ \t]+(\w+)[ \t]+(.*?))([ \t]*$\n?)',
+        self.reComment = re.compile(
+            '((?:[ \t]*\n)*)'
+            '((?:^# .*?(?:\n|\Z))+)'
+            '((?:[ \t]*(?:\n|\Z))*)', re.M)
+        self.reKey = re.compile('((?:[ \t]*\n)*)'
+                                '(#define[ \t]+(\w+)(?:[ \t](.*?))?(?:\n|\Z))'
+                                '((?:[ \t]*(?:\n|\Z))*)',
                                 re.M)
-        self.reHeader = re.compile('^\s*(#(?!define\s).*\s*)*')
-        self.reFooter = re.compile('\s*(#(?!define\s).*\s*)*$', re.M)
+        self.rePI = re.compile('((?:[ \t]*\n)*)'
+                               '(#(\w+)[ \t]+(.*?)(?:\n|\Z))'
+                               '((?:[ \t]*(?:\n|\Z))*)',
+                               re.M)
         Parser.__init__(self)
 
+    def getEntity(self, ctx, offset):
+        contents = ctx.contents
+        m = self.reComment.match(contents, offset)
+        if m:
+            offset = m.end()
+            self.last_comment = Comment(ctx, *[m.span(i) for i in xrange(4)])
+            return (self.last_comment, offset)
+        m = self.reKey.match(contents, offset)
+        if m:
+            offset = m.end()
+            return (self.createEntity(ctx, m), offset)
+        m = self.rePI.match(contents, offset)
+        if m:
+            offset = m.end()
+            return (DefinesInstruction(ctx, *[m.span(i) for i in xrange(5)]),
+                    offset)
+        return self.getTrailing(ctx, offset,
+                                self.reComment, self.reKey, self.rePI)
+
+
+class IniSection(EntityBase):
+    '''Entity-like object representing sections in ini files
+    '''
+    def __init__(self, ctx, span, pre_ws_span, def_span, val_span, post_span):
+        self.ctx = ctx
+        self.span = span
+        self.pre_ws_span = pre_ws_span
+        self.def_span = def_span
+        self.key_span = self.val_span = val_span
+        self.post_span = post_span
+        self.pp = lambda v: v
+
+    def __repr__(self):
+        return self.raw_val
+
 
 class IniParser(Parser):
     '''
@@ -373,149 +533,40 @@ class IniParser(Parser):
     ...
     '''
     def __init__(self):
-        self.reHeader = re.compile('^((?:\s*|[;#].*)\n)*\[.+?\]\n', re.M)
-        self.reKey = re.compile('(\s*)((?:[;#].*\n\s*)*)((.+?)=(.*))(\n?)')
-        self.reFooter = re.compile('\s*([;#].*\s*)*$')
+        self.reComment = re.compile(
+            '((?:[ \t]*\n)*)'
+            '((?:^[;#].*?(?:\n|\Z))+)'
+            '((?:[ \t]*(?:\n|\Z))*)', re.M)
+        self.reSection = re.compile(
+            '((?:[ \t]*\n)*)'
+            '(\[(.*?)\])'
+            '((?:[ \t]*(?:\n|\Z))*)', re.M)
+        self.reKey = re.compile(
+            '((?:[ \t]*\n)*)'
+            '((.+?)=(.*))'
+            '((?:[ \t]*(?:\n|\Z))*)', re.M)
         Parser.__init__(self)
 
-
-DECL, COMMENT, START, END, CONTENT = range(5)
-
-
-class BookmarksParserInner(HTMLParser):
-
-    class Token(object):
-        _type = None
-        content = ''
-
-        def __str__(self):
-            return self.content
-
-    class DeclToken(Token):
-        _type = DECL
-
-        def __init__(self, decl):
-            self.content = decl
-            pass
-
-        def __str__(self):
-            return '' % self.content
-        pass
-
-    class CommentToken(Token):
-        _type = COMMENT
-
-        def __init__(self, comment):
-            self.content = comment
-            pass
-
-        def __str__(self):
-            return '' % self.content
-        pass
-
-    class StartToken(Token):
-        _type = START
-
-        def __init__(self, tag, attrs, content):
-            self.tag = tag
-            self.attrs = dict(attrs)
-            self.content = content
-            pass
-        pass
-
-    class EndToken(Token):
-        _type = END
-
-        def __init__(self, tag):
-            self.tag = tag
-            pass
-
-        def __str__(self):
-            return '' % self.tag.upper()
-        pass
-
-    class ContentToken(Token):
-        _type = CONTENT
-
-        def __init__(self, content):
-            self.content = content
-            pass
-        pass
-
-    def __init__(self):
-        HTMLParser.__init__(self)
-        self.tokens = []
-
-    def parse(self, contents):
-        self.tokens = []
-        self.feed(contents)
-        self.close()
-        return self.tokens
-
-    # Called when we hit an end DL tag to reset the folder selections
-    def handle_decl(self, decl):
-        self.tokens.append(self.DeclToken(decl))
-
-    # Called when we hit an end DL tag to reset the folder selections
-    def handle_comment(self, comment):
-        self.tokens.append(self.CommentToken(comment))
-
-    def handle_starttag(self, tag, attrs):
-        self.tokens.append(self.StartToken(tag, attrs,
-                                           self.get_starttag_text()))
-
-    # Called when text data is encountered
-    def handle_data(self, data):
-        if self.tokens[-1]._type == CONTENT:
-            self.tokens[-1].content += data
-        else:
-            self.tokens.append(self.ContentToken(data))
-
-    def handle_charref(self, data):
-        self.handle_data('&#%s;' % data)
-
-    def handle_entityref(self, data):
-        self.handle_data('&%s;' % data)
-
-    # Called when we hit an end DL tag to reset the folder selections
-    def handle_endtag(self, tag):
-        self.tokens.append(self.EndToken(tag))
-
-
-class BookmarksParser(Parser):
-    canMerge = False
-
-    class BMEntity(object):
-        def __init__(self, key, val):
-            self.key = key
-            self.val = val
-
-    def __iter__(self):
-        p = BookmarksParserInner()
-        tks = p.parse(self.contents)
-        i = 0
-        k = []
-        for i in xrange(len(tks)):
-            t = tks[i]
-            if t._type == START:
-                k.append(t.tag)
-                keys = t.attrs.keys()
-                keys.sort()
-                for attrname in keys:
-                    yield self.BMEntity('.'.join(k) + '.@' + attrname,
-                                        t.attrs[attrname])
-                if i + 1 < len(tks) and tks[i+1]._type == CONTENT:
-                    i += 1
-                    t = tks[i]
-                    v = t.content.strip()
-                    if v:
-                        yield self.BMEntity('.'.join(k), v)
-            elif t._type == END:
-                k.pop()
+    def getEntity(self, ctx, offset):
+        contents = ctx.contents
+        m = self.reComment.match(contents, offset)
+        if m:
+            offset = m.end()
+            self.last_comment = Comment(ctx, *[m.span(i) for i in xrange(4)])
+            return (self.last_comment, offset)
+        m = self.reSection.match(contents, offset)
+        if m:
+            offset = m.end()
+            return (IniSection(ctx, *[m.span(i) for i in xrange(5)]), offset)
+        m = self.reKey.match(contents, offset)
+        if m:
+            offset = m.end()
+            return (self.createEntity(ctx, m), offset)
+        return self.getTrailing(ctx, offset,
+                                self.reComment, self.reSection, self.reKey)
 
 
 __constructors = [('\\.dtd$', DTDParser()),
                   ('\\.properties$', PropertiesParser()),
                   ('\\.ini$', IniParser()),
-                  ('\\.inc$', DefinesParser()),
-                  ('bookmarks\\.html$', BookmarksParser())]
+                  ('\\.inc$', DefinesParser())]
diff --git a/python/compare-locales/compare_locales/tests/__init__.py b/python/compare-locales/compare_locales/tests/__init__.py
index 8808d78f4c0f..8cfdd9dbbe09 100644
--- a/python/compare-locales/compare_locales/tests/__init__.py
+++ b/python/compare-locales/compare_locales/tests/__init__.py
@@ -9,7 +9,7 @@ from itertools import izip_longest
 from pkg_resources import resource_string
 import re
 
-from compare_locales.parser import getParser
+from compare_locales import parser
 
 
 class ParserTestMixin():
@@ -20,7 +20,7 @@ class ParserTestMixin():
     def setUp(self):
         '''Create a parser for this test.
         '''
-        self.parser = getParser(self.filename)
+        self.parser = parser.getParser(self.filename)
 
     def tearDown(self):
         'tear down this test'
@@ -38,12 +38,13 @@ class ParserTestMixin():
         of reference keys and values.
         '''
         self.parser.readContents(content)
-        entities = [entity for entity in self.parser]
+        entities = list(self.parser.walk())
         for entity, ref in izip_longest(entities, refs):
-            self.assertTrue(entity, 'excess reference entity')
-            self.assertTrue(ref, 'excess parsed entity')
-            self.assertEqual(entity.val, ref[1])
-            if ref[0].startswith('_junk'):
-                self.assertTrue(re.match(ref[0], entity.key))
-            else:
+            self.assertTrue(entity, 'excess reference entity ' + unicode(ref))
+            self.assertTrue(ref, 'excess parsed entity ' + unicode(entity))
+            if isinstance(entity, parser.Entity):
                 self.assertEqual(entity.key, ref[0])
+                self.assertEqual(entity.val, ref[1])
+            else:
+                self.assertEqual(type(entity).__name__, ref[0])
+                self.assertIn(ref[1], entity.all)
diff --git a/python/compare-locales/compare_locales/tests/test_checks.py b/python/compare-locales/compare_locales/tests/test_checks.py
index b995d43f9000..3871d9d3ee6e 100644
--- a/python/compare-locales/compare_locales/tests/test_checks.py
+++ b/python/compare-locales/compare_locales/tests/test_checks.py
@@ -6,7 +6,7 @@
 import unittest
 
 from compare_locales.checks import getChecker
-from compare_locales.parser import getParser, Entity
+from compare_locales.parser import getParser, Parser, Entity
 from compare_locales.paths import File
 
 
@@ -239,14 +239,16 @@ class TestAndroid(unittest.TestCase):
                u"\\u0022, or put string in apostrophes."
 
     def getEntity(self, v):
-        return Entity(v, lambda s: s, (0, len(v)), (), (0, 0), (), (),
+        ctx = Parser.Context(v)
+        return Entity(ctx, lambda s: s, '', (0, len(v)), (), (), (),
                       (0, len(v)), ())
 
     def getDTDEntity(self, v):
         v = v.replace('"', '"')
-        return Entity('' % v,
-                      lambda s: s,
-                      (0, len(v) + 16), (), (0, 0), (), (9, 12),
+        ctx = Parser.Context('' % v)
+        return Entity(ctx,
+                      lambda s: s, '',
+                      (0, len(v) + 16), (), (), (9, 12),
                       (14, len(v) + 14), ())
 
     def test_android_dtd(self):
diff --git a/python/compare-locales/compare_locales/tests/test_defines.py b/python/compare-locales/compare_locales/tests/test_defines.py
new file mode 100644
index 000000000000..03a864dad282
--- /dev/null
+++ b/python/compare-locales/compare_locales/tests/test_defines.py
@@ -0,0 +1,95 @@
+# -*- coding: utf-8 -*-
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+import unittest
+
+from compare_locales.tests import ParserTestMixin
+
+
+mpl2 = '''\
+# 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/.
+'''
+
+
+class TestDefinesParser(ParserTestMixin, unittest.TestCase):
+
+    filename = 'defines.inc'
+
+    def testBrowser(self):
+        self._test(mpl2 + '''#filter emptyLines
+
+#define MOZ_LANGPACK_CREATOR mozilla.org
+
+# If non-English locales wish to credit multiple contributors, uncomment this
+# variable definition and use the format specified.
+# #define MOZ_LANGPACK_CONTRIBUTORS Joe Solon
+
+#unfilter emptyLines
+
+''', (
+            ('Comment', mpl2),
+            ('DefinesInstruction', 'filter emptyLines'),
+            ('MOZ_LANGPACK_CREATOR', 'mozilla.org'),
+            ('Comment', '#define'),
+            ('DefinesInstruction', 'unfilter emptyLines')))
+
+    def testBrowserWithContributors(self):
+        self._test(mpl2 + '''#filter emptyLines
+
+#define MOZ_LANGPACK_CREATOR mozilla.org
+
+# If non-English locales wish to credit multiple contributors, uncomment this
+# variable definition and use the format specified.
+#define MOZ_LANGPACK_CONTRIBUTORS Joe Solon
+
+#unfilter emptyLines
+
+''', (
+            ('Comment', mpl2),
+            ('DefinesInstruction', 'filter emptyLines'),
+            ('MOZ_LANGPACK_CREATOR', 'mozilla.org'),
+            ('Comment', 'non-English'),
+            ('MOZ_LANGPACK_CONTRIBUTORS',
+             'Joe Solon'),
+            ('DefinesInstruction', 'unfilter emptyLines')))
+
+    def testCommentWithNonAsciiCharacters(self):
+        self._test(mpl2 + '''#filter emptyLines
+
+# e.g. #define seamonkey_l10n 
SeaMonkey v češtině +#define seamonkey_l10n_long + +#unfilter emptyLines + +''', ( + ('Comment', mpl2), + ('DefinesInstruction', 'filter emptyLines'), + ('Comment', u'češtině'), + ('seamonkey_l10n_long', ''), + ('DefinesInstruction', 'unfilter emptyLines'))) + + def testToolkit(self): + self._test('''#define MOZ_LANG_TITLE English (US) +''', ( + ('MOZ_LANG_TITLE', 'English (US)'),)) + + def testToolkitEmpty(self): + self._test('', tuple()) + + def test_empty_file(self): + '''Test that empty files generate errors + + defines.inc are interesting that way, as their + content is added to the generated file. + ''' + self._test('\n', (('Junk', '\n'),)) + self._test('\n\n', (('Junk', '\n\n'),)) + self._test(' \n\n', (('Junk', ' \n\n'),)) + + +if __name__ == '__main__': + unittest.main() diff --git a/python/compare-locales/compare_locales/tests/test_dtd.py b/python/compare-locales/compare_locales/tests/test_dtd.py index 87ddcde30135..3c257b2dd731 100644 --- a/python/compare-locales/compare_locales/tests/test_dtd.py +++ b/python/compare-locales/compare_locales/tests/test_dtd.py @@ -8,7 +8,7 @@ import unittest import re -from compare_locales.parser import getParser +from compare_locales import parser from compare_locales.tests import ParserTestMixin @@ -30,9 +30,9 @@ class TestDTD(ParserTestMixin, unittest.TestCase): ''' quoteRef = ( ('good.one', 'one'), - ('_junk_\\d_25-56$', ''), + ('Junk', ''), ('good.two', 'two'), - ('_junk_\\d_82-119$', ''), + ('Junk', ''), ('good.three', 'three'), ('good.four', 'good \' quote'), ('good.five', 'good \'quoted\' word'),) @@ -62,25 +62,68 @@ class TestDTD(ParserTestMixin, unittest.TestCase): --> ''', - (('first', 'string'), ('second', 'string'))) + (('first', 'string'), ('second', 'string'), + ('Comment', 'out'))) def test_license_header(self): - p = getParser('foo.dtd') + p = parser.getParser('foo.dtd') p.readContents(self.resource('triple-license.dtd')) - for e in p: - self.assertEqual(e.key, 'foo') - self.assertEqual(e.val, 'value') - self.assert_('MPL' in p.header) + entities = list(p.walk()) + self.assert_(isinstance(entities[0], parser.Comment)) + self.assertIn('MPL', entities[0].all) + e = entities[1] + self.assert_(isinstance(e, parser.Entity)) + self.assertEqual(e.key, 'foo') + self.assertEqual(e.val, 'value') + self.assertEqual(len(entities), 2) p.readContents('''\ ''') - for e in p: - self.assertEqual(e.key, 'foo') - self.assertEqual(e.val, 'value') - self.assert_('MPL' in p.header) + entities = list(p.walk()) + self.assert_(isinstance(entities[0], parser.Comment)) + self.assertIn('MPL', entities[0].all) + e = entities[1] + self.assert_(isinstance(e, parser.Entity)) + self.assertEqual(e.key, 'foo') + self.assertEqual(e.val, 'value') + self.assertEqual(len(entities), 2) + + def testBOM(self): + self._test(u'\ufeff'.encode('utf-8'), + (('foo.label', 'stuff'),)) + + def test_trailing_whitespace(self): + self._test('\n \n', + (('foo.label', 'stuff'),)) + + def test_unicode_comment(self): + self._test('', + (('Comment', u'\u53d6'),)) + + def test_empty_file(self): + self._test('', tuple()) + self._test('\n', (('Whitespace', '\n'),)) + self._test('\n\n', (('Whitespace', '\n\n'),)) + self._test(' \n\n', (('Whitespace', ' \n\n'),)) + + def test_positions(self): + self.parser.readContents('''\ + + +''') + one, two = list(self.parser) + self.assertEqual(one.position(), (1, 1)) + self.assertEqual(one.value_position(), (1, 16)) + self.assertEqual(one.position(-1), (2, 1)) + self.assertEqual(two.position(), (2, 1)) + self.assertEqual(two.value_position(), (2, 16)) + self.assertEqual(two.value_position(-1), (3, 14)) + self.assertEqual(two.value_position(10), (3, 5)) + if __name__ == '__main__': unittest.main() diff --git a/python/compare-locales/compare_locales/tests/test_ini.py b/python/compare-locales/compare_locales/tests/test_ini.py index 4c8cc03e1595..1f10dd9ece34 100644 --- a/python/compare-locales/compare_locales/tests/test_ini.py +++ b/python/compare-locales/compare_locales/tests/test_ini.py @@ -23,23 +23,30 @@ class TestIniParser(ParserTestMixin, unittest.TestCase): self._test('''; This file is in the UTF-8 encoding [Strings] TitleText=Some Title -''', (('TitleText', 'Some Title'),)) - self.assert_('UTF-8' in self.parser.header) +''', ( + ('Comment', 'UTF-8 encoding'), + ('IniSection', 'Strings'), + ('TitleText', 'Some Title'),)) def testMPL2_Space_UTF(self): self._test(mpl2 + ''' ; This file is in the UTF-8 encoding [Strings] TitleText=Some Title -''', (('TitleText', 'Some Title'),)) - self.assert_('MPL' in self.parser.header) +''', ( + ('Comment', mpl2), + ('Comment', 'UTF-8'), + ('IniSection', 'Strings'), + ('TitleText', 'Some Title'),)) def testMPL2_Space(self): self._test(mpl2 + ''' [Strings] TitleText=Some Title -''', (('TitleText', 'Some Title'),)) - self.assert_('MPL' in self.parser.header) +''', ( + ('Comment', mpl2), + ('IniSection', 'Strings'), + ('TitleText', 'Some Title'),)) def testMPL2_MultiSpace(self): self._test(mpl2 + '''\ @@ -48,26 +55,33 @@ TitleText=Some Title [Strings] TitleText=Some Title -''', (('TitleText', 'Some Title'),)) - self.assert_('MPL' in self.parser.header) +''', ( + ('Comment', mpl2), + ('Comment', 'more comments'), + ('IniSection', 'Strings'), + ('TitleText', 'Some Title'),)) def testMPL2_JunkBeforeCategory(self): self._test(mpl2 + '''\ Junk [Strings] TitleText=Some Title -''', (('_junk_\\d+_0-213$', mpl2 + '''\ -Junk -[Strings]'''), ('TitleText', 'Some Title'))) - self.assert_('MPL' not in self.parser.header) +''', ( + ('Comment', mpl2), + ('Junk', 'Junk'), + ('IniSection', 'Strings'), + ('TitleText', 'Some Title'))) def test_TrailingComment(self): self._test(mpl2 + ''' [Strings] TitleText=Some Title ;Stray trailing comment -''', (('TitleText', 'Some Title'),)) - self.assert_('MPL' in self.parser.header) +''', ( + ('Comment', mpl2), + ('IniSection', 'Strings'), + ('TitleText', 'Some Title'), + ('Comment', 'Stray trailing'))) def test_SpacedTrailingComments(self): self._test(mpl2 + ''' @@ -77,8 +91,11 @@ TitleText=Some Title ;Stray trailing comment ;Second stray comment -''', (('TitleText', 'Some Title'),)) - self.assert_('MPL' in self.parser.header) +''', ( + ('Comment', mpl2), + ('IniSection', 'Strings'), + ('TitleText', 'Some Title'), + ('Comment', 'Second stray comment'))) def test_TrailingCommentsAndJunk(self): self._test(mpl2 + ''' @@ -89,14 +106,13 @@ TitleText=Some Title Junk ;Second stray comment -''', (('TitleText', 'Some Title'), ('_junk_\\d+_231-284$', '''\ - -;Stray trailing comment -Junk -;Second stray comment - -'''))) - self.assert_('MPL' in self.parser.header) +''', ( + ('Comment', mpl2), + ('IniSection', 'Strings'), + ('TitleText', 'Some Title'), + ('Comment', 'Stray trailing'), + ('Junk', 'Junk'), + ('Comment', 'Second stray comment'))) def test_JunkInbetweenEntries(self): self._test(mpl2 + ''' @@ -106,10 +122,18 @@ TitleText=Some Title Junk Good=other string -''', (('TitleText', 'Some Title'), ('_junk_\\d+_231-236$', '''\ +''', ( + ('Comment', mpl2), + ('IniSection', 'Strings'), + ('TitleText', 'Some Title'), + ('Junk', 'Junk'), + ('Good', 'other string'))) -Junk'''), ('Good', 'other string'))) - self.assert_('MPL' in self.parser.header) + def test_empty_file(self): + self._test('', tuple()) + self._test('\n', (('Whitespace', '\n'),)) + self._test('\n\n', (('Whitespace', '\n\n'),)) + self._test(' \n\n', (('Whitespace', ' \n\n'),)) if __name__ == '__main__': unittest.main() diff --git a/python/compare-locales/compare_locales/tests/test_merge.py b/python/compare-locales/compare_locales/tests/test_merge.py index c006edbb5d2d..dda0d671c8d4 100644 --- a/python/compare-locales/compare_locales/tests/test_merge.py +++ b/python/compare-locales/compare_locales/tests/test_merge.py @@ -13,7 +13,6 @@ from compare_locales.compare import ContentComparer class ContentMixin(object): - maxDiff = None # we got big dictionaries to compare extension = None # OVERLOAD def reference(self, content): @@ -29,6 +28,7 @@ class TestProperties(unittest.TestCase, ContentMixin): extension = '.properties' def setUp(self): + self.maxDiff = None self.tmp = mkdtemp() os.mkdir(os.path.join(self.tmp, "merge")) @@ -98,7 +98,8 @@ eff = effVal""") self.reference("""foo = fooVal bar = %d barVal eff = effVal""") - self.localized("""bar = %S lBar + self.localized("""\ +bar = %S lBar eff = leffVal """) cc = ContentComparer() @@ -116,7 +117,7 @@ eff = leffVal ('l10n.properties', {'value': { 'error': [u'argument 1 `S` should be `d` ' - u'at line 1, column 6 for bar'], + u'at line 1, column 7 for bar'], 'missingEntity': [u'foo']}} ) ]} @@ -160,6 +161,7 @@ class TestDTD(unittest.TestCase, ContentMixin): extension = '.dtd' def setUp(self): + self.maxDiff = None self.tmp = mkdtemp() os.mkdir(os.path.join(self.tmp, "merge")) @@ -248,7 +250,9 @@ class TestDTD(unittest.TestCase, ContentMixin): ('l10n.dtd', {'value': { 'error': [u'Unparsed content "" at 23-44'], + u'\'gimmick\'>" ' + u'from line 2 colum 1 to ' + u'line 2 column 22'], 'missingEntity': [u'bar']}} ) ]} diff --git a/python/compare-locales/compare_locales/tests/test_parser.py b/python/compare-locales/compare_locales/tests/test_parser.py new file mode 100644 index 000000000000..b8f632382ede --- /dev/null +++ b/python/compare-locales/compare_locales/tests/test_parser.py @@ -0,0 +1,44 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import unittest + +from compare_locales import parser + + +class TestParserContext(unittest.TestCase): + def test_lines(self): + "Test that Parser.Context.lines returns 1-based tuples" + ctx = parser.Parser.Context('''first line +second line +third line +''') + self.assertEqual( + ctx.lines(0, 1), + [(1, 1), (1, 2)] + ) + self.assertEqual( + ctx.lines(len('first line')), + [(1, len('first line') + 1)] + ) + self.assertEqual( + ctx.lines(len('first line') + 1), + [(2, 1)] + ) + self.assertEqual( + ctx.lines(len(ctx.contents)), + [(4, 1)] + ) + + def test_empty_parser(self): + p = parser.Parser() + entities, _map = p.parse() + self.assertListEqual( + entities, + [] + ) + self.assertDictEqual( + _map, + {} + ) diff --git a/python/compare-locales/compare_locales/tests/test_properties.py b/python/compare-locales/compare_locales/tests/test_properties.py index 331a1a57c7c9..62cd4b213a99 100644 --- a/python/compare-locales/compare_locales/tests/test_properties.py +++ b/python/compare-locales/compare_locales/tests/test_properties.py @@ -24,7 +24,7 @@ and still has another line coming ('one_line', 'This is one line'), ('two_line', u'This is the first of two lines'), ('one_line_trailing', u'This line ends in \\'), - ('_junk_\\d+_113-126$', 'and has junk\n'), + ('Junk', 'and has junk\n'), ('two_lines_triple', 'This line is one of two and ends in \\' 'and still has another line coming'))) @@ -63,8 +63,7 @@ and an end''', (('bar', 'one line with a # part that looks like a comment ' # file, You can obtain one at http://mozilla.org/MPL/2.0/. foo=value -''', (('foo', 'value'),)) - self.assert_('MPL' in self.parser.header) +''', (('Comment', 'MPL'), ('foo', 'value'))) def test_escapes(self): self.parser.readContents(r''' @@ -88,8 +87,64 @@ second = string # #commented out -''', (('first', 'string'), ('second', 'string'))) +''', (('first', 'string'), ('second', 'string'), + ('Comment', 'commented out'))) + def test_trailing_newlines(self): + self._test('''\ +foo = bar + +\x20\x20 + ''', (('foo', 'bar'),)) + + def test_just_comments(self): + self._test('''\ +# 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/. + +# LOCALIZATION NOTE These strings are used inside the Promise debugger +# which is available as a panel in the Debugger. +''', (('Comment', 'MPL'), ('Comment', 'LOCALIZATION NOTE'))) + + def test_just_comments_without_trailing_newline(self): + self._test('''\ +# 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/. + +# LOCALIZATION NOTE These strings are used inside the Promise debugger +# which is available as a panel in the Debugger.''', ( + ('Comment', 'MPL'), ('Comment', 'LOCALIZATION NOTE'))) + + def test_trailing_comment_and_newlines(self): + self._test('''\ +# LOCALIZATION NOTE These strings are used inside the Promise debugger +# which is available as a panel in the Debugger. + + + +''', (('Comment', 'LOCALIZATION NOTE'),)) + + def test_empty_file(self): + self._test('', tuple()) + self._test('\n', (('Whitespace', '\n'),)) + self._test('\n\n', (('Whitespace', '\n\n'),)) + self._test(' \n\n', (('Whitespace', ' \n\n'),)) + + def test_positions(self): + self.parser.readContents('''\ +one = value +two = other \\ +escaped value +''') + one, two = list(self.parser) + self.assertEqual(one.position(), (1, 1)) + self.assertEqual(one.value_position(), (1, 7)) + self.assertEqual(two.position(), (2, 1)) + self.assertEqual(two.value_position(), (2, 7)) + self.assertEqual(two.value_position(-1), (3, 14)) + self.assertEqual(two.value_position(10), (3, 3)) if __name__ == '__main__': unittest.main() diff --git a/python/compare-locales/compare_locales/webapps.py b/python/compare-locales/compare_locales/webapps.py index 42f5b56578aa..620736320b05 100644 --- a/python/compare-locales/compare_locales/webapps.py +++ b/python/compare-locales/compare_locales/webapps.py @@ -83,7 +83,7 @@ class Manifest(object): except (ValueError, IOError), e: if self.watcher: self.watcher.notify('error', self.file, str(e)) - return False + return {} return self.extract_manifest_strings(manifest) def extract_manifest_strings(self, manifest_fragment): From 1696d5e884c812d7464703bb4ee55fe577d63149 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Tue, 22 Nov 2016 12:30:19 +0100 Subject: [PATCH 09/53] Bug 1319396 - Update the list of checkers in the .clang-tidy file r=Ehsan MozReview-Commit-ID: 5WV2SgDuDC --HG-- extra : rebase_source : 1bcf3416ae02b9f7882aa90835e79b89208b2280 --- .clang-tidy | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 27b8100bc5e1..f28de0d5f368 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -1,6 +1,16 @@ # Checks run by clang-tidy over Mozilla code. # The following checks are currently enabled: -# * misc-use-override -Checks: '-*,misc-use-override' +# * modernize-raw-string-literal - +# Replace string literals containing escaped characters with raw string literals +# * modernize-use-bool-literals +# Replace integer literals which are cast to bool +# * modernize-loop-convert +# Converts for(...; ...; ...) loops to use the new range-based loops in C++11 +# * modernize-use-default +# Replace default bodies of special member functions with = default; +# * modernize-use-override +# Use C++11's override and remove virtual where applicable + +Checks: '-*, modernize-raw-string-literal, modernize-use-bool-literals, modernize-loop-convert, modernize-use-default, modernize-use-override' From 9b3aa7d34a8e3bf1c94ae25e27f1c8dfee49059d Mon Sep 17 00:00:00 2001 From: Jarda Snajdr Date: Thu, 24 Nov 2016 16:12:25 +0100 Subject: [PATCH 10/53] Bug 1320110 - WebConsoleClient API calls should return promises r=ochameau MozReview-Commit-ID: 1mmGGUgIwqA --HG-- extra : rebase_source : 735977ea12bf0342460d74c2b5477b0d8541527c --- .../test/browser_console_netlogging.js | 5 +- .../test/browser_webconsole_netlogging.js | 20 ++-- devtools/client/webconsole/test/head.js | 15 --- devtools/shared/client/main.js | 1 + devtools/shared/webconsole/client.js | 99 ++++++++++++++----- .../shared/webconsole/test/test_jsterm.html | 12 +-- 6 files changed, 89 insertions(+), 63 deletions(-) diff --git a/devtools/client/webconsole/test/browser_console_netlogging.js b/devtools/client/webconsole/test/browser_console_netlogging.js index a6f7bec48b52..a3ca2d033428 100644 --- a/devtools/client/webconsole/test/browser_console_netlogging.js +++ b/devtools/client/webconsole/test/browser_console_netlogging.js @@ -23,9 +23,8 @@ add_task(function* () { ok(request, "Page load was logged"); let client = hud.ui.webConsoleClient; - let args = [request.actor]; - const postData = yield getPacket(client, "getRequestPostData", args); - const responseContent = yield getPacket(client, "getResponseContent", args); + const postData = yield client.getRequestPostData(request.actor); + const responseContent = yield client.getResponseContent(request.actor); is(request.request.url, TEST_NETWORK_REQUEST_URI, "Logged network entry is page load"); diff --git a/devtools/client/webconsole/test/browser_webconsole_netlogging.js b/devtools/client/webconsole/test/browser_webconsole_netlogging.js index 63730c9b4ecc..f22ea52003b8 100644 --- a/devtools/client/webconsole/test/browser_webconsole_netlogging.js +++ b/devtools/client/webconsole/test/browser_webconsole_netlogging.js @@ -39,9 +39,8 @@ add_task(function* testPageLoad() { ok(request, "Page load was logged"); let client = hud.ui.webConsoleClient; - let args = [request.actor]; - const postData = yield getPacket(client, "getRequestPostData", args); - const responseContent = yield getPacket(client, "getResponseContent", args); + const postData = yield client.getRequestPostData(request.actor); + const responseContent = yield client.getResponseContent(request.actor); is(request.request.url, TEST_NETWORK_REQUEST_URI, "Logged network entry is page load"); @@ -65,9 +64,8 @@ add_task(function* testXhrGet() { ok(request, "testXhrGet() was logged"); let client = hud.ui.webConsoleClient; - let args = [request.actor]; - const postData = yield getPacket(client, "getRequestPostData", args); - const responseContent = yield getPacket(client, "getResponseContent", args); + const postData = yield client.getRequestPostData(request.actor); + const responseContent = yield client.getResponseContent(request.actor); is(request.request.method, "GET", "Method is correct"); ok(!postData.postData.text, "No request body was sent"); @@ -89,9 +87,8 @@ add_task(function* testXhrPost() { ok(request, "testXhrPost() was logged"); let client = hud.ui.webConsoleClient; - let args = [request.actor]; - const postData = yield getPacket(client, "getRequestPostData", args); - const responseContent = yield getPacket(client, "getResponseContent", args); + const postData = yield client.getRequestPostData(request.actor); + const responseContent = yield client.getResponseContent(request.actor); is(request.request.method, "POST", "Method is correct"); is(postData.postData.text, "Hello world!", "Request body was logged"); @@ -120,9 +117,8 @@ add_task(function* testFormSubmission() { ok(request, "testFormSubmission() was logged"); let client = hud.ui.webConsoleClient; - let args = [request.actor]; - const postData = yield getPacket(client, "getRequestPostData", args); - const responseContent = yield getPacket(client, "getResponseContent", args); + const postData = yield client.getRequestPostData(request.actor); + const responseContent = yield client.getResponseContent(request.actor); is(request.request.method, "POST", "Method is correct"); isnot(postData.postData.text diff --git a/devtools/client/webconsole/test/head.js b/devtools/client/webconsole/test/head.js index 519cb78b05b4..0131c4707200 100644 --- a/devtools/client/webconsole/test/head.js +++ b/devtools/client/webconsole/test/head.js @@ -1790,21 +1790,6 @@ function getSourceActor(sources, URL) { return item && item.value; } -/** - * Make a request against an actor and resolve with the packet. - * @param object client - * The client to use when making the request. - * @param function requestType - * The client request function to run. - * @param array args - * The arguments to pass into the function. - */ -function getPacket(client, requestType, args) { - return new Promise(resolve => { - client[requestType](...args, packet => resolve(packet)); - }); -} - /** * Verify that clicking on a link from a popup notification message tries to * open the expected URL. diff --git a/devtools/shared/client/main.js b/devtools/shared/client/main.js index 408c0b277edc..2a9a1628f273 100644 --- a/devtools/shared/client/main.js +++ b/devtools/shared/client/main.js @@ -736,6 +736,7 @@ DebuggerClient.prototype = { request.on("json-reply", listenerJson); request.on("bulk-reply", listenerBulk); request.then = deferred.promise.then.bind(deferred.promise); + request.catch = deferred.promise.catch.bind(deferred.promise); return request; }, diff --git a/devtools/shared/webconsole/client.js b/devtools/shared/webconsole/client.js index 4cc5deedf35e..a9bf0d700040 100644 --- a/devtools/shared/webconsole/client.js +++ b/devtools/shared/webconsole/client.js @@ -182,6 +182,8 @@ WebConsoleClient.prototype = { * this.CACHED_MESSAGES for known types. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ getCachedMessages: function (types, onResponse) { let packet = { @@ -189,7 +191,7 @@ WebConsoleClient.prototype = { type: "getCachedMessages", messageTypes: types, }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -199,13 +201,15 @@ WebConsoleClient.prototype = { * The WebConsoleObjectActor ID to send the request to. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ inspectObjectProperties: function (actor, onResponse) { let packet = { to: actor, type: "inspectProperties", }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -244,6 +248,8 @@ WebConsoleClient.prototype = { * exists. This is used by helper functions that can * reference the currently selected node in the Inspector, * like $0. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ evaluateJS: function (string, onResponse, options = {}) { let packet = { @@ -256,7 +262,7 @@ WebConsoleClient.prototype = { selectedNodeActor: options.selectedNodeActor, selectedObjectActor: options.selectedObjectActor, }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -266,8 +272,7 @@ WebConsoleClient.prototype = { evaluateJSAsync: function (string, onResponse, options = {}) { // Pre-37 servers don't support async evaluation. if (!this.traits.evaluateJSAsync) { - this.evaluateJS(string, onResponse, options); - return; + return this.evaluateJS(string, onResponse, options); } let packet = { @@ -281,12 +286,23 @@ WebConsoleClient.prototype = { selectedObjectActor: options.selectedObjectActor, }; - this._client.request(packet, response => { - // Null check this in case the client has been detached while waiting - // for a response. - if (this.pendingEvaluationResults) { - this.pendingEvaluationResults.set(response.resultID, onResponse); - } + return new Promise((resolve, reject) => { + this._client.request(packet, response => { + // Null check this in case the client has been detached while waiting + // for a response. + if (this.pendingEvaluationResults) { + this.pendingEvaluationResults.set(response.resultID, resp => { + if (onResponse) { + onResponse(resp); + } + if (resp.error) { + reject(resp); + } else { + resolve(resp); + } + }); + } + }); }); }, @@ -326,6 +342,8 @@ WebConsoleClient.prototype = { * The function invoked when the response is received. * @param string frameActor * The id of the frame actor that made the call. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ autocomplete: function (string, cursor, onResponse, frameActor) { let packet = { @@ -335,18 +353,21 @@ WebConsoleClient.prototype = { cursor: cursor, frameActor: frameActor, }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** * Clear the cache of messages (page errors and console API calls). + * + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ clearMessagesCache: function () { let packet = { to: this._actor, type: "clearMessagesCache", }; - this._client.request(packet); + return this._client.request(packet); }, /** @@ -356,6 +377,8 @@ WebConsoleClient.prototype = { * An array with the preferences you want to retrieve. * @param function [onResponse] * Optional function to invoke when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ getPreferences: function (preferences, onResponse) { let packet = { @@ -363,7 +386,7 @@ WebConsoleClient.prototype = { type: "getPreferences", preferences: preferences, }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -373,6 +396,8 @@ WebConsoleClient.prototype = { * An object with the preferences you want to change. * @param function [onResponse] * Optional function to invoke when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ setPreferences: function (preferences, onResponse) { let packet = { @@ -380,7 +405,7 @@ WebConsoleClient.prototype = { type: "setPreferences", preferences: preferences, }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -390,13 +415,15 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ getRequestHeaders: function (actor, onResponse) { let packet = { to: actor, type: "getRequestHeaders", }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -406,13 +433,15 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ getRequestCookies: function (actor, onResponse) { let packet = { to: actor, type: "getRequestCookies", }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -422,13 +451,15 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ getRequestPostData: function (actor, onResponse) { let packet = { to: actor, type: "getRequestPostData", }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -438,13 +469,15 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ getResponseHeaders: function (actor, onResponse) { let packet = { to: actor, type: "getResponseHeaders", }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -454,13 +487,15 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ getResponseCookies: function (actor, onResponse) { let packet = { to: actor, type: "getResponseCookies", }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -470,13 +505,15 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ getResponseContent: function (actor, onResponse) { let packet = { to: actor, type: "getResponseContent", }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -486,13 +523,15 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ getEventTimings: function (actor, onResponse) { let packet = { to: actor, type: "getEventTimings", }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -502,13 +541,15 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ getSecurityInfo: function (actor, onResponse) { let packet = { to: actor, type: "getSecurityInfo", }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -518,6 +559,8 @@ WebConsoleClient.prototype = { * The details of the HTTP request. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ sendHTTPRequest: function (data, onResponse) { let packet = { @@ -525,7 +568,7 @@ WebConsoleClient.prototype = { type: "sendHTTPRequest", request: data }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -537,6 +580,8 @@ WebConsoleClient.prototype = { * known listeners. * @param function onResponse * Function to invoke when the server response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ startListeners: function (listeners, onResponse) { let packet = { @@ -544,7 +589,7 @@ WebConsoleClient.prototype = { type: "startListeners", listeners: listeners, }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -556,6 +601,8 @@ WebConsoleClient.prototype = { * known listeners. * @param function onResponse * Function to invoke when the server response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ stopListeners: function (listeners, onResponse) { let packet = { @@ -563,7 +610,7 @@ WebConsoleClient.prototype = { type: "stopListeners", listeners: listeners, }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** diff --git a/devtools/shared/webconsole/test/test_jsterm.html b/devtools/shared/webconsole/test/test_jsterm.html index b6eefad4b6e4..5a4d7ae2eb93 100644 --- a/devtools/shared/webconsole/test/test_jsterm.html +++ b/devtools/shared/webconsole/test/test_jsterm.html @@ -24,13 +24,11 @@ let {MAX_AUTOCOMPLETE_ATTEMPTS,MAX_AUTOCOMPLETIONS} = require("devtools/shared/w // evaluateJS and once with evaluateJSAsync. let evaluatingSync = true; function evaluateJS(input, options = {}) { - return new Promise((resolve, reject) => { - if (evaluatingSync) { - gState.client.evaluateJS(input, resolve, options); - } else { - gState.client.evaluateJSAsync(input, resolve, options); - } - }); + if (evaluatingSync) { + return gState.client.evaluateJS(input, null, options); + } else { + return gState.client.evaluateJSAsync(input, null, options); + } } function startTest() From 2d9a55fea405f27831a3d7042cdf62163aa1495e Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Thu, 24 Nov 2016 19:23:28 +0100 Subject: [PATCH 11/53] Backed out changeset c816bcb8572d (bug 1320110) for mass devtools failures. r=backout on a CLOSED TREE --- .../test/browser_console_netlogging.js | 5 +- .../test/browser_webconsole_netlogging.js | 20 ++-- devtools/client/webconsole/test/head.js | 15 +++ devtools/shared/client/main.js | 1 - devtools/shared/webconsole/client.js | 99 +++++-------------- .../shared/webconsole/test/test_jsterm.html | 12 ++- 6 files changed, 63 insertions(+), 89 deletions(-) diff --git a/devtools/client/webconsole/test/browser_console_netlogging.js b/devtools/client/webconsole/test/browser_console_netlogging.js index a3ca2d033428..a6f7bec48b52 100644 --- a/devtools/client/webconsole/test/browser_console_netlogging.js +++ b/devtools/client/webconsole/test/browser_console_netlogging.js @@ -23,8 +23,9 @@ add_task(function* () { ok(request, "Page load was logged"); let client = hud.ui.webConsoleClient; - const postData = yield client.getRequestPostData(request.actor); - const responseContent = yield client.getResponseContent(request.actor); + let args = [request.actor]; + const postData = yield getPacket(client, "getRequestPostData", args); + const responseContent = yield getPacket(client, "getResponseContent", args); is(request.request.url, TEST_NETWORK_REQUEST_URI, "Logged network entry is page load"); diff --git a/devtools/client/webconsole/test/browser_webconsole_netlogging.js b/devtools/client/webconsole/test/browser_webconsole_netlogging.js index f22ea52003b8..63730c9b4ecc 100644 --- a/devtools/client/webconsole/test/browser_webconsole_netlogging.js +++ b/devtools/client/webconsole/test/browser_webconsole_netlogging.js @@ -39,8 +39,9 @@ add_task(function* testPageLoad() { ok(request, "Page load was logged"); let client = hud.ui.webConsoleClient; - const postData = yield client.getRequestPostData(request.actor); - const responseContent = yield client.getResponseContent(request.actor); + let args = [request.actor]; + const postData = yield getPacket(client, "getRequestPostData", args); + const responseContent = yield getPacket(client, "getResponseContent", args); is(request.request.url, TEST_NETWORK_REQUEST_URI, "Logged network entry is page load"); @@ -64,8 +65,9 @@ add_task(function* testXhrGet() { ok(request, "testXhrGet() was logged"); let client = hud.ui.webConsoleClient; - const postData = yield client.getRequestPostData(request.actor); - const responseContent = yield client.getResponseContent(request.actor); + let args = [request.actor]; + const postData = yield getPacket(client, "getRequestPostData", args); + const responseContent = yield getPacket(client, "getResponseContent", args); is(request.request.method, "GET", "Method is correct"); ok(!postData.postData.text, "No request body was sent"); @@ -87,8 +89,9 @@ add_task(function* testXhrPost() { ok(request, "testXhrPost() was logged"); let client = hud.ui.webConsoleClient; - const postData = yield client.getRequestPostData(request.actor); - const responseContent = yield client.getResponseContent(request.actor); + let args = [request.actor]; + const postData = yield getPacket(client, "getRequestPostData", args); + const responseContent = yield getPacket(client, "getResponseContent", args); is(request.request.method, "POST", "Method is correct"); is(postData.postData.text, "Hello world!", "Request body was logged"); @@ -117,8 +120,9 @@ add_task(function* testFormSubmission() { ok(request, "testFormSubmission() was logged"); let client = hud.ui.webConsoleClient; - const postData = yield client.getRequestPostData(request.actor); - const responseContent = yield client.getResponseContent(request.actor); + let args = [request.actor]; + const postData = yield getPacket(client, "getRequestPostData", args); + const responseContent = yield getPacket(client, "getResponseContent", args); is(request.request.method, "POST", "Method is correct"); isnot(postData.postData.text diff --git a/devtools/client/webconsole/test/head.js b/devtools/client/webconsole/test/head.js index 0131c4707200..519cb78b05b4 100644 --- a/devtools/client/webconsole/test/head.js +++ b/devtools/client/webconsole/test/head.js @@ -1790,6 +1790,21 @@ function getSourceActor(sources, URL) { return item && item.value; } +/** + * Make a request against an actor and resolve with the packet. + * @param object client + * The client to use when making the request. + * @param function requestType + * The client request function to run. + * @param array args + * The arguments to pass into the function. + */ +function getPacket(client, requestType, args) { + return new Promise(resolve => { + client[requestType](...args, packet => resolve(packet)); + }); +} + /** * Verify that clicking on a link from a popup notification message tries to * open the expected URL. diff --git a/devtools/shared/client/main.js b/devtools/shared/client/main.js index 2a9a1628f273..408c0b277edc 100644 --- a/devtools/shared/client/main.js +++ b/devtools/shared/client/main.js @@ -736,7 +736,6 @@ DebuggerClient.prototype = { request.on("json-reply", listenerJson); request.on("bulk-reply", listenerBulk); request.then = deferred.promise.then.bind(deferred.promise); - request.catch = deferred.promise.catch.bind(deferred.promise); return request; }, diff --git a/devtools/shared/webconsole/client.js b/devtools/shared/webconsole/client.js index a9bf0d700040..4cc5deedf35e 100644 --- a/devtools/shared/webconsole/client.js +++ b/devtools/shared/webconsole/client.js @@ -182,8 +182,6 @@ WebConsoleClient.prototype = { * this.CACHED_MESSAGES for known types. * @param function onResponse * The function invoked when the response is received. - * @return request - * Request object that implements both Promise and EventEmitter interfaces */ getCachedMessages: function (types, onResponse) { let packet = { @@ -191,7 +189,7 @@ WebConsoleClient.prototype = { type: "getCachedMessages", messageTypes: types, }; - return this._client.request(packet, onResponse); + this._client.request(packet, onResponse); }, /** @@ -201,15 +199,13 @@ WebConsoleClient.prototype = { * The WebConsoleObjectActor ID to send the request to. * @param function onResponse * The function invoked when the response is received. - * @return request - * Request object that implements both Promise and EventEmitter interfaces */ inspectObjectProperties: function (actor, onResponse) { let packet = { to: actor, type: "inspectProperties", }; - return this._client.request(packet, onResponse); + this._client.request(packet, onResponse); }, /** @@ -248,8 +244,6 @@ WebConsoleClient.prototype = { * exists. This is used by helper functions that can * reference the currently selected node in the Inspector, * like $0. - * @return request - * Request object that implements both Promise and EventEmitter interfaces */ evaluateJS: function (string, onResponse, options = {}) { let packet = { @@ -262,7 +256,7 @@ WebConsoleClient.prototype = { selectedNodeActor: options.selectedNodeActor, selectedObjectActor: options.selectedObjectActor, }; - return this._client.request(packet, onResponse); + this._client.request(packet, onResponse); }, /** @@ -272,7 +266,8 @@ WebConsoleClient.prototype = { evaluateJSAsync: function (string, onResponse, options = {}) { // Pre-37 servers don't support async evaluation. if (!this.traits.evaluateJSAsync) { - return this.evaluateJS(string, onResponse, options); + this.evaluateJS(string, onResponse, options); + return; } let packet = { @@ -286,23 +281,12 @@ WebConsoleClient.prototype = { selectedObjectActor: options.selectedObjectActor, }; - return new Promise((resolve, reject) => { - this._client.request(packet, response => { - // Null check this in case the client has been detached while waiting - // for a response. - if (this.pendingEvaluationResults) { - this.pendingEvaluationResults.set(response.resultID, resp => { - if (onResponse) { - onResponse(resp); - } - if (resp.error) { - reject(resp); - } else { - resolve(resp); - } - }); - } - }); + this._client.request(packet, response => { + // Null check this in case the client has been detached while waiting + // for a response. + if (this.pendingEvaluationResults) { + this.pendingEvaluationResults.set(response.resultID, onResponse); + } }); }, @@ -342,8 +326,6 @@ WebConsoleClient.prototype = { * The function invoked when the response is received. * @param string frameActor * The id of the frame actor that made the call. - * @return request - * Request object that implements both Promise and EventEmitter interfaces */ autocomplete: function (string, cursor, onResponse, frameActor) { let packet = { @@ -353,21 +335,18 @@ WebConsoleClient.prototype = { cursor: cursor, frameActor: frameActor, }; - return this._client.request(packet, onResponse); + this._client.request(packet, onResponse); }, /** * Clear the cache of messages (page errors and console API calls). - * - * @return request - * Request object that implements both Promise and EventEmitter interfaces */ clearMessagesCache: function () { let packet = { to: this._actor, type: "clearMessagesCache", }; - return this._client.request(packet); + this._client.request(packet); }, /** @@ -377,8 +356,6 @@ WebConsoleClient.prototype = { * An array with the preferences you want to retrieve. * @param function [onResponse] * Optional function to invoke when the response is received. - * @return request - * Request object that implements both Promise and EventEmitter interfaces */ getPreferences: function (preferences, onResponse) { let packet = { @@ -386,7 +363,7 @@ WebConsoleClient.prototype = { type: "getPreferences", preferences: preferences, }; - return this._client.request(packet, onResponse); + this._client.request(packet, onResponse); }, /** @@ -396,8 +373,6 @@ WebConsoleClient.prototype = { * An object with the preferences you want to change. * @param function [onResponse] * Optional function to invoke when the response is received. - * @return request - * Request object that implements both Promise and EventEmitter interfaces */ setPreferences: function (preferences, onResponse) { let packet = { @@ -405,7 +380,7 @@ WebConsoleClient.prototype = { type: "setPreferences", preferences: preferences, }; - return this._client.request(packet, onResponse); + this._client.request(packet, onResponse); }, /** @@ -415,15 +390,13 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. - * @return request - * Request object that implements both Promise and EventEmitter interfaces */ getRequestHeaders: function (actor, onResponse) { let packet = { to: actor, type: "getRequestHeaders", }; - return this._client.request(packet, onResponse); + this._client.request(packet, onResponse); }, /** @@ -433,15 +406,13 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. - * @return request - * Request object that implements both Promise and EventEmitter interfaces */ getRequestCookies: function (actor, onResponse) { let packet = { to: actor, type: "getRequestCookies", }; - return this._client.request(packet, onResponse); + this._client.request(packet, onResponse); }, /** @@ -451,15 +422,13 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. - * @return request - * Request object that implements both Promise and EventEmitter interfaces */ getRequestPostData: function (actor, onResponse) { let packet = { to: actor, type: "getRequestPostData", }; - return this._client.request(packet, onResponse); + this._client.request(packet, onResponse); }, /** @@ -469,15 +438,13 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. - * @return request - * Request object that implements both Promise and EventEmitter interfaces */ getResponseHeaders: function (actor, onResponse) { let packet = { to: actor, type: "getResponseHeaders", }; - return this._client.request(packet, onResponse); + this._client.request(packet, onResponse); }, /** @@ -487,15 +454,13 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. - * @return request - * Request object that implements both Promise and EventEmitter interfaces */ getResponseCookies: function (actor, onResponse) { let packet = { to: actor, type: "getResponseCookies", }; - return this._client.request(packet, onResponse); + this._client.request(packet, onResponse); }, /** @@ -505,15 +470,13 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. - * @return request - * Request object that implements both Promise and EventEmitter interfaces */ getResponseContent: function (actor, onResponse) { let packet = { to: actor, type: "getResponseContent", }; - return this._client.request(packet, onResponse); + this._client.request(packet, onResponse); }, /** @@ -523,15 +486,13 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. - * @return request - * Request object that implements both Promise and EventEmitter interfaces */ getEventTimings: function (actor, onResponse) { let packet = { to: actor, type: "getEventTimings", }; - return this._client.request(packet, onResponse); + this._client.request(packet, onResponse); }, /** @@ -541,15 +502,13 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. - * @return request - * Request object that implements both Promise and EventEmitter interfaces */ getSecurityInfo: function (actor, onResponse) { let packet = { to: actor, type: "getSecurityInfo", }; - return this._client.request(packet, onResponse); + this._client.request(packet, onResponse); }, /** @@ -559,8 +518,6 @@ WebConsoleClient.prototype = { * The details of the HTTP request. * @param function onResponse * The function invoked when the response is received. - * @return request - * Request object that implements both Promise and EventEmitter interfaces */ sendHTTPRequest: function (data, onResponse) { let packet = { @@ -568,7 +525,7 @@ WebConsoleClient.prototype = { type: "sendHTTPRequest", request: data }; - return this._client.request(packet, onResponse); + this._client.request(packet, onResponse); }, /** @@ -580,8 +537,6 @@ WebConsoleClient.prototype = { * known listeners. * @param function onResponse * Function to invoke when the server response is received. - * @return request - * Request object that implements both Promise and EventEmitter interfaces */ startListeners: function (listeners, onResponse) { let packet = { @@ -589,7 +544,7 @@ WebConsoleClient.prototype = { type: "startListeners", listeners: listeners, }; - return this._client.request(packet, onResponse); + this._client.request(packet, onResponse); }, /** @@ -601,8 +556,6 @@ WebConsoleClient.prototype = { * known listeners. * @param function onResponse * Function to invoke when the server response is received. - * @return request - * Request object that implements both Promise and EventEmitter interfaces */ stopListeners: function (listeners, onResponse) { let packet = { @@ -610,7 +563,7 @@ WebConsoleClient.prototype = { type: "stopListeners", listeners: listeners, }; - return this._client.request(packet, onResponse); + this._client.request(packet, onResponse); }, /** diff --git a/devtools/shared/webconsole/test/test_jsterm.html b/devtools/shared/webconsole/test/test_jsterm.html index 5a4d7ae2eb93..b6eefad4b6e4 100644 --- a/devtools/shared/webconsole/test/test_jsterm.html +++ b/devtools/shared/webconsole/test/test_jsterm.html @@ -24,11 +24,13 @@ let {MAX_AUTOCOMPLETE_ATTEMPTS,MAX_AUTOCOMPLETIONS} = require("devtools/shared/w // evaluateJS and once with evaluateJSAsync. let evaluatingSync = true; function evaluateJS(input, options = {}) { - if (evaluatingSync) { - return gState.client.evaluateJS(input, null, options); - } else { - return gState.client.evaluateJSAsync(input, null, options); - } + return new Promise((resolve, reject) => { + if (evaluatingSync) { + gState.client.evaluateJS(input, resolve, options); + } else { + gState.client.evaluateJSAsync(input, resolve, options); + } + }); } function startTest() From 12fc4c9f3dc572e5e72936755cbd69af0f9f6f9a Mon Sep 17 00:00:00 2001 From: Rob Thijssen Date: Thu, 24 Nov 2016 15:38:53 +0000 Subject: [PATCH 12/53] Bug 1320116 - Increase Marionette log level for Windows. r=whimboo MozReview-Commit-ID: ICIkqAElXiq --HG-- extra : rebase_source : 4624a6bf83a85baa6c019a69dbf843c4c8895040 --- testing/mozharness/configs/marionette/test_config.py | 1 + testing/mozharness/configs/marionette/windows_config.py | 1 + .../mozharness/configs/marionette/windows_taskcluster_config.py | 1 + 3 files changed, 3 insertions(+) diff --git a/testing/mozharness/configs/marionette/test_config.py b/testing/mozharness/configs/marionette/test_config.py index 16a6737ad9e9..8ec8d7f44f7f 100644 --- a/testing/mozharness/configs/marionette/test_config.py +++ b/testing/mozharness/configs/marionette/test_config.py @@ -15,6 +15,7 @@ config = { "suite_definitions": { "marionette_desktop": { "options": [ + "-vv", "--log-raw=%(raw_log_file)s", "--log-errorsummary=%(error_summary_file)s", "--binary=%(binary)s", diff --git a/testing/mozharness/configs/marionette/windows_config.py b/testing/mozharness/configs/marionette/windows_config.py index 383d63fd683e..b6e2bb15b9aa 100644 --- a/testing/mozharness/configs/marionette/windows_config.py +++ b/testing/mozharness/configs/marionette/windows_config.py @@ -43,6 +43,7 @@ config = { "suite_definitions": { "marionette_desktop": { "options": [ + "-vv", "--log-raw=%(raw_log_file)s", "--log-errorsummary=%(error_summary_file)s", "--binary=%(binary)s", diff --git a/testing/mozharness/configs/marionette/windows_taskcluster_config.py b/testing/mozharness/configs/marionette/windows_taskcluster_config.py index 3522e26ea1c2..863ab856a53a 100644 --- a/testing/mozharness/configs/marionette/windows_taskcluster_config.py +++ b/testing/mozharness/configs/marionette/windows_taskcluster_config.py @@ -42,6 +42,7 @@ config = { "suite_definitions": { "marionette_desktop": { "options": [ + "-vv", "--log-raw=%(raw_log_file)s", "--log-errorsummary=%(error_summary_file)s", "--binary=%(binary)s", From 29f54d4c4194e444e1e5a4f591eeed8a45e5209a Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 23 Nov 2016 16:35:17 -0600 Subject: [PATCH 13/53] Bug 1319596 - Wait for first historychange when starting RDM. r=ochameau In bug 1310771, the session store process for gathering data from content was changed so that the key "historychange" is used instead of "history". Kept the check for "history" as well, since other places in session store still test for it. In addition, an RDM test is added to verify that a closed RDM tab is restored to the content page with RDM closed. MozReview-Commit-ID: 4wCjINTDUH8 --HG-- extra : rebase_source : 392996c30e0f5ccab049521b20200adce1192236 --- .../client/responsive.html/browser/tunnel.js | 3 +- .../responsive.html/test/browser/browser.ini | 1 + .../test/browser/browser_tab_restore.js | 30 +++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 devtools/client/responsive.html/test/browser/browser_tab_restore.js diff --git a/devtools/client/responsive.html/browser/tunnel.js b/devtools/client/responsive.html/browser/tunnel.js index 8e82d9d27236..f06c716f70ed 100644 --- a/devtools/client/responsive.html/browser/tunnel.js +++ b/devtools/client/responsive.html/browser/tunnel.js @@ -312,7 +312,8 @@ function copyPermanentKey(outer, inner) { // what SessionStore uses to identify each browser. let outerMM = outer[FRAME_LOADER].messageManager; let onHistoryEntry = message => { - let history = message.data.data.history; + let data = message.data.data; + let history = data.history || data.historychange; if (!history || !history.entries) { // Wait for a message that contains history data return; diff --git a/devtools/client/responsive.html/test/browser/browser.ini b/devtools/client/responsive.html/test/browser/browser.ini index d8f4696aa458..7c8c6d8d420d 100644 --- a/devtools/client/responsive.html/test/browser/browser.ini +++ b/devtools/client/responsive.html/test/browser/browser.ini @@ -34,6 +34,7 @@ support-files = [browser_resize_cmd.js] [browser_screenshot_button.js] [browser_tab_close.js] +[browser_tab_restore.js] [browser_tab_remoteness_change.js] [browser_toolbox_computed_view.js] [browser_toolbox_rule_view.js] diff --git a/devtools/client/responsive.html/test/browser/browser_tab_restore.js b/devtools/client/responsive.html/test/browser/browser_tab_restore.js new file mode 100644 index 000000000000..3214fee364b5 --- /dev/null +++ b/devtools/client/responsive.html/test/browser/browser_tab_restore.js @@ -0,0 +1,30 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +// Verify RDM tab reopens to content (with RDM closed) when restoring the tab. + +const TEST_URL = "http://example.com/"; + +const ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore); +const { TabStateFlusher } = Cu.import("resource:///modules/sessionstore/TabStateFlusher.jsm", {}); + +add_task(function* () { + // Open tab, start RDM, close tab + let tab = yield addTab(TEST_URL); + // Ensure tab state is flushed to session store before closing (so it can be restored) + yield TabStateFlusher.flush(tab.linkedBrowser); + let { ui } = yield openRDM(tab); + yield removeTab(tab); + is(ui.destroyed, true, "RDM closed"); + + // Restore tab + tab = ss.undoCloseTab(window, 0); + yield once(tab, "SSTabRestored"); + + // Check location + is(tab.linkedBrowser.documentURI.spec, TEST_URL, "Restored tab location to test page"); + + yield removeTab(tab); +}); From cd4defd11c25641e50eae13417ead697ff024c36 Mon Sep 17 00:00:00 2001 From: Nicolas Chevobbe Date: Thu, 24 Nov 2016 19:48:55 +0100 Subject: [PATCH 14/53] Bug 1320173 - Generate stubs in order to make mocha tests pass. r=nchevobbe MozReview-Commit-ID: IVQ7xTAV5kE --HG-- extra : rebase_source : 8256067cc3bb488ce12fc5df46b5d82ee1b9e7cb --- .../test/fixtures/stubs/evaluationResult.js | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/evaluationResult.js b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/evaluationResult.js index 8dd94671a11a..9973e8ca808d 100644 --- a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/evaluationResult.js +++ b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/evaluationResult.js @@ -52,9 +52,13 @@ stubPreparedMessages.set("asdf()", new ConsoleMessage({ "type": "undefined" }, "repeat": 1, - "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"javascript\",\"timeStamp\":1479159921377,\"type\":\"result\",\"level\":\"error\",\"messageText\":\"ReferenceError: asdf is not defined\",\"parameters\":{\"type\":\"undefined\"},\"repeatId\":null,\"stacktrace\":null,\"frame\":null,\"groupId\":null,\"exceptionDocURL\":\"https://developer.mozilla.org/docs/Web/JavaScript/Reference/Errors/Not_defined?utm_source=mozilla&utm_medium=firefox-console-errors&utm_campaign=default\",\"userProvidedStyles\":null}", + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"javascript\",\"timeStamp\":1479159921377,\"type\":\"result\",\"level\":\"error\",\"messageText\":\"ReferenceError: asdf is not defined\",\"parameters\":{\"type\":\"undefined\"},\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"debugger eval code\",\"line\":1,\"column\":1},\"groupId\":null,\"exceptionDocURL\":\"https://developer.mozilla.org/docs/Web/JavaScript/Reference/Errors/Not_defined?utm_source=mozilla&utm_medium=firefox-console-errors&utm_campaign=default\",\"userProvidedStyles\":null}", "stacktrace": null, - "frame": null, + "frame": { + "source": "debugger eval code", + "line": 1, + "column": 1 + }, "groupId": null, "exceptionDocURL": "https://developer.mozilla.org/docs/Web/JavaScript/Reference/Errors/Not_defined?utm_source=mozilla&utm_medium=firefox-console-errors&utm_campaign=default", "userProvidedStyles": null @@ -72,9 +76,13 @@ stubPreparedMessages.set("1 + @", new ConsoleMessage({ "type": "undefined" }, "repeat": 1, - "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"javascript\",\"timeStamp\":1479159921399,\"type\":\"result\",\"level\":\"error\",\"messageText\":\"SyntaxError: illegal character\",\"parameters\":{\"type\":\"undefined\"},\"repeatId\":null,\"stacktrace\":null,\"frame\":null,\"groupId\":null,\"userProvidedStyles\":null}", + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"javascript\",\"timeStamp\":1479159921399,\"type\":\"result\",\"level\":\"error\",\"messageText\":\"SyntaxError: illegal character\",\"parameters\":{\"type\":\"undefined\"},\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"debugger eval code\",\"line\":1,\"column\":4},\"groupId\":null,\"userProvidedStyles\":null}", "stacktrace": null, - "frame": null, + "frame": { + "source": "debugger eval code", + "line": 1, + "column": 4 + }, "groupId": null, "userProvidedStyles": null })); @@ -128,7 +136,11 @@ stubPackets.set("asdf()", { }, "exceptionMessage": "ReferenceError: asdf is not defined", "exceptionDocURL": "https://developer.mozilla.org/docs/Web/JavaScript/Reference/Errors/Not_defined?utm_source=mozilla&utm_medium=firefox-console-errors&utm_campaign=default", - "frame": null, + "frame": { + "source": "debugger eval code", + "line": 1, + "column": 1 + }, "helperResult": null }); @@ -158,7 +170,11 @@ stubPackets.set("1 + @", { } }, "exceptionMessage": "SyntaxError: illegal character", - "frame": null, + "frame": { + "source": "debugger eval code", + "line": 1, + "column": 4 + }, "helperResult": null }); From ce8909d3fbfeb1dd3b949d811997df1360a6075d Mon Sep 17 00:00:00 2001 From: Kit Cambridge Date: Tue, 22 Nov 2016 12:34:02 -0700 Subject: [PATCH 15/53] Bug 1173359 - Convert the history tracker tests to use async functions. r=markh MozReview-Commit-ID: CFNLQkRa7Qb --HG-- extra : rebase_source : 086dbe074f6979428e826aa1faa7ab75100a0dad --- .../sync/tests/unit/test_history_tracker.js | 249 ++++++++++-------- 1 file changed, 132 insertions(+), 117 deletions(-) diff --git a/services/sync/tests/unit/test_history_tracker.js b/services/sync/tests/unit/test_history_tracker.js index 5ed022fb0a2b..209a81499129 100644 --- a/services/sync/tests/unit/test_history_tracker.js +++ b/services/sync/tests/unit/test_history_tracker.js @@ -9,17 +9,6 @@ Cu.import("resource://services-sync/engines/history.js"); Cu.import("resource://services-sync/service.js"); Cu.import("resource://services-sync/util.js"); -function onScoreUpdated(callback) { - Svc.Obs.add("weave:engine:score:updated", function observer() { - Svc.Obs.remove("weave:engine:score:updated", observer); - try { - callback(); - } catch (ex) { - do_throw(ex); - } - }); -} - Service.engineManager.clear(); Service.engineManager.register(HistoryEngine); var engine = Service.engineManager.get("history"); @@ -28,37 +17,17 @@ var tracker = engine._tracker; // Don't write out by default. tracker.persistChangedIDs = false; -var _counter = 0; -function addVisit() { - let uriString = "http://getfirefox.com/" + _counter++; +async function addVisit(suffix) { + let uriString = "http://getfirefox.com/" + suffix; let uri = Utils.makeURI(uriString); _("Adding visit for URI " + uriString); - let place = { - uri: uri, - visits: [ { - visitDate: Date.now() * 1000, - transitionType: PlacesUtils.history.TRANSITION_LINK - } ] - }; - let cb = Async.makeSpinningCallback(); - PlacesUtils.asyncHistory.updatePlaces(place, { - handleError: function () { - _("Error adding visit for " + uriString); - cb(new Error("Error adding history entry")); - }, - - handleResult: function () { - }, - - handleCompletion: function () { - _("Added visit for " + uriString); - cb(); - } + await PlacesTestUtils.addVisits({ + uri, + visitDate: Date.now() * 1000, + transition: PlacesUtils.history.TRANSITION_LINK, }); - // Spin the event loop to embed this async call in a sync API. - cb.wait(); return uri; } @@ -68,99 +37,145 @@ function run_test() { run_next_test(); } -add_test(function test_empty() { +async function verifyTrackerEmpty() { + let changes = engine.pullNewChanges(); + equal(changes.count(), 0); + equal(tracker.score, 0); +} + +async function verifyTrackedCount(expected) { + let changes = engine.pullNewChanges(); + equal(changes.count(), expected); +} + +async function verifyTrackedItems(tracked) { + let changes = engine.pullNewChanges(); + let trackedIDs = new Set(changes.ids()); + for (let guid of tracked) { + ok(changes.has(guid), `${guid} should be tracked`); + ok(changes.getModifiedTimestamp(guid) > 0, + `${guid} should have a modified time`); + trackedIDs.delete(guid); + } + equal(trackedIDs.size, 0, `Unhandled tracked IDs: ${ + JSON.stringify(Array.from(trackedIDs))}`); +} + +async function startTracking() { + Svc.Obs.notify("weave:engine:start-tracking"); +} + +async function stopTracking() { + Svc.Obs.notify("weave:engine:stop-tracking"); +} + +async function resetTracker() { + tracker.clearChangedIDs(); + tracker.resetScore(); +} + +async function cleanup() { + await PlacesTestUtils.clearHistory(); + await resetTracker(); + await stopTracking(); +} + +add_task(async function test_empty() { _("Verify we've got an empty, disabled tracker to work with."); - do_check_empty(tracker.changedIDs); - do_check_eq(tracker.score, 0); + await verifyTrackerEmpty(); do_check_false(tracker._isTracking); - run_next_test(); + + await cleanup(); }); -add_test(function test_not_tracking(next) { +add_task(async function test_not_tracking() { _("Create history item. Won't show because we haven't started tracking yet"); - addVisit(); - Utils.nextTick(function() { - do_check_empty(tracker.changedIDs); - do_check_eq(tracker.score, 0); - run_next_test(); - }); + await addVisit("not_tracking"); + await verifyTrackerEmpty(); + + await cleanup(); }); -add_test(function test_start_tracking() { +add_task(async function test_start_tracking() { _("Add hook for save completion."); - tracker.persistChangedIDs = true; - tracker.onSavedChangedIDs = function () { - _("changedIDs written to disk. Proceeding."); - // Turn this back off. - tracker.persistChangedIDs = false; - delete tracker.onSavedChangedIDs; - run_next_test(); - }; + let savePromise = new Promise(resolve => { + tracker.persistChangedIDs = true; + tracker.onSavedChangedIDs = function () { + // Turn this back off. + tracker.persistChangedIDs = false; + delete tracker.onSavedChangedIDs; + resolve(); + }; + }); _("Tell the tracker to start tracking changes."); - onScoreUpdated(function() { - _("Score updated in test_start_tracking."); - do_check_attribute_count(tracker.changedIDs, 1); - do_check_eq(tracker.score, SCORE_INCREMENT_SMALL); - }); + await startTracking(); + let scorePromise = promiseOneObserver("weave:engine:score:updated"); + await addVisit("start_tracking"); + await scorePromise; - Svc.Obs.notify("weave:engine:start-tracking"); - addVisit(); + _("Score updated in test_start_tracking."); + await verifyTrackedCount(1); + do_check_eq(tracker.score, SCORE_INCREMENT_SMALL); + + await savePromise; + + _("changedIDs written to disk. Proceeding."); + await cleanup(); }); -add_test(function test_start_tracking_twice() { - _("Verifying preconditions from test_start_tracking."); - do_check_attribute_count(tracker.changedIDs, 1); +add_task(async function test_start_tracking_twice() { + _("Verifying preconditions."); + await startTracking(); + await addVisit("start_tracking_twice1"); + await verifyTrackedCount(1); do_check_eq(tracker.score, SCORE_INCREMENT_SMALL); _("Notifying twice won't do any harm."); - onScoreUpdated(function() { - _("Score updated in test_start_tracking_twice."); - do_check_attribute_count(tracker.changedIDs, 2); - do_check_eq(tracker.score, 2 * SCORE_INCREMENT_SMALL); - run_next_test(); - }); + await startTracking(); + let scorePromise = promiseOneObserver("weave:engine:score:updated"); + await addVisit("start_tracking_twice2"); + await scorePromise; - Svc.Obs.notify("weave:engine:start-tracking"); - addVisit(); + _("Score updated in test_start_tracking_twice."); + await verifyTrackedCount(2); + do_check_eq(tracker.score, 2 * SCORE_INCREMENT_SMALL); + + await cleanup(); }); -add_test(function test_track_delete() { +add_task(async function test_track_delete() { _("Deletions are tracked."); // This isn't present because we weren't tracking when it was visited. - let uri = Utils.makeURI("http://getfirefox.com/0"); + await addVisit("track_delete"); + let uri = Utils.makeURI("http://getfirefox.com/track_delete"); let guid = engine._store.GUIDForUri(uri); - do_check_false(guid in tracker.changedIDs); + await verifyTrackerEmpty(); - onScoreUpdated(function() { - do_check_true(guid in tracker.changedIDs); - do_check_attribute_count(tracker.changedIDs, 3); - do_check_eq(tracker.score, SCORE_INCREMENT_XLARGE + 2 * SCORE_INCREMENT_SMALL); - run_next_test(); - }); - - do_check_eq(tracker.score, 2 * SCORE_INCREMENT_SMALL); + await startTracking(); + let scorePromise = promiseOneObserver("weave:engine:score:updated"); PlacesUtils.history.removePage(uri); + await scorePromise; + + await verifyTrackedItems([guid]); + do_check_eq(tracker.score, SCORE_INCREMENT_XLARGE); + + await cleanup(); }); -add_test(function test_dont_track_expiration() { +add_task(async function test_dont_track_expiration() { _("Expirations are not tracked."); - let uriToExpire = addVisit(); + let uriToExpire = await addVisit("to_expire"); let guidToExpire = engine._store.GUIDForUri(uriToExpire); - let uriToRemove = addVisit(); + let uriToRemove = await addVisit("to_remove"); let guidToRemove = engine._store.GUIDForUri(uriToRemove); - tracker.clearChangedIDs(); - do_check_false(guidToExpire in tracker.changedIDs); - do_check_false(guidToRemove in tracker.changedIDs); + await resetTracker(); + await verifyTrackerEmpty(); - onScoreUpdated(function() { - do_check_false(guidToExpire in tracker.changedIDs); - do_check_true(guidToRemove in tracker.changedIDs); - do_check_attribute_count(tracker.changedIDs, 1); - run_next_test(); - }); + await startTracking(); + let scorePromise = promiseOneObserver("weave:engine:score:updated"); // Observe expiration. Services.obs.addObserver(function onExpiration(aSubject, aTopic, aData) { @@ -174,30 +189,30 @@ add_test(function test_dont_track_expiration() { Cc["@mozilla.org/places/expiration;1"] .getService(Ci.nsIObserver) .observe(null, "places-debug-start-expiration", 1); + + await scorePromise; + await verifyTrackedItems([guidToRemove]); + + await cleanup(); }); -add_test(function test_stop_tracking() { +add_task(async function test_stop_tracking() { _("Let's stop tracking again."); - tracker.clearChangedIDs(); - Svc.Obs.notify("weave:engine:stop-tracking"); - addVisit(); - Utils.nextTick(function() { - do_check_empty(tracker.changedIDs); - run_next_test(); - }); + await stopTracking(); + await addVisit("stop_tracking"); + await verifyTrackerEmpty(); + + await cleanup(); }); -add_test(function test_stop_tracking_twice() { +add_task(async function test_stop_tracking_twice() { + await stopTracking(); + await addVisit("stop_tracking_twice1"); + _("Notifying twice won't do any harm."); - Svc.Obs.notify("weave:engine:stop-tracking"); - addVisit(); - Utils.nextTick(function() { - do_check_empty(tracker.changedIDs); - run_next_test(); - }); -}); + await stopTracking(); + await addVisit("stop_tracking_twice2"); + await verifyTrackerEmpty(); -add_test(function cleanup() { - _("Clean up."); - PlacesTestUtils.clearHistory().then(run_next_test); + await cleanup(); }); From 73fba410f4eaf365e3d59de4fc64747b55d194b5 Mon Sep 17 00:00:00 2001 From: Kit Cambridge Date: Tue, 22 Nov 2016 12:52:09 -0700 Subject: [PATCH 16/53] Bug 1173359 - Exclude hidden pages and framed links from syncing. r=markh MozReview-Commit-ID: 8I4Sulyr0H7 --HG-- extra : rebase_source : 55fb1ff567c0a2916bc0153a09c41b03d396cfeb --- services/sync/modules/constants.js | 2 + services/sync/modules/engines.js | 26 +++++--- services/sync/modules/engines/history.js | 64 +++++++++++++++++-- .../sync/tests/unit/test_history_tracker.js | 37 ++++++++++- 4 files changed, 110 insertions(+), 19 deletions(-) diff --git a/services/sync/modules/constants.js b/services/sync/modules/constants.js index f70bbd61c18b..2dac53a844ab 100644 --- a/services/sync/modules/constants.js +++ b/services/sync/modules/constants.js @@ -192,6 +192,8 @@ MIN_PASS_LENGTH: 8, DEVICE_TYPE_DESKTOP: "desktop", DEVICE_TYPE_MOBILE: "mobile", +SQLITE_MAX_VARIABLE_NUMBER: 999, + })) { this[key] = val; this.EXPORTED_SYMBOLS.push(key); diff --git a/services/sync/modules/engines.js b/services/sync/modules/engines.js index 8bc0e7bbfec5..2d88078b75b7 100644 --- a/services/sync/modules/engines.js +++ b/services/sync/modules/engines.js @@ -161,19 +161,25 @@ Tracker.prototype = { return true; }, - removeChangedID: function (id) { - if (!id) { - this._log.warn("Attempted to remove undefined ID to tracker"); + removeChangedID: function (...ids) { + if (!ids.length || this.ignoreAll) { return false; } - if (this.ignoreAll || this._ignored.includes(id)) { - return false; - } - if (this.changedIDs[id] != null) { - this._log.trace("Removing changed ID " + id); - delete this.changedIDs[id]; - this.saveChangedIDs(); + for (let id of ids) { + if (!id) { + this._log.warn("Attempted to remove undefined ID from tracker"); + continue; + } + if (this._ignored.includes(id)) { + this._log.debug(`Not removing ignored ID ${id} from tracker`); + continue; + } + if (this.changedIDs[id] != null) { + this._log.trace("Removing changed ID " + id); + delete this.changedIDs[id]; + } } + this.saveChangedIDs(); return true; }, diff --git a/services/sync/modules/engines/history.js b/services/sync/modules/engines/history.js index 6492a56ec687..0fa479113e90 100644 --- a/services/sync/modules/engines/history.js +++ b/services/sync/modules/engines/history.js @@ -64,6 +64,50 @@ HistoryEngine.prototype = { notifyHistoryObservers("onEndUpdateBatch"); } }, + + pullNewChanges() { + let modifiedGUIDs = Object.keys(this._tracker.changedIDs); + if (!modifiedGUIDs.length) { + return new Changeset(); + } + + let db = PlacesUtils.history.QueryInterface(Ci.nsPIPlacesDatabase) + .DBConnection; + + // Filter out hidden pages and `TRANSITION_FRAMED_LINK` visits. These are + // excluded when rendering the history menu, so we use the same constraints + // for Sync. We also don't want to sync `TRANSITION_EMBED` visits, but those + // aren't stored in the database. + for (let startIndex = 0; + startIndex < modifiedGUIDs.length; + startIndex += SQLITE_MAX_VARIABLE_NUMBER) { + + let chunkLength = Math.min(SQLITE_MAX_VARIABLE_NUMBER, + modifiedGUIDs.length - startIndex); + + let query = ` + SELECT DISTINCT p.guid FROM moz_places p + JOIN moz_historyvisits v ON p.id = v.place_id + WHERE p.guid IN (${new Array(chunkLength).fill("?").join(",")}) AND + (p.hidden = 1 OR v.visit_type IN (0, + ${PlacesUtils.history.TRANSITION_FRAMED_LINK})) + `; + + let statement = db.createAsyncStatement(query); + try { + for (let i = 0; i < chunkLength; i++) { + statement.bindByIndex(i, modifiedGUIDs[startIndex + i]); + } + let results = Async.querySpinningly(statement, ["guid"]); + let guids = results.map(result => result.guid); + this._tracker.removeChangedID(...guids); + } finally { + statement.finalize(); + } + } + + return new Changeset(this._tracker.changedIDs); + }, }; function HistoryStore(name, engine) { @@ -72,7 +116,7 @@ function HistoryStore(name, engine) { // Explicitly nullify our references to our cached services so we don't leak Svc.Obs.add("places-shutdown", function() { for (let query in this._stmts) { - let stmt = this._stmts; + let stmt = this._stmts[query]; stmt.finalize(); } this._stmts = {}; @@ -165,12 +209,18 @@ HistoryStore.prototype = { _urlCols: ["url", "title", "frecency"], get _allUrlStm() { - return this._getStmt( - "SELECT url " + - "FROM moz_places " + - "WHERE last_visit_date > :cutoff_date " + - "ORDER BY frecency DESC " + - "LIMIT :max_results"); + // Filter out hidden pages and framed link visits. See `pullNewChanges` + // for more info. + return this._getStmt(` + SELECT DISTINCT p.url + FROM moz_places p + JOIN moz_historyvisits v ON p.id = v.place_id + WHERE p.last_visit_date > :cutoff_date AND + p.hidden = 0 AND + v.visit_type NOT IN (0, + ${PlacesUtils.history.TRANSITION_FRAMED_LINK}) + ORDER BY frecency DESC + LIMIT :max_results`); }, _allUrlCols: ["url"], diff --git a/services/sync/tests/unit/test_history_tracker.js b/services/sync/tests/unit/test_history_tracker.js index 209a81499129..1f8a48a297d1 100644 --- a/services/sync/tests/unit/test_history_tracker.js +++ b/services/sync/tests/unit/test_history_tracker.js @@ -1,6 +1,7 @@ /* Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/ */ +Cu.import("resource://gre/modules/PlacesDBUtils.jsm"); Cu.import("resource://gre/modules/PlacesUtils.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://services-sync/engines.js"); @@ -17,7 +18,7 @@ var tracker = engine._tracker; // Don't write out by default. tracker.persistChangedIDs = false; -async function addVisit(suffix) { +async function addVisit(suffix, referrer = null, transition = PlacesUtils.history.TRANSITION_LINK) { let uriString = "http://getfirefox.com/" + suffix; let uri = Utils.makeURI(uriString); _("Adding visit for URI " + uriString); @@ -25,7 +26,8 @@ async function addVisit(suffix) { await PlacesTestUtils.addVisits({ uri, visitDate: Date.now() * 1000, - transition: PlacesUtils.history.TRANSITION_LINK, + transition, + referrer, }); return uri; @@ -216,3 +218,34 @@ add_task(async function test_stop_tracking_twice() { await cleanup(); }); + +add_task(async function test_filter_hidden() { + await startTracking(); + + _("Add visit; should be hidden by the redirect"); + let hiddenURI = await addVisit("hidden"); + let hiddenGUID = engine._store.GUIDForUri(hiddenURI); + _(`Hidden visit GUID: ${hiddenGUID}`); + + _("Add redirect visit; should be tracked"); + let trackedURI = await addVisit("redirect", hiddenURI, + PlacesUtils.history.TRANSITION_REDIRECT_PERMANENT); + let trackedGUID = engine._store.GUIDForUri(trackedURI); + _(`Tracked visit GUID: ${trackedGUID}`); + + _("Add visit for framed link; should be ignored"); + let embedURI = await addVisit("framed_link", null, + PlacesUtils.history.TRANSITION_FRAMED_LINK); + let embedGUID = engine._store.GUIDForUri(embedURI); + _(`Framed link visit GUID: ${embedGUID}`); + + _("Run Places maintenance to mark redirect visit as hidden"); + let maintenanceFinishedPromise = + promiseOneObserver("places-maintenance-finished"); + PlacesDBUtils.maintenanceOnIdle(); + await maintenanceFinishedPromise; + + await verifyTrackedItems([trackedGUID]); + + await cleanup(); +}); From 5ce06744be37217b05c329b6428cfef8148cc0d0 Mon Sep 17 00:00:00 2001 From: Karl Tomlinson Date: Tue, 21 Jun 2016 19:07:45 +1200 Subject: [PATCH 17/53] bug 1319957 don't realize widgets for their style r=stransky+263117 This was needed in GTK2 to get the style of the widget, but styles are almost independent of widgets with GTK3, where realizing is not necessary to get the style context. MozReview-Commit-ID: GtL2FLDl9uA --HG-- extra : rebase_source : 926e6b7fee9a15fe5c86be7327c60b146db11316 --- widget/gtk/WidgetStyleCache.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/widget/gtk/WidgetStyleCache.cpp b/widget/gtk/WidgetStyleCache.cpp index f056e63c549f..b1c4d928569e 100644 --- a/widget/gtk/WidgetStyleCache.cpp +++ b/widget/gtk/WidgetStyleCache.cpp @@ -33,7 +33,6 @@ static GtkWidget* CreateWindowWidget() { GtkWidget *widget = gtk_window_new(GTK_WINDOW_POPUP); - gtk_widget_realize(widget); gtk_widget_set_name(widget, "MozillaGtkWidget"); return widget; } @@ -50,7 +49,6 @@ static void AddToWindowContainer(GtkWidget* widget) { gtk_container_add(GTK_CONTAINER(GetWidget(MOZ_GTK_WINDOW_CONTAINER)), widget); - gtk_widget_realize(widget); } static GtkWidget* @@ -142,7 +140,6 @@ CreateToolbarWidget() { GtkWidget* widget = gtk_toolbar_new(); gtk_container_add(GTK_CONTAINER(GetWidget(MOZ_GTK_GRIPPER)), widget); - gtk_widget_realize(widget); return widget; } @@ -183,7 +180,6 @@ CreateButtonArrowWidget() { GtkWidget* widget = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_OUT); gtk_container_add(GTK_CONTAINER(GetWidget(MOZ_GTK_TOGGLE_BUTTON)), widget); - gtk_widget_realize(widget); gtk_widget_show(widget); return widget; } @@ -226,8 +222,6 @@ GetInnerWidget(GtkWidget* widget, gpointer client_data) if (G_TYPE_CHECK_INSTANCE_TYPE(widget, info->type)) { *info->widget = widget; } - - gtk_widget_realize(widget); } static GtkWidget* @@ -287,7 +281,6 @@ CreateComboBoxArrowWidget() /* appears-as-list = TRUE, or cell-view = FALSE; * the button only contains an arrow */ comboBoxArrow = buttonChild; - gtk_widget_realize(comboBoxArrow); } if (!comboBoxArrow) { @@ -416,7 +409,6 @@ CreateComboBoxEntryArrowWidget() /* appears-as-list = TRUE, or cell-view = FALSE; * the button only contains an arrow */ comboBoxArrow = buttonChild; - gtk_widget_realize(comboBoxArrow); } if (!comboBoxArrow) { @@ -456,7 +448,6 @@ CreateMenuSeparatorWidget() GtkWidget* widget = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(GetWidget(MOZ_GTK_MENUPOPUP)), widget); - gtk_widget_realize(widget); return widget; } From 0b6595c946f098d76361b9f9a0e5341b71f638e3 Mon Sep 17 00:00:00 2001 From: Andreas Tolfsen Date: Tue, 1 Nov 2016 16:53:51 +0000 Subject: [PATCH 18/53] Bug 1103196 - Add HTTPS fixture server for Marionette; r=automatedtester,maja_zf,whimboo This patch makes testing/marionette/harness/marionette/runner/httpd.py capable of spinning up an HTTPS server with self-signed certificate. It also introduces testing/marionette/harness/marionette/runner/serve.py that is capable of managing the HTTP- and HTTPS fixture servers as subprocesses, allowing them to operate independently. serve.py uses inter-process communication based on channels (from `multiprocessing.Pipe`) to query methods on the httpd served in each process, which is used to get absolute URLs from the main process. This is useful as servers can delegate port allocation to the system socket service by atomically binding to port 0, guaranteeing that the chosen port is uncontested. It is also used to perform synchronous and graceful shutdown of the httpd. MozReview-Commit-ID: 9OlW6F1w0AN --HG-- extra : rebase_source : 3d791a6c44a23be72704f37c07cb437f309cdcef --- testing/marionette/harness/MANIFEST.in | 2 + .../marionette/marionette_test/testcases.py | 23 +- .../harness/marionette/runner/base.py | 108 ++++----- .../harness/marionette/runner/httpd.py | 172 ++++++++----- .../harness/marionette/runner/serve.py | 226 ++++++++++++++++++ .../harness/marionette/runner/test.cert | 86 +++++++ .../harness/marionette/runner/test.key | 28 +++ .../tests/harness_unit/test_httpd.py | 89 +++++++ .../harness_unit/test_marionette_runner.py | 4 +- .../tests/harness_unit/test_serve.py | 67 ++++++ .../marionette/tests/unit/test_httpd.py | 32 --- .../marionette/tests/unit/unit-tests.ini | 1 - testing/marionette/harness/requirements.txt | 15 +- 13 files changed, 678 insertions(+), 175 deletions(-) mode change 100644 => 100755 testing/marionette/harness/marionette/runner/httpd.py create mode 100755 testing/marionette/harness/marionette/runner/serve.py create mode 100644 testing/marionette/harness/marionette/runner/test.cert create mode 100644 testing/marionette/harness/marionette/runner/test.key create mode 100644 testing/marionette/harness/marionette/tests/harness_unit/test_httpd.py create mode 100644 testing/marionette/harness/marionette/tests/harness_unit/test_serve.py delete mode 100644 testing/marionette/harness/marionette/tests/unit/test_httpd.py diff --git a/testing/marionette/harness/MANIFEST.in b/testing/marionette/harness/MANIFEST.in index 7dc49db874f9..dfaa3afa78c7 100644 --- a/testing/marionette/harness/MANIFEST.in +++ b/testing/marionette/harness/MANIFEST.in @@ -4,3 +4,5 @@ recursive-include marionette/chrome * recursive-include marionette/runner/mixins/resources * exclude MANIFEST.in include requirements.txt +include marionette/runner/test.cert +include marionette/runner/test.key diff --git a/testing/marionette/harness/marionette/marionette_test/testcases.py b/testing/marionette/harness/marionette/marionette_test/testcases.py index f83f02245e77..e3b569814f4c 100644 --- a/testing/marionette/harness/marionette/marionette_test/testcases.py +++ b/testing/marionette/harness/marionette/marionette_test/testcases.py @@ -74,8 +74,12 @@ class CommonTestCase(unittest.TestCase): failureException = AssertionError pydebugger = None - def __init__(self, methodName, **kwargs): + def __init__(self, methodName, marionette_weakref, fixtures, **kwargs): super(CommonTestCase, self).__init__(methodName) + self.methodName = methodName + + self._marionette_weakref = marionette_weakref + self.fixtures = fixtures self.loglines = [] self.duration = 0 @@ -225,7 +229,7 @@ class CommonTestCase(unittest.TestCase): @classmethod def add_tests_to_suite(cls, mod_name, filepath, suite, testloader, marionette, - httpd, testvars): + fixtures, testvars, **kwargs): """Add all the tests in the specified file to the specified suite.""" raise NotImplementedError @@ -252,7 +256,6 @@ class CommonTestCase(unittest.TestCase): # proper garbage collection. self.start_time = time.time() self.marionette = self._marionette_weakref() - self.httpd = self._httpd_weakref() if self.marionette.session is None: self.marionette.start_session() self.marionette.timeout.reset() @@ -421,21 +424,17 @@ class MarionetteTestCase(CommonTestCase): match_re = re.compile(r"test_(.*)\.py$") - def __init__(self, marionette_weakref, httpd_weakref, methodName='runTest', + def __init__(self, marionette_weakref, fixtures, methodName='runTest', filepath='', **kwargs): - self._marionette_weakref = marionette_weakref - self._httpd_weakref = httpd_weakref - self.methodName = methodName self.filepath = filepath self.testvars = kwargs.pop('testvars', None) - self.marionette = None - - super(MarionetteTestCase, self).__init__(methodName, **kwargs) + super(MarionetteTestCase, self).__init__( + methodName, marionette_weakref=marionette_weakref, fixtures=fixtures, **kwargs) @classmethod def add_tests_to_suite(cls, mod_name, filepath, suite, testloader, marionette, - httpd, testvars, **kwargs): + fixtures, testvars, **kwargs): # since we use imp.load_source to load test modules, if a module # is loaded with the same name as another one the module would just be # reloaded. @@ -459,7 +458,7 @@ class MarionetteTestCase(CommonTestCase): testnames = testloader.getTestCaseNames(obj) for testname in testnames: suite.addTest(obj(weakref.ref(marionette), - weakref.ref(httpd), + fixtures, methodName=testname, filepath=filepath, testvars=testvars, diff --git a/testing/marionette/harness/marionette/runner/base.py b/testing/marionette/harness/marionette/runner/base.py index 3ece3e1691b1..4cabfed58dce 100644 --- a/testing/marionette/harness/marionette/runner/base.py +++ b/testing/marionette/harness/marionette/runner/base.py @@ -2,12 +2,7 @@ # 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/. -from argparse import ArgumentParser - -from copy import deepcopy import json -import mozinfo -import moznetwork import os import random import re @@ -16,19 +11,20 @@ import sys import time import traceback import unittest -import warnings +from argparse import ArgumentParser +from copy import deepcopy + +import mozinfo import mozprofile +from marionette_driver.marionette import Marionette - +import mozversion +import serve from manifestparser import TestManifest from manifestparser.filters import tags -from marionette_driver.marionette import Marionette -from moztest.adapters.unit import StructuredTestRunner, StructuredTestResult -from moztest.results import TestResultCollection, TestResult, relevant_line -import mozversion - -import httpd - +from moztest.adapters.unit import StructuredTestResult, StructuredTestRunner +from moztest.results import TestResult, TestResultCollection, relevant_line +from serve import iter_proc, iter_url here = os.path.abspath(os.path.dirname(__file__)) @@ -489,6 +485,11 @@ class RemoteMarionetteArguments(object): ] +class Fixtures(object): + def where_is(self, uri, on="http"): + return serve.where_is(uri, on) + + class BaseMarionetteTestRunner(object): textrunnerclass = MarionetteTextTestRunner @@ -506,6 +507,8 @@ class BaseMarionetteTestRunner(object): socket_timeout=BaseMarionetteArguments.socket_timeout_default, startup_timeout=None, addons=None, workspace=None, verbose=0, e10s=True, emulator=False, **kwargs): + self.fixture_servers = {} + self.fixtures = Fixtures() self.extra_kwargs = kwargs self.test_kwargs = deepcopy(kwargs) self.address = address @@ -516,7 +519,6 @@ class BaseMarionetteTestRunner(object): self.profile = profile self.addons = addons self.logger = logger - self.httpd = None self.marionette = None self.logdir = logdir self.repeat = repeat @@ -669,7 +671,6 @@ class BaseMarionetteTestRunner(object): @bin.setter def bin(self, path): """Set binary and reset parts of runner accordingly. - Intended use: to change binary between calls to run_tests """ self._bin = path @@ -761,30 +762,6 @@ class BaseMarionetteTestRunner(object): assert len(self.test_handlers) > 0 self.reset_test_stats() - def _start_marionette(self): - need_external_ip = True - if not self.marionette: - self.marionette = self.driverclass(**self._build_kwargs()) - # if we're working against a desktop version, we usually don't need - # an external ip - if self.appName != 'fennec': - need_external_ip = False - self.logger.info('Initial Profile Destination is ' - '"{}"'.format(self.marionette.profile_path)) - return need_external_ip - - def _set_baseurl(self, need_external_ip): - # Gaia sets server_root and that means we shouldn't spin up our own httpd - if not self.httpd: - if self.server_root is None or os.path.isdir(self.server_root): - self.logger.info("starting httpd") - self.start_httpd(need_external_ip) - self.marionette.baseurl = self.httpd.get_url() - self.logger.info("running httpd on {}".format(self.marionette.baseurl)) - else: - self.marionette.baseurl = self.server_root - self.logger.info("using remote content from {}".format(self.marionette.baseurl)) - def _add_tests(self, tests): for test in tests: self.add_test(test) @@ -813,8 +790,19 @@ class BaseMarionetteTestRunner(object): start_time = time.time() self._initialize_test_run(tests) - need_external_ip = self._start_marionette() - self._set_baseurl(need_external_ip) + if self.marionette is None: + self.marionette = self.driverclass(**self._build_kwargs()) + self.logger.info("Profile path is %s" % self.marionette.profile_path) + + if len(self.fixture_servers) == 0 or \ + any(not server.is_alive for _, server in self.fixture_servers): + self.logger.info("Starting fixture servers") + self.fixture_servers = self.start_fixture_servers() + for url in iter_url(self.fixture_servers): + self.logger.info("Fixture server listening on %s" % url) + + # backwards compatibility + self.marionette.baseurl = serve.where_is("/") self._add_tests(tests) @@ -823,14 +811,17 @@ class BaseMarionetteTestRunner(object): try: device_info = self.marionette.instance.runner.device.dm.getInfo() except Exception: - self.logger.warning('Could not get device info.') + self.logger.warning('Could not get device info', exc_info=True) # TODO: Get version_info in Fennec case version_info = None if self.bin: version_info = mozversion.get_version(binary=self.bin) - self.logger.info("running with e10s: {}".format(self.e10s)) + if self.e10s: + self.logger.info("e10s is enabled") + else: + self.logger.info("e10s is disabled") self.logger.suite_start(self.tests, version_info=version_info, @@ -866,9 +857,8 @@ class BaseMarionetteTestRunner(object): for run_tests in self.mixin_run_tests: run_tests(tests) if self.shuffle: - self.logger.info("Using seed where seed is:{}".format(self.shuffle_seed)) + self.logger.info("Using shuffle seed: %d" % self.shuffle_seed) - self.logger.info('mode: {}'.format('e10s' if self.e10s else 'non-e10s')) self.logger.suite_end() except: # raise only the exception if we were not interrupted @@ -900,19 +890,9 @@ class BaseMarionetteTestRunner(object): for failed_test in self.failures: self.logger.info('{}'.format(failed_test[0])) - def start_httpd(self, need_external_ip): - warnings.warn("start_httpd has been deprecated in favour of create_httpd", - DeprecationWarning) - self.httpd = self.create_httpd(need_external_ip) - - def create_httpd(self, need_external_ip): - host = "127.0.0.1" - if need_external_ip: - host = moznetwork.get_ip() + def start_fixture_servers(self): root = self.server_root or os.path.join(os.path.dirname(here), "www") - rv = httpd.FixtureServer(root, host=host) - rv.start() - return rv + return serve.start(root) def add_test(self, test, expected='pass'): filepath = os.path.abspath(test) @@ -972,7 +952,6 @@ class BaseMarionetteTestRunner(object): self.tests.append({'filepath': filepath, 'expected': expected}) def run_test(self, filepath, expected): - testloader = unittest.TestLoader() suite = unittest.TestSuite() self.test_kwargs['expected'] = expected @@ -984,7 +963,7 @@ class BaseMarionetteTestRunner(object): suite, testloader, self.marionette, - self.httpd, + self.fixtures, self.testvars, **self.test_kwargs) break @@ -1050,12 +1029,13 @@ class BaseMarionetteTestRunner(object): self.run_test_set(self.tests) def cleanup(self): - if hasattr(self, 'httpd') and self.httpd: - self.httpd.stop() - self.httpd = None + for proc in iter_proc(self.fixture_servers): + proc.stop() + proc.kill() + self.fixture_servers = {} if hasattr(self, 'marionette') and self.marionette: - if self.marionette.instance: + if self.marionette.instance is not None: self.marionette.instance.close() self.marionette.instance = None diff --git a/testing/marionette/harness/marionette/runner/httpd.py b/testing/marionette/harness/marionette/runner/httpd.py old mode 100644 new mode 100755 index 968933124c1f..2136e2bccb17 --- a/testing/marionette/harness/marionette/runner/httpd.py +++ b/testing/marionette/harness/marionette/runner/httpd.py @@ -1,61 +1,28 @@ +#!/usr/bin/env python + # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. +"""Specialisation of wptserver.server.WebTestHttpd for testing +Marionette. + +""" + +import argparse import os +import select +import sys import time +import urlparse from wptserve import server, handlers, routes as default_routes -class FixtureServer(object): - - def __init__(self, root, host="127.0.0.1", port=0): - if not os.path.isdir(root): - raise IOError("Server root is not a valid path: {}".format(root)) - self.root = root - self.host = host - self.port = port - self._server = None - - def start(self, block=False): - if self.alive: - return - routes = [("POST", "/file_upload", upload_handler), - ("GET", "/slow", slow_loading_document)] - routes.extend(default_routes.routes) - self._server = server.WebTestHttpd( - port=self.port, - doc_root=self.root, - routes=routes, - host=self.host, - ) - self._server.start(block=block) - self.port = self._server.httpd.server_port - self.base_url = self.get_url() - - def stop(self): - if not self.alive: - return - self._server.stop() - self._server = None - - @property - def alive(self): - return self._server is not None - - def get_url(self, path="/"): - if not self.alive: - raise Exception("Server not started") - return self._server.get_url(path) - - @property - def router(self): - return self._server.router - - @property - def routes(self): - return self._server.router.routes +here = os.path.abspath(os.path.dirname(__file__)) +default_doc_root = os.path.join(os.path.dirname(here), "www") +default_ssl_cert = os.path.join(here, "test.cert") +default_ssl_key = os.path.join(here, "test.key") @handlers.handler @@ -71,12 +38,105 @@ def slow_loading_document(request, response):

ok""" +class NotAliveError(Exception): + """Occurs when attempting to run a function that requires the HTTPD + to have been started, and it has not. + + """ + pass + + +class FixtureServer(object): + + def __init__(self, doc_root, url="http://127.0.0.1:0", use_ssl=False, + ssl_cert=None, ssl_key=None): + if not os.path.isdir(doc_root): + raise ValueError("Server root is not a directory: %s" % doc_root) + + url = urlparse.urlparse(url) + if url.scheme is None: + raise ValueError("Server scheme not provided") + + scheme, host, port = url.scheme, url.hostname, url.port + if host is None: + host = "127.0.0.1" + if port is None: + port = 0 + + routes = [("POST", "/file_upload", upload_handler), + ("GET", "/slow", slow_loading_document)] + routes.extend(default_routes.routes) + + self._httpd = server.WebTestHttpd(host=host, + port=port, + bind_hostname=True, + doc_root=doc_root, + routes=routes, + use_ssl=True if scheme == "https" else False, + certificate=ssl_cert, + key_file=ssl_key) + + def start(self, block=False): + if self.is_alive: + return + self._httpd.start(block=block) + + def wait(self): + if not self.is_alive: + return + try: + select.select([], [], []) + except KeyboardInterrupt: + self.stop() + + def stop(self): + if not self.is_alive: + return + self._httpd.stop() + + def get_url(self, path): + if not self.is_alive: + raise NotAliveError() + return self._httpd.get_url(path) + + @property + def doc_root(self): + return self._httpd.router.doc_root + + @property + def router(self): + return self._httpd.router + + @property + def routes(self): + return self._httpd.router.routes + + @property + def is_alive(self): + return self._httpd.started + + if __name__ == "__main__": - here = os.path.abspath(os.path.dirname(__file__)) - doc_root = os.path.join(os.path.dirname(here), "www") - httpd = FixtureServer(doc_root, port=2829) - print "Started fixture server on http://{0}:{1}/".format(httpd.host, httpd.port) - try: - httpd.start(True) - except KeyboardInterrupt: - pass + parser = argparse.ArgumentParser( + description="Specialised HTTP server for testing Marionette.") + parser.add_argument("url", help=""" +service address including scheme, hostname, port, and prefix for document root, +e.g. \"https://0.0.0.0:0/base/\"""") + parser.add_argument( + "-r", dest="doc_root", default=default_doc_root, + help="path to document root (default %(default)s)") + parser.add_argument( + "-c", dest="ssl_cert", default=default_ssl_cert, + help="path to SSL certificate (default %(default)s)") + parser.add_argument( + "-k", dest="ssl_key", default=default_ssl_key, + help="path to SSL certificate key (default %(default)s)") + args = parser.parse_args() + + httpd = FixtureServer(args.doc_root, args.url, + ssl_cert=args.ssl_cert, + ssl_key=args.ssl_key) + httpd.start() + print >>sys.stderr, "%s: started fixture server on %s" % \ + (sys.argv[0], httpd.get_url("/")) + httpd.wait() diff --git a/testing/marionette/harness/marionette/runner/serve.py b/testing/marionette/harness/marionette/runner/serve.py new file mode 100755 index 000000000000..9daa80e95e61 --- /dev/null +++ b/testing/marionette/harness/marionette/runner/serve.py @@ -0,0 +1,226 @@ +#!/usr/bin/env python + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +"""Spawns necessary HTTP servers for testing Marionette in child +processes. + +""" + +from collections import defaultdict +import argparse +import multiprocessing +import os +import sys + +import httpd + + +__all__ = ["default_doc_root", + "iter_proc", + "iter_url", + "registered_servers", + "servers", + "start", + "where_is"] +here = os.path.abspath(os.path.dirname(__file__)) + + +class BlockingChannel(object): + + def __init__(self, channel): + self.chan = channel + self.lock = multiprocessing.Lock() + + def call(self, func, args=()): + self.send((func, args)) + return self.recv() + + def send(self, *args): + try: + self.lock.acquire() + self.chan.send(args) + finally: + self.lock.release() + + def recv(self): + try: + self.lock.acquire() + payload = self.chan.recv() + if isinstance(payload, tuple) and len(payload) == 1: + return payload[0] + return payload + except KeyboardInterrupt: + return ("stop", ()) + finally: + self.lock.release() + + +class ServerProxy(multiprocessing.Process, BlockingChannel): + + def __init__(self, channel, init_func, *init_args, **init_kwargs): + multiprocessing.Process.__init__(self) + BlockingChannel.__init__(self, channel) + self.init_func = init_func + self.init_args = init_args + self.init_kwargs = init_kwargs + + def run(self): + server = self.init_func(*self.init_args, **self.init_kwargs) + server.start(block=False) + + try: + while True: + # ["func", ("arg", ...)] + # ["prop", ()] + sattr, fargs = self.recv() + attr = getattr(server, sattr) + + # apply fargs to attr if it is a function + if callable(attr): + rv = attr(*fargs) + + # otherwise attr is a property + else: + rv = attr + + self.send(rv) + + if sattr == "stop": + return + + except KeyboardInterrupt: + server.stop() + + +class ServerProc(BlockingChannel): + + def __init__(self, init_func): + self._init_func = init_func + self.proc = None + + parent_chan, self.child_chan = multiprocessing.Pipe() + BlockingChannel.__init__(self, parent_chan) + + def start(self, doc_root, ssl_config, **kwargs): + self.proc = ServerProxy( + self.child_chan, self._init_func, doc_root, ssl_config, **kwargs) + self.proc.daemon = True + self.proc.start() + + def get_url(self, url): + return self.call("get_url", (url,)) + + @property + def doc_root(self): + return self.call("doc_root", ()) + + def stop(self): + self.call("stop") + if not self.is_alive: + return + self.proc.join() + + def kill(self): + if not self.is_alive: + return + self.proc.terminate() + self.proc.join(0) + + @property + def is_alive(self): + if self.proc is not None: + return self.proc.is_alive() + return False + + +def http_server(doc_root, ssl_config, **kwargs): + return httpd.FixtureServer(doc_root, url="http://0.0.0.0:0/") + + +def https_server(doc_root, ssl_config, **kwargs): + return httpd.FixtureServer(doc_root, + url="https://0.0.0.0:0/", + ssl_key=ssl_config["key_path"], + ssl_cert=ssl_config["cert_path"]) + + +def start_servers(doc_root, ssl_config, **kwargs): + servers = defaultdict() + for schema, builder_fn in registered_servers: + proc = ServerProc(builder_fn) + proc.start(doc_root, ssl_config, **kwargs) + servers[schema] = (proc.get_url("/"), proc) + return servers + + +def start(doc_root=None, **kwargs): + """Start all relevant test servers. + + If no `doc_root` is given the default + testing/marionette/harness/marionette/www directory will be used. + + Additional keyword arguments can be given which will be passed on + to the individual ``FixtureServer``'s in httpd.py. + + """ + doc_root = doc_root or default_doc_root + ssl_config = {"cert_path": httpd.default_ssl_cert, + "key_path": httpd.default_ssl_key} + + global servers + servers = start_servers(doc_root, ssl_config, **kwargs) + + return servers + + +def where_is(uri, on="http"): + """Returns the full URL, including scheme, hostname, and port, for + a fixture resource from the server associated with the ``on`` key. + It will by default look for the resource in the "http" server. + + """ + return servers.get(on)[1].get_url(uri) + + +def iter_proc(servers): + for _, (_, proc) in servers.iteritems(): + yield proc + + +def iter_url(servers): + for _, (url, _) in servers.iteritems(): + yield url + + +default_doc_root = os.path.join(os.path.dirname(here), "www") +registered_servers = [("http", http_server), + ("https", https_server)] +servers = defaultdict() + + +def main(args): + global servers + + parser = argparse.ArgumentParser() + parser.add_argument("-r", dest="doc_root", + help="Path to document root. Overrides default.") + args = parser.parse_args() + + servers = start(args.doc_root) + for url in iter_url(servers): + print >>sys.stderr, "%s: listening on %s" % (sys.argv[0], url) + + try: + while any(proc.is_alive for proc in iter_proc(servers)): + for proc in iter_proc(servers): + proc.proc.join(1) + except KeyboardInterrupt: + for proc in iter_proc(servers): + proc.kill() + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/testing/marionette/harness/marionette/runner/test.cert b/testing/marionette/harness/marionette/runner/test.cert new file mode 100644 index 000000000000..3fd1cba2b7b1 --- /dev/null +++ b/testing/marionette/harness/marionette/runner/test.cert @@ -0,0 +1,86 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha256WithRSAEncryption + Issuer: CN=web-platform-tests + Validity + Not Before: Dec 22 12:09:16 2014 GMT + Not After : Dec 21 12:09:16 2024 GMT + Subject: CN=web-platform.test + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:b3:84:d6:8b:01:59:18:85:d1:dc:32:df:38:f7: + 90:85:1b:3e:a5:5e:81:3e:2f:fc:3a:5f:7f:77:ef: + 23:bb:3a:88:27:0f:be:25:46:cd:63:7d:cb:95:d8: + a5:50:10:d2:a2:d2:b7:97:d1:0d:6c:fb:f9:05:e8: + 6f:a8:4b:bd:95:67:9e:7b:94:58:a9:6d:93:fd:e0: + 12:c5:cd:b4:8a:64:52:31:5f:0e:e3:89:84:71:da: + 98:dd:4b:ec:02:25:a5:7d:35:fe:63:da:b3:ac:ec: + a5:46:0f:0d:64:23:5c:6d:f3:ec:cc:28:63:23:c0: + 4b:9a:ec:8f:c1:ee:b1:a2:3e:72:4d:70:b5:09:c1: + eb:b4:10:55:3c:8b:ea:1b:94:7e:4b:74:e6:f4:9f: + 4f:a6:45:30:b5:f0:b8:b4:d1:59:50:65:0a:86:53: + ea:4c:9f:9e:f4:58:6c:31:f5:17:3a:6f:57:8b:cb: + 5f:f0:28:0b:45:92:8d:30:20:49:ff:52:e6:2c:cb: + 18:9a:d7:e6:ee:3e:4f:34:35:15:13:c5:02:da:c5: + 5f:be:fb:5b:ce:8d:bf:b5:35:76:3c:7c:e6:9c:3b: + 26:87:4d:8d:80:e6:16:c6:27:f2:50:49:b6:72:74: + 43:49:49:44:38:bb:78:43:23:ee:16:3e:d9:62:e6: + a5:d7 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + X509v3 Subject Key Identifier: + 2D:98:A3:99:39:1C:FE:E9:9A:6D:17:94:D2:3A:96:EE:C8:9E:04:22 + X509v3 Authority Key Identifier: + keyid:6A:AB:53:64:92:36:87:23:34:B3:1D:6F:85:4B:F5:DF:5A:5C:74:8F + + X509v3 Key Usage: + Digital Signature, Non Repudiation, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication + X509v3 Subject Alternative Name: + DNS:web-platform.test, DNS:www.web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.web-platform.test, DNS:xn--lve-6lad.web-platform.test, DNS:www2.web-platform.test, DNS:www1.web-platform.test + Signature Algorithm: sha256WithRSAEncryption + 33:db:f7:f0:f6:92:16:4f:2d:42:bc:b8:aa:e6:ab:5e:f9:b9: + b0:48:ae:b5:8d:cc:02:7b:e9:6f:4e:75:f7:17:a0:5e:7b:87: + 06:49:48:83:c5:bb:ca:95:07:37:0e:5d:e3:97:de:9e:0c:a4: + 82:30:11:81:49:5d:50:29:72:92:a5:ca:17:b1:7c:f1:32:11: + 17:57:e6:59:c1:ac:e3:3b:26:d2:94:97:50:6a:b9:54:88:84: + 9b:6f:b1:06:f5:80:04:22:10:14:b1:f5:97:25:fc:66:d6:69: + a3:36:08:85:23:ff:8e:3c:2b:e0:6d:e7:61:f1:00:8f:61:3d: + b0:87:ad:72:21:f6:f0:cc:4f:c9:20:bf:83:11:0f:21:f4:b8: + c0:dd:9c:51:d7:bb:27:32:ec:ab:a4:62:14:28:32:da:f2:87: + 80:68:9c:ea:ac:eb:f5:7f:f5:de:f4:c0:39:91:c8:76:a4:ee: + d0:a8:50:db:c1:4b:f9:c4:3d:d9:e8:8e:b6:3f:c0:96:79:12: + d8:fa:4d:0a:b3:36:76:aa:4e:b2:82:2f:a2:d4:0d:db:fd:64: + 77:6f:6e:e9:94:7f:0f:c8:3a:3c:96:3d:cd:4d:6c:ba:66:95: + f7:b4:9d:a4:94:9f:97:b3:9a:0d:dc:18:8c:11:0b:56:65:8e: + 46:4c:e6:5e +-----BEGIN CERTIFICATE----- +MIID2jCCAsKgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAdMRswGQYDVQQDDBJ3ZWIt +cGxhdGZvcm0tdGVzdHMwHhcNMTQxMjIyMTIwOTE2WhcNMjQxMjIxMTIwOTE2WjAc +MRowGAYDVQQDExF3ZWItcGxhdGZvcm0udGVzdDCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBALOE1osBWRiF0dwy3zj3kIUbPqVegT4v/Dpff3fvI7s6iCcP +viVGzWN9y5XYpVAQ0qLSt5fRDWz7+QXob6hLvZVnnnuUWKltk/3gEsXNtIpkUjFf +DuOJhHHamN1L7AIlpX01/mPas6zspUYPDWQjXG3z7MwoYyPAS5rsj8HusaI+ck1w +tQnB67QQVTyL6huUfkt05vSfT6ZFMLXwuLTRWVBlCoZT6kyfnvRYbDH1FzpvV4vL +X/AoC0WSjTAgSf9S5izLGJrX5u4+TzQ1FRPFAtrFX777W86Nv7U1djx85pw7JodN +jYDmFsYn8lBJtnJ0Q0lJRDi7eEMj7hY+2WLmpdcCAwEAAaOCASQwggEgMAkGA1Ud +EwQCMAAwHQYDVR0OBBYEFC2Yo5k5HP7pmm0XlNI6lu7IngQiMB8GA1UdIwQYMBaA +FGqrU2SSNocjNLMdb4VL9d9aXHSPMAsGA1UdDwQEAwIF4DATBgNVHSUEDDAKBggr +BgEFBQcDATCBsAYDVR0RBIGoMIGlghF3ZWItcGxhdGZvcm0udGVzdIIVd3d3Lndl +Yi1wbGF0Zm9ybS50ZXN0gil4bi0tbjhqNmRzNTNsd3drcnFodjI4YS53ZWItcGxh +dGZvcm0udGVzdIIeeG4tLWx2ZS02bGFkLndlYi1wbGF0Zm9ybS50ZXN0ghZ3d3cy +LndlYi1wbGF0Zm9ybS50ZXN0ghZ3d3cxLndlYi1wbGF0Zm9ybS50ZXN0MA0GCSqG +SIb3DQEBCwUAA4IBAQAz2/fw9pIWTy1CvLiq5qte+bmwSK61jcwCe+lvTnX3F6Be +e4cGSUiDxbvKlQc3Dl3jl96eDKSCMBGBSV1QKXKSpcoXsXzxMhEXV+ZZwazjOybS +lJdQarlUiISbb7EG9YAEIhAUsfWXJfxm1mmjNgiFI/+OPCvgbedh8QCPYT2wh61y +IfbwzE/JIL+DEQ8h9LjA3ZxR17snMuyrpGIUKDLa8oeAaJzqrOv1f/Xe9MA5kch2 +pO7QqFDbwUv5xD3Z6I62P8CWeRLY+k0KszZ2qk6ygi+i1A3b/WR3b27plH8PyDo8 +lj3NTWy6ZpX3tJ2klJ+Xs5oN3BiMEQtWZY5GTOZe +-----END CERTIFICATE----- \ No newline at end of file diff --git a/testing/marionette/harness/marionette/runner/test.key b/testing/marionette/harness/marionette/runner/test.key new file mode 100644 index 000000000000..194a49ec42f3 --- /dev/null +++ b/testing/marionette/harness/marionette/runner/test.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCzhNaLAVkYhdHc +Mt8495CFGz6lXoE+L/w6X3937yO7OognD74lRs1jfcuV2KVQENKi0reX0Q1s+/kF +6G+oS72VZ557lFipbZP94BLFzbSKZFIxXw7jiYRx2pjdS+wCJaV9Nf5j2rOs7KVG +Dw1kI1xt8+zMKGMjwEua7I/B7rGiPnJNcLUJweu0EFU8i+oblH5LdOb0n0+mRTC1 +8Li00VlQZQqGU+pMn570WGwx9Rc6b1eLy1/wKAtFko0wIEn/UuYsyxia1+buPk80 +NRUTxQLaxV+++1vOjb+1NXY8fOacOyaHTY2A5hbGJ/JQSbZydENJSUQ4u3hDI+4W +Ptli5qXXAgMBAAECggEBAIcwDQSnIjo2ZECHytQykpG6X6XXEksLhc1Lp0lhPC49 +uNR5pX6a4AcBb3PLr0opMQZO2tUoKA0ff3t0e8loKD+/xXhY0Z/dlioEOP7elwv0 +2nS1mhe9spCuxpk4GGXRhdtR8t2tj8s0do3YvgPgITXoEDX6YBZHNGhZpzSrFPgQ +/c3eGCVmzWYuLFfdj5OPQ9bwTaY4JSvDLZT0/WTgiica7VySwfz3HP1fFqNykTiK +ACQREvtxfk5Ym2nT6oni7CM2zOEJL9SXicXI5HO4bERH0ZYh//F3g6mwGiFXUJPd +NKgaTM1oT9kRGkUaEYsRWrddwR8d5mXLvBuTJbgIsSECgYEA1+2uJSYRW1OqbhYP +ms59YQHSs3VjpJpnCV2zNa2Wixs57KS2cOH7B6KrQCogJFLtgCDVLtyoErfVkD7E +FivTgYr1pVCRppJddQzXik31uOINOBVffr7/09g3GcRN+ubHPZPq3K+dD6gHa3Aj +0nH1EjEEV0QpSTQFn87OF2mc9wcCgYEA1NVqMbbzd+9Xft5FXuSbX6E+S02dOGat +SgpnkTM80rjqa6eHdQzqk3JqyteHPgdi1vdYRlSPOj/X+6tySY0Ej9sRnYOfddA2 +kpiDiVkmiqVolyJPY69Utj+E3TzJ1vhCQuYknJmB7zP9tDcTxMeq0l/NaWvGshEK +yC4UTQog1rECgYASOFILfGzWgfbNlzr12xqlRtwanHst9oFfPvLSQrWDQ2bd2wAy +Aj+GY2mD3oobxouX1i1m6OOdwLlalJFDNauBMNKNgoDnx03vhIfjebSURy7KXrNS +JJe9rm7n07KoyzRgs8yLlp3wJkOKA0pihY8iW9R78JpzPNqEo5SsURMXnQKBgBlV +gfuC9H4tPjP6zzUZbyk1701VYsaI6k2q6WMOP0ox+q1v1p7nN7DvaKjWeOG4TVqb +PKW6gQYE/XeWk9cPcyCQigs+1KdYbnaKsvWRaBYO1GFREzQhdarv6qfPCZOOH40J +Cgid+Sp4/NULzU2aGspJ3xCSZKdjge4MFhyJfRkxAoGBAJlwqY4nue0MBLGNpqcs +WwDtSasHvegKAcxGBKL5oWPbLBk7hk+hdqc8f6YqCkCNqv/ooBspL15ESItL+6yT +zt0YkK4oH9tmLDb+rvqZ7ZdXbWSwKITMoCyyHUtT6OKt/RtA0Vdy9LPnP27oSO/C +dk8Qf7KgKZLWo0ZNkvw38tEC +-----END PRIVATE KEY----- \ No newline at end of file diff --git a/testing/marionette/harness/marionette/tests/harness_unit/test_httpd.py b/testing/marionette/harness/marionette/tests/harness_unit/test_httpd.py new file mode 100644 index 000000000000..4bac9d722e33 --- /dev/null +++ b/testing/marionette/harness/marionette/tests/harness_unit/test_httpd.py @@ -0,0 +1,89 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import json +import os +import types +import urllib2 + +import pytest + +from marionette.runner import httpd +from wptserve.handlers import json_handler + +here = os.path.abspath(os.path.dirname(__file__)) +parent = os.path.dirname(here) +default_doc_root = os.path.join(os.path.dirname(parent), "www") + + +@pytest.yield_fixture +def server(): + server = httpd.FixtureServer(default_doc_root) + yield server + server.stop() + + +def test_ctor(): + with pytest.raises(ValueError): + httpd.FixtureServer("foo") + httpd.FixtureServer(default_doc_root) + + +def test_start_stop(server): + server.start() + server.stop() + + +def test_get_url(server): + server.start() + url = server.get_url("/") + assert isinstance(url, types.StringTypes) + assert "http://" in url + + server.stop() + with pytest.raises(httpd.NotAliveError): + server.get_url("/") + + +def test_doc_root(server): + server.start() + assert isinstance(server.doc_root, types.StringTypes) + server.stop() + assert isinstance(server.doc_root, types.StringTypes) + + +def test_router(server): + assert server.router is not None + + +def test_routes(server): + assert server.routes is not None + + +def test_is_alive(server): + assert server.is_alive == False + server.start() + assert server.is_alive == True + + +def test_handler(server): + counter = 0 + + @json_handler + def handler(request, response): + return {"count": counter} + + route = ("GET", "/httpd/test_handler", handler) + server.router.register(*route) + server.start() + + url = server.get_url("/httpd/test_handler") + body = urllib2.urlopen(url).read() + res = json.loads(body) + assert res["count"] == counter + + +if __name__ == "__main__": + import sys + sys.exit(pytest.main(["--verbose", __file__])) diff --git a/testing/marionette/harness/marionette/tests/harness_unit/test_marionette_runner.py b/testing/marionette/harness/marionette/tests/harness_unit/test_marionette_runner.py index 6cd8013ff8cd..079dcc753c85 100644 --- a/testing/marionette/harness/marionette/tests/harness_unit/test_marionette_runner.py +++ b/testing/marionette/harness/marionette/tests/harness_unit/test_marionette_runner.py @@ -25,7 +25,7 @@ def mock_runner(runner, mock_marionette, monkeypatch): to enable testing runner.run_tests(). """ runner.driverclass = mock_marionette - for attr in ['_set_baseurl', 'run_test_set', '_capabilities']: + for attr in ['run_test_set', '_capabilities']: setattr(runner, attr, Mock()) runner._appName = 'fake_app' monkeypatch.setattr('marionette.runner.base.mozversion', Mock()) @@ -352,7 +352,7 @@ def test_cleanup_with_manifest(mock_runner, manifest_with_tests, monkeypatch): with context: mock_runner.run_tests([manifest_with_tests.filepath]) assert mock_runner.marionette is None - assert mock_runner.httpd is None + assert mock_runner.fixture_servers == {} def test_reset_test_stats(mock_runner): diff --git a/testing/marionette/harness/marionette/tests/harness_unit/test_serve.py b/testing/marionette/harness/marionette/tests/harness_unit/test_serve.py new file mode 100644 index 000000000000..2f175812a9db --- /dev/null +++ b/testing/marionette/harness/marionette/tests/harness_unit/test_serve.py @@ -0,0 +1,67 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import types + +import pytest + +from marionette.runner import serve +from marionette.runner.serve import iter_proc, iter_url + + +def teardown_function(func): + for server in [server for server in iter_proc(serve.servers) if server.is_alive]: + server.stop() + server.kill() + + +def test_registered_servers(): + # [(name, factory), ...] + assert serve.registered_servers[0][0] == "http" + assert serve.registered_servers[1][0] == "https" + + +def test_globals(): + assert serve.default_doc_root is not None + assert serve.registered_servers is not None + assert serve.servers is not None + + +def test_start(): + serve.start() + assert len(serve.servers) == 2 + assert "http" in serve.servers + assert "https" in serve.servers + for url in iter_url(serve.servers): + assert isinstance(url, types.StringTypes) + + +def test_start_with_custom_root(tmpdir_factory): + tdir = tmpdir_factory.mktemp("foo") + serve.start(str(tdir)) + for server in iter_proc(serve.servers): + assert server.doc_root == tdir + + +def test_iter_proc(): + serve.start() + for server in iter_proc(serve.servers): + server.stop() + + +def test_iter_url(): + serve.start() + for url in iter_url(serve.servers): + assert isinstance(url, types.StringTypes) + + +def test_where_is(): + serve.start() + assert serve.where_is("/") == serve.servers["http"][1].get_url("/") + assert serve.where_is("/", on="https") == serve.servers["https"][1].get_url("/") + + +if __name__ == "__main__": + import sys + sys.exit(pytest.main(["-s", "--verbose", __file__])) diff --git a/testing/marionette/harness/marionette/tests/unit/test_httpd.py b/testing/marionette/harness/marionette/tests/unit/test_httpd.py deleted file mode 100644 index c987102c806c..000000000000 --- a/testing/marionette/harness/marionette/tests/unit/test_httpd.py +++ /dev/null @@ -1,32 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -from marionette import MarionetteTestCase -from marionette_driver import By - - -class TestHttpdServer(MarionetteTestCase): - - def test_handler(self): - status = {"count": 0} - - def handler(request, response): - status["count"] += 1 - - response.headers.set("Content-Type", "text/html") - response.content = "

{}

".format( - status["count"]) - - return () - - route = ("GET", "/httpd/test_handler", handler) - self.httpd.router.register(*route) - - url = self.marionette.absolute_url("httpd/test_handler") - - for counter in range(0, 5): - self.marionette.navigate(url) - self.assertEqual(status["count"], counter + 1) - elem = self.marionette.find_element(By.ID, "count") - self.assertEqual(elem.text, str(counter + 1)) diff --git a/testing/marionette/harness/marionette/tests/unit/unit-tests.ini b/testing/marionette/harness/marionette/tests/unit/unit-tests.ini index f57aa9d2e30c..9509e196d13d 100644 --- a/testing/marionette/harness/marionette/tests/unit/unit-tests.ini +++ b/testing/marionette/harness/marionette/tests/unit/unit-tests.ini @@ -122,5 +122,4 @@ skip-if = appname == 'fennec' [test_select.py] [test_crash.py] -[test_httpd.py] [test_localization.py] diff --git a/testing/marionette/harness/requirements.txt b/testing/marionette/harness/requirements.txt index ea93816c52ff..16fde1a3d17c 100644 --- a/testing/marionette/harness/requirements.txt +++ b/testing/marionette/harness/requirements.txt @@ -1,14 +1,13 @@ -marionette-driver >= 2.1.0 browsermob-proxy >= 0.6.0 manifestparser >= 1.1 -wptserve >= 1.3.0 -mozinfo >= 0.8 -mozprocess >= 0.9 -mozrunner >= 6.13 -mozdevice >= 0.44 -mozlog >= 3.0 -moznetwork >= 0.21 +marionette-driver >= 2.1.0 mozcrash >= 0.5 +mozdevice >= 0.44 +mozinfo >= 0.8 +mozlog >= 3.0 +mozprocess >= 0.9 mozprofile >= 0.7 +mozrunner >= 6.13 moztest >= 0.7 mozversion >= 1.1 +wptserve >= 1.3.0 From f702780183e3335d641f45ffb1bcf0b068720a1d Mon Sep 17 00:00:00 2001 From: Andreas Tolfsen Date: Tue, 1 Nov 2016 17:59:51 +0000 Subject: [PATCH 19/53] Bug 1103196 - Mark specificationLevel capability as proprietary; r=automatedtester The `specificationLevel` capability has been removed from the WebDriver specification, and will be removed in a future change to Marionette. This change makes this clear by moving it down to the list of proprietary Marionette capabilities. MozReview-Commit-ID: BMTuXBDZ8WV --HG-- extra : rebase_source : 839405b2cf30d23c7f107801376aff8e76ef4b59 --- testing/marionette/driver.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/marionette/driver.js b/testing/marionette/driver.js index 251d6aab52ea..c5387f3b40b6 100644 --- a/testing/marionette/driver.js +++ b/testing/marionette/driver.js @@ -138,7 +138,6 @@ this.GeckoDriver = function(appName, server) { "browserVersion": Services.appinfo.version, "platformName": Services.sysinfo.getProperty("name").toLowerCase(), "platformVersion": Services.sysinfo.getProperty("version"), - "specificationLevel": 0, // supported features "raisesAccessibilityExceptions": false, @@ -147,6 +146,7 @@ this.GeckoDriver = function(appName, server) { "proxy": {}, // proprietary extensions + "specificationLevel": 0, "processId" : Services.appinfo.processID, }; From e6c7ae10e3096fe9374a7a14f7b6829da2698c44 Mon Sep 17 00:00:00 2001 From: Andreas Tolfsen Date: Tue, 1 Nov 2016 18:00:25 +0000 Subject: [PATCH 20/53] Bug 1103196 - Logically reorder variables defining session state; r=automatedtester No functional changes in this patch. MozReview-Commit-ID: IWaao8AuZib --HG-- extra : rebase_source : 35d0ee07426ee411e4da3cb7e4966a8c44d015e1 --- testing/marionette/driver.js | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/testing/marionette/driver.js b/testing/marionette/driver.js index c5387f3b40b6..0c5bcf97bea0 100644 --- a/testing/marionette/driver.js +++ b/testing/marionette/driver.js @@ -108,30 +108,38 @@ this.GeckoDriver = function(appName, server) { this.browsers = {}; // points to current browser this.curBrowser = null; - this.context = Context.CONTENT; - - this.scriptTimeout = 30000; // 30 seconds - this.searchTimeout = 0; - this.pageTimeout = 300000; // five minutes - - this.timer = null; - this.inactivityTimer = null; - this.marionetteLog = new logging.ContentLogger(); // topmost chrome frame this.mainFrame = null; // chrome iframe that currently has focus this.curFrame = null; this.mainContentFrameId = null; - this.importedScripts = new evaluate.ScriptStorageService([Context.CHROME, Context.CONTENT]); - this.currentFrameElement = null; - this.testName = null; this.mozBrowserClose = null; - this.sandboxes = new Sandboxes(() => this.getCurrentWindow()); + this.currentFrameElement = null; // frame ID of the current remote frame, used for mozbrowserclose events this.oopFrameId = null; this.observing = null; this._browserIds = new WeakMap(); + // user-defined timeouts + this.scriptTimeout = 30000; // 30 seconds + this.searchTimeout = null; + this.pageTimeout = 300000; // five minutes + + // The curent context decides if commands should affect chrome- or + // content space. + this.context = Context.CONTENT; + + this.importedScripts = new evaluate.ScriptStorageService( + [Context.CHROME, Context.CONTENT]); + this.sandboxes = new Sandboxes(() => this.getCurrentWindow()); + this.actions = new action.Chain(); + + this.timer = null; + this.inactivityTimer = null; + + this.marionetteLog = new logging.ContentLogger(); + this.testName = null; + this.sessionCapabilities = { // mandated capabilities "browserName": Services.appinfo.name.toLowerCase(), From 84c0637c2f4be1c382a074950434d1f05449eb72 Mon Sep 17 00:00:00 2001 From: Andreas Tolfsen Date: Tue, 1 Nov 2016 18:07:24 +0000 Subject: [PATCH 21/53] Bug 1103196 - Add acceptInsecureCerts capability; r=automatedtester Reads the `acceptInsecureCerts` capability and sets the session state. MozReview-Commit-ID: KVErmdxwXQB --HG-- extra : rebase_source : fb1ee50bc2ee53343af58dcb417e5a5c0dee7fbc --- testing/marionette/driver.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/testing/marionette/driver.js b/testing/marionette/driver.js index 0c5bcf97bea0..d7ac52e94a3b 100644 --- a/testing/marionette/driver.js +++ b/testing/marionette/driver.js @@ -125,6 +125,10 @@ this.GeckoDriver = function(appName, server) { this.searchTimeout = null; this.pageTimeout = 300000; // five minutes + // Unsigned or invalid TLS certificates will be ignored if secureTLS + // is set to false. + this.secureTLS = true; + // The curent context decides if commands should affect chrome- or // content space. this.context = Context.CONTENT; @@ -146,6 +150,7 @@ this.GeckoDriver = function(appName, server) { "browserVersion": Services.appinfo.version, "platformName": Services.sysinfo.getProperty("name").toLowerCase(), "platformVersion": Services.sysinfo.getProperty("version"), + "acceptInsecureCerts": !this.secureTLS, // supported features "raisesAccessibilityExceptions": false, @@ -649,6 +654,14 @@ GeckoDriver.prototype.setSessionCapabilities = function(newCaps) { let caps = copy(this.sessionCapabilities); caps = copy(newCaps, caps); logger.config("Changing capabilities: " + JSON.stringify(caps)); + + // update session state + this.secureTLS = !caps.acceptInsecureCerts; + if (!this.secureTLS) { + logger.warn("Invalid or self-signed TLS certificates " + + "will be discarded for this session"); + } + this.sessionCapabilities = caps; }; From 0d1b8f66e974c56aa6f1315caa9e741d0ae19041 Mon Sep 17 00:00:00 2001 From: Andreas Tolfsen Date: Sun, 6 Nov 2016 17:59:42 +0000 Subject: [PATCH 22/53] Bug 1103196 - Remove non-conformant acceptSslCerts capability; r=automatedtester `acceptSslCerts` has been replaced by `acceptInsecureCerts`. MozReview-Commit-ID: 79KbRoQb1dW --HG-- extra : rebase_source : 4ccda0241b1809e0bc11ec6be4c820007731da63 --- testing/marionette/driver.js | 1 - 1 file changed, 1 deletion(-) diff --git a/testing/marionette/driver.js b/testing/marionette/driver.js index d7ac52e94a3b..904ae2856c9c 100644 --- a/testing/marionette/driver.js +++ b/testing/marionette/driver.js @@ -155,7 +155,6 @@ this.GeckoDriver = function(appName, server) { // supported features "raisesAccessibilityExceptions": false, "rotatable": this.appName == "B2G", - "acceptSslCerts": false, "proxy": {}, // proprietary extensions From e19e26382ec8273ccdecd09c56a0aa5f635903f5 Mon Sep 17 00:00:00 2001 From: Andreas Tolfsen Date: Sun, 6 Nov 2016 18:00:18 +0000 Subject: [PATCH 23/53] Bug 1103196 - Add insecure certificate error; r=automatedtester MozReview-Commit-ID: 26wwOuqWhog --HG-- extra : rebase_source : 2a071ca7800f27026c8c53efb1b247067c37a90e --- testing/marionette/client/marionette_driver/errors.py | 4 ++++ testing/marionette/error.js | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/testing/marionette/client/marionette_driver/errors.py b/testing/marionette/client/marionette_driver/errors.py index ba748b4f5e36..d03a320599b3 100644 --- a/testing/marionette/client/marionette_driver/errors.py +++ b/testing/marionette/client/marionette_driver/errors.py @@ -55,6 +55,10 @@ class ElementNotSelectableException(MarionetteException): status = "element not selectable" +class InsecureCertificateException(MarionetteException): + status = "insecure certificate" + + class InvalidArgumentException(MarionetteException): status = "invalid argument" diff --git a/testing/marionette/error.js b/testing/marionette/error.js index e8321be695e6..3d27a1f207b2 100644 --- a/testing/marionette/error.js +++ b/testing/marionette/error.js @@ -9,6 +9,7 @@ const {interfaces: Ci, utils: Cu} = Components; const ERRORS = new Set([ "ElementNotAccessibleError", "ElementNotVisibleError", + "InsecureCertificateError", "InvalidArgumentError", "InvalidElementStateError", "InvalidSelectorError", @@ -229,6 +230,13 @@ this.ElementNotVisibleError = function(msg) { }; ElementNotVisibleError.prototype = Object.create(WebDriverError.prototype); +this.InsecureCertificateError = function(msg) { + WebDriverError.call(this, msg); + this.name = "InsecureCertificateError"; + this.status = "insecure certificate"; +}; +InsecureCertificateError.prototype = Object.create(WebDriverError.prototype); + this.InvalidArgumentError = function(msg) { WebDriverError.call(this, msg); this.name = "InvalidArgumentError"; From a8326f61b5ba42b4b430aa9537a9f8c37d3a16c5 Mon Sep 17 00:00:00 2001 From: Andreas Tolfsen Date: Sun, 6 Nov 2016 18:01:23 +0000 Subject: [PATCH 24/53] Bug 1103196 - Error on encountering invalid certificate; r=automatedtester When arriving at a document which baseURI starts with `about:certerror` will cause Marionette to now return `error.InsecureCertificateError`. This is mandated by the WebDriver specification. This does, however, mark a non-backwards compatible change in Marionette. It is assumed we will be able to mitigate this change in error type as few consumers, if any, rely on the more generic type considering we did not support invalid TLS certificates prior to this push. MozReview-Commit-ID: JcIMvCXimB --HG-- extra : rebase_source : 9ed8aa636192f45b30399af6bed9858bed3bad46 --- testing/marionette/driver.js | 19 ++++++++++++------- testing/marionette/listener.js | 9 +++++++-- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/testing/marionette/driver.js b/testing/marionette/driver.js index 904ae2856c9c..b2a20441740a 100644 --- a/testing/marionette/driver.js +++ b/testing/marionette/driver.js @@ -1413,17 +1413,22 @@ GeckoDriver.prototype.switchToParentFrame = function*(cmd, resp) { GeckoDriver.prototype.switchToFrame = function*(cmd, resp) { let {id, element, focus} = cmd.parameters; - let checkTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); + const otherErrorsExpr = /about:.+(error)|(blocked)\?/; + const checkTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); + let curWindow = this.getCurrentWindow(); let checkLoad = function() { - let errorRegex = /about:.+(error)|(blocked)\?/; - let curWindow = this.getCurrentWindow(); - if (curWindow.document.readyState == "complete") { + let win = this.getCurrentWindow(); + if (win.document.readyState == "complete") { return; - } else if (curWindow.document.readyState == "interactive" && - errorRegex.exec(curWindow.document.baseURI)) { - throw new UnknownError("Error loading page"); + } else if (win.document.readyState == "interactive") { + let baseURI = win.document.baseURI; + if (baseURI.startsWith("about:certerror")) { + throw new InsecureCertificateError(); + } else if (otherErrorsExpr.exec(win.document.baseURI)) { + throw new UnknownError("Error loading page"); + } } checkTimer.initWithCallback(checkLoad.bind(this), 100, Ci.nsITimer.TYPE_ONE_SHOT); diff --git a/testing/marionette/listener.js b/testing/marionette/listener.js index de1300f17bad..ae0a409d0eda 100644 --- a/testing/marionette/listener.js +++ b/testing/marionette/listener.js @@ -875,10 +875,15 @@ function pollForReadyState(msg, start = undefined, callback = undefined) { callback(); sendOk(command_id); + // document with an insecure cert + } else if (doc.readyState == "interactive" && + doc.baseURI.startsWith("about:certerror")) { + callback(); + sendError(new InsecureCertificateError(), command_id); + // we have reached an error url without requesting it } else if (doc.readyState == "interactive" && - /about:.+(error)\?/.exec(doc.baseURI) && - !doc.baseURI.startsWith(url)) { + /about:.+(error)\?/.exec(doc.baseURI)) { callback(); sendError(new UnknownError("Reached error page: " + doc.baseURI), command_id); From f4441f7f70d74277b485b34b748110a5f4695f16 Mon Sep 17 00:00:00 2001 From: Andreas Tolfsen Date: Sun, 6 Nov 2016 18:03:31 +0000 Subject: [PATCH 25/53] Bug 1103196 - Add ability to ignore invalid TLS certificates; r=automatedtester,keeler,mossop When the `acceptInsecureCerts` capability is set to true on creating a new Marionette session, a `nsICertOverrideService` override service is installed that causes all invalid TLS certificates to be ignored. This is in line with the expectations of the WebDriver specification. It is worth noting that this is a potential security risk and that this feature is only available in Gecko when the Marionette server is enabled. MozReview-Commit-ID: BXrQw17TgDy --HG-- extra : rebase_source : 722b7bde2b6e76a4cf0565b0504a6ce8ec53f04a --- testing/marionette/cert.js | 140 ++++++++++++++++++ testing/marionette/driver.js | 22 +-- .../tests/unit/test_capabilities.py | 5 +- .../marionette/tests/unit/test_navigation.py | 110 +++++++++++--- testing/marionette/jar.mn | 1 + 5 files changed, 244 insertions(+), 34 deletions(-) create mode 100644 testing/marionette/cert.js diff --git a/testing/marionette/cert.js b/testing/marionette/cert.js new file mode 100644 index 000000000000..707647ac94bc --- /dev/null +++ b/testing/marionette/cert.js @@ -0,0 +1,140 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components; + +Cu.import("resource://gre/modules/Preferences.jsm"); +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); + +this.EXPORTED_SYMBOLS = ["cert"]; + +const registrar = + Components.manager.QueryInterface(Ci.nsIComponentRegistrar); +const sss = Cc["@mozilla.org/ssservice;1"] + .getService(Ci.nsISiteSecurityService); + +const CONTRACT_ID = "@mozilla.org/security/certoverride;1"; +const CERT_PINNING_ENFORCEMENT_PREF = + "security.cert_pinning.enforcement_level"; +const HSTS_PRELOAD_LIST_PREF = + "network.stricttransportsecurity.preloadlist"; + +/** TLS certificate service override management for Marionette. */ +this.cert = { + Error: { + Untrusted: 1, + Mismatch: 2, + Time: 4, + }, + + currentOverride: null, +}; + +/** + * Installs a TLS certificate service override. + * + * The provided |service| must implement the |register| and |unregister| + * functions that causes a new |nsICertOverrideService| interface + * implementation to be registered with the |nsIComponentRegistrar|. + * + * After |service| is registered and made the |cert.currentOverride|, + * |nsICertOverrideService| is reinitialised to cause all Gecko components + * to pick up the new service. + * + * If an override is already installed, i.e. when |cert.currentOverride| + * is not null, this functions acts as a NOOP. + * + * @param {cert.Override} service + * Service generator that registers and unregisters the XPCOM service. + * + * @throws {Components.Exception} + * If unable to register or initialise |service|. + */ +cert.installOverride = function(service) { + if (this.currentOverride) { + return; + } + + service.register(); + cert.currentOverride = service; +}; + +/** + * Uninstall a TLS certificate service override. + * + * After the service has been unregistered, |cert.currentOverride| + * is reset to null. + * + * If there no current override installed, i.e. if |cert.currentOverride| + * is null, this function acts as a NOOP. + */ +cert.uninstallOverride = function() { + if (!cert.currentOverride) { + return; + } + cert.currentOverride.unregister(); + this.currentOverride = null; +}; + +/** + * Certificate override service that acts in an all-inclusive manner + * on TLS certificates. + * + * When an invalid certificate is encountered, it is overriden + * with the |matching| bit level, which is typically a combination of + * |cert.Error.Untrusted|, |cert.Error.Mismatch|, and |cert.Error.Time|. + * + * @type cert.Override + * + * @throws {Components.Exception} + * If there are any problems registering the service. + */ +cert.InsecureSweepingOverride = function() { + const CID = Components.ID("{4b67cce0-a51c-11e6-9598-0800200c9a66}"); + const DESC = "All-encompassing cert service that matches on a bitflag"; + + // This needs to be an old-style class with a function constructor + // and prototype assignment because... XPCOM. Any attempt at + // modernisation will be met with cryptic error messages which will + // make your life miserable. + let service = function() {}; + service.prototype = { + hasMatchingOverride: function( + aHostName, aPort, aCert, aOverrideBits, aIsTemporary) { + aIsTemporary.value = false; + aOverrideBits.value = + cert.Error.Untrusted | cert.Error.Mismatch | cert.Error.Time; + + return true; + }, + + QueryInterface: XPCOMUtils.generateQI([Ci.nsICertOverrideService]), + }; + let factory = XPCOMUtils.generateSingletonFactory(service); + + return { + register: function() { + // make it possible to register certificate overrides for domains + // that use HSTS or HPKP + Preferences.set(HSTS_PRELOAD_LIST_PREF, false); + Preferences.set(CERT_PINNING_ENFORCEMENT_PREF, 0); + + registrar.registerFactory(CID, DESC, CONTRACT_ID, factory); + }, + + unregister: function() { + registrar.unregisterFactory(CID, factory); + + Preferences.reset(HSTS_PRELOAD_LIST_PREF); + Preferences.reset(CERT_PINNING_ENFORCEMENT_PREF); + + // clear collected HSTS and HPKP state + // through the site security service + sss.clearAll(); + sss.clearPreloads(); + }, + }; +}; diff --git a/testing/marionette/driver.js b/testing/marionette/driver.js index b2a20441740a..ab261944208f 100644 --- a/testing/marionette/driver.js +++ b/testing/marionette/driver.js @@ -23,6 +23,7 @@ Cu.import("chrome://marionette/content/addon.js"); Cu.import("chrome://marionette/content/assert.js"); Cu.import("chrome://marionette/content/atom.js"); Cu.import("chrome://marionette/content/browser.js"); +Cu.import("chrome://marionette/content/cert.js"); Cu.import("chrome://marionette/content/element.js"); Cu.import("chrome://marionette/content/error.js"); Cu.import("chrome://marionette/content/evaluate.js"); @@ -496,6 +497,16 @@ GeckoDriver.prototype.newSession = function*(cmd, resp) { this.newSessionCommandId = cmd.id; this.setSessionCapabilities(cmd.parameters.capabilities); + + this.scriptTimeout = 10000; + + this.secureTLS = !this.sessionCapabilities.acceptInsecureCerts; + if (!this.secureTLS) { + logger.warn("TLS certificate errors will be ignored for this session"); + let acceptAllCerts = new cert.InsecureSweepingOverride(); + cert.installOverride(acceptAllCerts); + } + // If we are testing accessibility with marionette, start a11y service in // chrome first. This will ensure that we do not have any content-only // services hanging around. @@ -504,8 +515,6 @@ GeckoDriver.prototype.newSession = function*(cmd, resp) { logger.info("Preemptively starting accessibility service in Chrome"); } - this.scriptTimeout = 10000; - let registerBrowsers = this.registerPromise(); let browserListening = this.listeningPromise(); @@ -654,13 +663,6 @@ GeckoDriver.prototype.setSessionCapabilities = function(newCaps) { caps = copy(newCaps, caps); logger.config("Changing capabilities: " + JSON.stringify(caps)); - // update session state - this.secureTLS = !caps.acceptInsecureCerts; - if (!this.secureTLS) { - logger.warn("Invalid or self-signed TLS certificates " + - "will be discarded for this session"); - } - this.sessionCapabilities = caps; }; @@ -2312,7 +2314,9 @@ GeckoDriver.prototype.sessionTearDown = function(cmd, resp) { } this.observing = null; } + this.sandboxes.clear(); + cert.uninstallOverride(); }; /** diff --git a/testing/marionette/harness/marionette/tests/unit/test_capabilities.py b/testing/marionette/harness/marionette/tests/unit/test_capabilities.py index 22df8d5cf1d6..2a5e61ab1977 100644 --- a/testing/marionette/harness/marionette/tests/unit/test_capabilities.py +++ b/testing/marionette/harness/marionette/tests/unit/test_capabilities.py @@ -34,9 +34,8 @@ class TestCapabilities(MarionetteTestCase): def test_supported_features(self): self.assertIn("rotatable", self.caps) - self.assertIn("acceptSslCerts", self.caps) - - self.assertFalse(self.caps["acceptSslCerts"]) + self.assertIn("acceptInsecureCerts", self.caps) + self.assertFalse(self.caps["acceptInsecureCerts"]) def test_additional_capabilities(self): self.assertIn("processId", self.caps) diff --git a/testing/marionette/harness/marionette/tests/unit/test_navigation.py b/testing/marionette/harness/marionette/tests/unit/test_navigation.py index 59c07cbd1db2..af4aba1d4d2c 100644 --- a/testing/marionette/harness/marionette/tests/unit/test_navigation.py +++ b/testing/marionette/harness/marionette/tests/unit/test_navigation.py @@ -4,10 +4,10 @@ import time import urllib +import contextlib from marionette import MarionetteTestCase -from marionette_driver.errors import MarionetteException, TimeoutException -from marionette_driver import By, Wait +from marionette_driver import errors, By, Wait def inline(doc): @@ -15,15 +15,22 @@ def inline(doc): class TestNavigate(MarionetteTestCase): + def setUp(self): MarionetteTestCase.setUp(self) self.marionette.navigate("about:") self.test_doc = self.marionette.absolute_url("test.html") self.iframe_doc = self.marionette.absolute_url("test_iframe.html") + @property + def location_href(self): + return self.marionette.execute_script("return window.location.href") + def test_set_location_through_execute_script(self): - self.marionette.execute_script("window.location.href = '%s'" % self.test_doc) - Wait(self.marionette).until(lambda _: self.test_doc == self.location_href) + self.marionette.execute_script( + "window.location.href = '%s'" % self.test_doc) + Wait(self.marionette).until( + lambda _: self.test_doc == self.location_href) self.assertEqual("Marionette Test", self.marionette.title) def test_navigate(self): @@ -33,7 +40,8 @@ class TestNavigate(MarionetteTestCase): def test_navigate_chrome_error(self): with self.marionette.using_context("chrome"): - self.assertRaisesRegexp(MarionetteException, "Cannot navigate in chrome context", + self.assertRaisesRegexp( + errors.MarionetteException, "Cannot navigate in chrome context", self.marionette.navigate, "about:blank") def test_get_current_url_returns_top_level_browsing_context_url(self): @@ -96,18 +104,9 @@ class TestNavigate(MarionetteTestCase): self.assertTrue('test_iframe.html' in self.marionette.get_url()) """ - def test_should_not_error_if_nonexistent_url_used(self): - try: + def test_invalid_protocol(self): + with self.assertRaises(errors.MarionetteException): self.marionette.navigate("thisprotocoldoesnotexist://") - self.fail("Should have thrown a MarionetteException") - except TimeoutException: - self.fail("The socket shouldn't have timed out when navigating to a non-existent URL") - except MarionetteException as e: - self.assertIn("Reached error page", str(e)) - except Exception as e: - import traceback - print traceback.format_exc() - self.fail("Should have thrown a MarionetteException instead of %s" % type(e)) def test_should_navigate_to_requested_about_page(self): self.marionette.navigate("about:neterror") @@ -118,12 +117,13 @@ class TestNavigate(MarionetteTestCase): def test_find_element_state_complete(self): self.marionette.navigate(self.test_doc) - state = self.marionette.execute_script("return window.document.readyState") + state = self.marionette.execute_script( + "return window.document.readyState") self.assertEqual("complete", state) self.assertTrue(self.marionette.find_element(By.ID, "mozLink")) def test_error_when_exceeding_page_load_timeout(self): - with self.assertRaises(TimeoutException): + with self.assertRaises(errors.TimeoutException): self.marionette.timeout.page_load = 0 self.marionette.navigate(self.marionette.absolute_url("slow")) self.marionette.find_element(By.TAG_NAME, "p") @@ -138,8 +138,74 @@ class TestNavigate(MarionetteTestCase): self.marionette.navigate(doc) self.marionette.execute_script("window.visited = true", sandbox=None) self.marionette.navigate("%s#foo" % doc) - self.assertTrue(self.marionette.execute_script("return window.visited", sandbox=None)) + self.assertTrue(self.marionette.execute_script( + "return window.visited", sandbox=None)) - @property - def location_href(self): - return self.marionette.execute_script("return window.location.href") + def test_error_on_tls_navigation(self): + self.assertRaises(errors.InsecureCertificateException, + self.marionette.navigate, self.fixtures.where_is("/test.html", on="https")) + + +class TestTLSNavigation(MarionetteTestCase): + insecure_tls = {"acceptInsecureCerts": True} + secure_tls = {"acceptInsecureCerts": False} + + def setUp(self): + MarionetteTestCase.setUp(self) + self.marionette.delete_session() + self.capabilities = self.marionette.start_session( + desired_capabilities=self.insecure_tls) + + def tearDown(self): + try: + self.marionette.delete_session() + except: + pass + MarionetteTestCase.tearDown(self) + + @contextlib.contextmanager + def safe_session(self): + try: + self.capabilities = self.marionette.start_session( + desired_capabilities=self.secure_tls) + yield self.marionette + finally: + self.marionette.delete_session() + + @contextlib.contextmanager + def unsafe_session(self): + try: + self.capabilities = self.marionette.start_session( + desired_capabilities=self.insecure_tls) + yield self.marionette + finally: + self.marionette.delete_session() + + def test_navigate_by_command(self): + self.marionette.navigate( + self.fixtures.where_is("/test.html", on="https")) + self.assertIn("https", self.marionette.get_url()) + + def test_navigate_by_click(self): + link_url = self.fixtures.where_is("/test.html", on="https") + self.marionette.navigate( + inline("https is the future" % link_url)) + self.marionette.find_element(By.TAG_NAME, "a").click() + self.assertIn("https", self.marionette.get_url()) + + def test_deactivation(self): + invalid_cert_url = self.fixtures.where_is("/test.html", on="https") + + print "with safe session" + with self.safe_session() as session: + with self.assertRaises(errors.InsecureCertificateException): + session.navigate(invalid_cert_url) + + print "with unsafe session" + with self.unsafe_session() as session: + session.navigate(invalid_cert_url) + + print "with safe session again" + with self.safe_session() as session: + with self.assertRaises(errors.InsecureCertificateException): + session.navigate(invalid_cert_url) diff --git a/testing/marionette/jar.mn b/testing/marionette/jar.mn index 2a88c59440a5..b415f21f1681 100644 --- a/testing/marionette/jar.mn +++ b/testing/marionette/jar.mn @@ -15,6 +15,7 @@ marionette.jar: content/element.js (element.js) content/simpletest.js (simpletest.js) content/frame.js (frame.js) + content/cert.js (cert.js) content/event.js (event.js) content/error.js (error.js) content/message.js (message.js) From ec4f115396528bff60d31907aeee24598462fd53 Mon Sep 17 00:00:00 2001 From: Mark Hammond Date: Fri, 25 Nov 2016 09:01:05 +1100 Subject: [PATCH 26/53] Bug 1320193 - remove trailing \n from log message. r=glasserc MozReview-Commit-ID: LwdPOwXmS5i --HG-- extra : rebase_source : b24ad9ec2ccb30e33e24731d0b19fdcc08348792 --- toolkit/components/extensions/ExtensionStorageSync.jsm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toolkit/components/extensions/ExtensionStorageSync.jsm b/toolkit/components/extensions/ExtensionStorageSync.jsm index 9ebdb6235d67..4acb870ed59e 100644 --- a/toolkit/components/extensions/ExtensionStorageSync.jsm +++ b/toolkit/components/extensions/ExtensionStorageSync.jsm @@ -395,7 +395,7 @@ this.ExtensionStorageSync = { syncAll: Task.async(function* () { const extensions = extensionContexts.keys(); const extIds = Array.from(extensions, extension => extension.id); - log.debug(`Syncing extension settings for ${JSON.stringify(extIds)}\n`); + log.debug(`Syncing extension settings for ${JSON.stringify(extIds)}`); if (extIds.length == 0) { // No extensions to sync. Get out. return; From 5fe8073117a1a10ea6ee5c2bbb6368f939c6ef36 Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Fri, 25 Nov 2016 00:18:19 +0100 Subject: [PATCH 27/53] Backed out changeset 9fae5015803b (bug 1103196) --- testing/marionette/cert.js | 140 ------------------ testing/marionette/driver.js | 22 ++- .../tests/unit/test_capabilities.py | 5 +- .../marionette/tests/unit/test_navigation.py | 110 +++----------- testing/marionette/jar.mn | 1 - 5 files changed, 34 insertions(+), 244 deletions(-) delete mode 100644 testing/marionette/cert.js diff --git a/testing/marionette/cert.js b/testing/marionette/cert.js deleted file mode 100644 index 707647ac94bc..000000000000 --- a/testing/marionette/cert.js +++ /dev/null @@ -1,140 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -"use strict"; - -const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components; - -Cu.import("resource://gre/modules/Preferences.jsm"); -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); - -this.EXPORTED_SYMBOLS = ["cert"]; - -const registrar = - Components.manager.QueryInterface(Ci.nsIComponentRegistrar); -const sss = Cc["@mozilla.org/ssservice;1"] - .getService(Ci.nsISiteSecurityService); - -const CONTRACT_ID = "@mozilla.org/security/certoverride;1"; -const CERT_PINNING_ENFORCEMENT_PREF = - "security.cert_pinning.enforcement_level"; -const HSTS_PRELOAD_LIST_PREF = - "network.stricttransportsecurity.preloadlist"; - -/** TLS certificate service override management for Marionette. */ -this.cert = { - Error: { - Untrusted: 1, - Mismatch: 2, - Time: 4, - }, - - currentOverride: null, -}; - -/** - * Installs a TLS certificate service override. - * - * The provided |service| must implement the |register| and |unregister| - * functions that causes a new |nsICertOverrideService| interface - * implementation to be registered with the |nsIComponentRegistrar|. - * - * After |service| is registered and made the |cert.currentOverride|, - * |nsICertOverrideService| is reinitialised to cause all Gecko components - * to pick up the new service. - * - * If an override is already installed, i.e. when |cert.currentOverride| - * is not null, this functions acts as a NOOP. - * - * @param {cert.Override} service - * Service generator that registers and unregisters the XPCOM service. - * - * @throws {Components.Exception} - * If unable to register or initialise |service|. - */ -cert.installOverride = function(service) { - if (this.currentOverride) { - return; - } - - service.register(); - cert.currentOverride = service; -}; - -/** - * Uninstall a TLS certificate service override. - * - * After the service has been unregistered, |cert.currentOverride| - * is reset to null. - * - * If there no current override installed, i.e. if |cert.currentOverride| - * is null, this function acts as a NOOP. - */ -cert.uninstallOverride = function() { - if (!cert.currentOverride) { - return; - } - cert.currentOverride.unregister(); - this.currentOverride = null; -}; - -/** - * Certificate override service that acts in an all-inclusive manner - * on TLS certificates. - * - * When an invalid certificate is encountered, it is overriden - * with the |matching| bit level, which is typically a combination of - * |cert.Error.Untrusted|, |cert.Error.Mismatch|, and |cert.Error.Time|. - * - * @type cert.Override - * - * @throws {Components.Exception} - * If there are any problems registering the service. - */ -cert.InsecureSweepingOverride = function() { - const CID = Components.ID("{4b67cce0-a51c-11e6-9598-0800200c9a66}"); - const DESC = "All-encompassing cert service that matches on a bitflag"; - - // This needs to be an old-style class with a function constructor - // and prototype assignment because... XPCOM. Any attempt at - // modernisation will be met with cryptic error messages which will - // make your life miserable. - let service = function() {}; - service.prototype = { - hasMatchingOverride: function( - aHostName, aPort, aCert, aOverrideBits, aIsTemporary) { - aIsTemporary.value = false; - aOverrideBits.value = - cert.Error.Untrusted | cert.Error.Mismatch | cert.Error.Time; - - return true; - }, - - QueryInterface: XPCOMUtils.generateQI([Ci.nsICertOverrideService]), - }; - let factory = XPCOMUtils.generateSingletonFactory(service); - - return { - register: function() { - // make it possible to register certificate overrides for domains - // that use HSTS or HPKP - Preferences.set(HSTS_PRELOAD_LIST_PREF, false); - Preferences.set(CERT_PINNING_ENFORCEMENT_PREF, 0); - - registrar.registerFactory(CID, DESC, CONTRACT_ID, factory); - }, - - unregister: function() { - registrar.unregisterFactory(CID, factory); - - Preferences.reset(HSTS_PRELOAD_LIST_PREF); - Preferences.reset(CERT_PINNING_ENFORCEMENT_PREF); - - // clear collected HSTS and HPKP state - // through the site security service - sss.clearAll(); - sss.clearPreloads(); - }, - }; -}; diff --git a/testing/marionette/driver.js b/testing/marionette/driver.js index ab261944208f..b2a20441740a 100644 --- a/testing/marionette/driver.js +++ b/testing/marionette/driver.js @@ -23,7 +23,6 @@ Cu.import("chrome://marionette/content/addon.js"); Cu.import("chrome://marionette/content/assert.js"); Cu.import("chrome://marionette/content/atom.js"); Cu.import("chrome://marionette/content/browser.js"); -Cu.import("chrome://marionette/content/cert.js"); Cu.import("chrome://marionette/content/element.js"); Cu.import("chrome://marionette/content/error.js"); Cu.import("chrome://marionette/content/evaluate.js"); @@ -497,16 +496,6 @@ GeckoDriver.prototype.newSession = function*(cmd, resp) { this.newSessionCommandId = cmd.id; this.setSessionCapabilities(cmd.parameters.capabilities); - - this.scriptTimeout = 10000; - - this.secureTLS = !this.sessionCapabilities.acceptInsecureCerts; - if (!this.secureTLS) { - logger.warn("TLS certificate errors will be ignored for this session"); - let acceptAllCerts = new cert.InsecureSweepingOverride(); - cert.installOverride(acceptAllCerts); - } - // If we are testing accessibility with marionette, start a11y service in // chrome first. This will ensure that we do not have any content-only // services hanging around. @@ -515,6 +504,8 @@ GeckoDriver.prototype.newSession = function*(cmd, resp) { logger.info("Preemptively starting accessibility service in Chrome"); } + this.scriptTimeout = 10000; + let registerBrowsers = this.registerPromise(); let browserListening = this.listeningPromise(); @@ -663,6 +654,13 @@ GeckoDriver.prototype.setSessionCapabilities = function(newCaps) { caps = copy(newCaps, caps); logger.config("Changing capabilities: " + JSON.stringify(caps)); + // update session state + this.secureTLS = !caps.acceptInsecureCerts; + if (!this.secureTLS) { + logger.warn("Invalid or self-signed TLS certificates " + + "will be discarded for this session"); + } + this.sessionCapabilities = caps; }; @@ -2314,9 +2312,7 @@ GeckoDriver.prototype.sessionTearDown = function(cmd, resp) { } this.observing = null; } - this.sandboxes.clear(); - cert.uninstallOverride(); }; /** diff --git a/testing/marionette/harness/marionette/tests/unit/test_capabilities.py b/testing/marionette/harness/marionette/tests/unit/test_capabilities.py index 2a5e61ab1977..22df8d5cf1d6 100644 --- a/testing/marionette/harness/marionette/tests/unit/test_capabilities.py +++ b/testing/marionette/harness/marionette/tests/unit/test_capabilities.py @@ -34,8 +34,9 @@ class TestCapabilities(MarionetteTestCase): def test_supported_features(self): self.assertIn("rotatable", self.caps) - self.assertIn("acceptInsecureCerts", self.caps) - self.assertFalse(self.caps["acceptInsecureCerts"]) + self.assertIn("acceptSslCerts", self.caps) + + self.assertFalse(self.caps["acceptSslCerts"]) def test_additional_capabilities(self): self.assertIn("processId", self.caps) diff --git a/testing/marionette/harness/marionette/tests/unit/test_navigation.py b/testing/marionette/harness/marionette/tests/unit/test_navigation.py index af4aba1d4d2c..59c07cbd1db2 100644 --- a/testing/marionette/harness/marionette/tests/unit/test_navigation.py +++ b/testing/marionette/harness/marionette/tests/unit/test_navigation.py @@ -4,10 +4,10 @@ import time import urllib -import contextlib from marionette import MarionetteTestCase -from marionette_driver import errors, By, Wait +from marionette_driver.errors import MarionetteException, TimeoutException +from marionette_driver import By, Wait def inline(doc): @@ -15,22 +15,15 @@ def inline(doc): class TestNavigate(MarionetteTestCase): - def setUp(self): MarionetteTestCase.setUp(self) self.marionette.navigate("about:") self.test_doc = self.marionette.absolute_url("test.html") self.iframe_doc = self.marionette.absolute_url("test_iframe.html") - @property - def location_href(self): - return self.marionette.execute_script("return window.location.href") - def test_set_location_through_execute_script(self): - self.marionette.execute_script( - "window.location.href = '%s'" % self.test_doc) - Wait(self.marionette).until( - lambda _: self.test_doc == self.location_href) + self.marionette.execute_script("window.location.href = '%s'" % self.test_doc) + Wait(self.marionette).until(lambda _: self.test_doc == self.location_href) self.assertEqual("Marionette Test", self.marionette.title) def test_navigate(self): @@ -40,8 +33,7 @@ class TestNavigate(MarionetteTestCase): def test_navigate_chrome_error(self): with self.marionette.using_context("chrome"): - self.assertRaisesRegexp( - errors.MarionetteException, "Cannot navigate in chrome context", + self.assertRaisesRegexp(MarionetteException, "Cannot navigate in chrome context", self.marionette.navigate, "about:blank") def test_get_current_url_returns_top_level_browsing_context_url(self): @@ -104,9 +96,18 @@ class TestNavigate(MarionetteTestCase): self.assertTrue('test_iframe.html' in self.marionette.get_url()) """ - def test_invalid_protocol(self): - with self.assertRaises(errors.MarionetteException): + def test_should_not_error_if_nonexistent_url_used(self): + try: self.marionette.navigate("thisprotocoldoesnotexist://") + self.fail("Should have thrown a MarionetteException") + except TimeoutException: + self.fail("The socket shouldn't have timed out when navigating to a non-existent URL") + except MarionetteException as e: + self.assertIn("Reached error page", str(e)) + except Exception as e: + import traceback + print traceback.format_exc() + self.fail("Should have thrown a MarionetteException instead of %s" % type(e)) def test_should_navigate_to_requested_about_page(self): self.marionette.navigate("about:neterror") @@ -117,13 +118,12 @@ class TestNavigate(MarionetteTestCase): def test_find_element_state_complete(self): self.marionette.navigate(self.test_doc) - state = self.marionette.execute_script( - "return window.document.readyState") + state = self.marionette.execute_script("return window.document.readyState") self.assertEqual("complete", state) self.assertTrue(self.marionette.find_element(By.ID, "mozLink")) def test_error_when_exceeding_page_load_timeout(self): - with self.assertRaises(errors.TimeoutException): + with self.assertRaises(TimeoutException): self.marionette.timeout.page_load = 0 self.marionette.navigate(self.marionette.absolute_url("slow")) self.marionette.find_element(By.TAG_NAME, "p") @@ -138,74 +138,8 @@ class TestNavigate(MarionetteTestCase): self.marionette.navigate(doc) self.marionette.execute_script("window.visited = true", sandbox=None) self.marionette.navigate("%s#foo" % doc) - self.assertTrue(self.marionette.execute_script( - "return window.visited", sandbox=None)) + self.assertTrue(self.marionette.execute_script("return window.visited", sandbox=None)) - def test_error_on_tls_navigation(self): - self.assertRaises(errors.InsecureCertificateException, - self.marionette.navigate, self.fixtures.where_is("/test.html", on="https")) - - -class TestTLSNavigation(MarionetteTestCase): - insecure_tls = {"acceptInsecureCerts": True} - secure_tls = {"acceptInsecureCerts": False} - - def setUp(self): - MarionetteTestCase.setUp(self) - self.marionette.delete_session() - self.capabilities = self.marionette.start_session( - desired_capabilities=self.insecure_tls) - - def tearDown(self): - try: - self.marionette.delete_session() - except: - pass - MarionetteTestCase.tearDown(self) - - @contextlib.contextmanager - def safe_session(self): - try: - self.capabilities = self.marionette.start_session( - desired_capabilities=self.secure_tls) - yield self.marionette - finally: - self.marionette.delete_session() - - @contextlib.contextmanager - def unsafe_session(self): - try: - self.capabilities = self.marionette.start_session( - desired_capabilities=self.insecure_tls) - yield self.marionette - finally: - self.marionette.delete_session() - - def test_navigate_by_command(self): - self.marionette.navigate( - self.fixtures.where_is("/test.html", on="https")) - self.assertIn("https", self.marionette.get_url()) - - def test_navigate_by_click(self): - link_url = self.fixtures.where_is("/test.html", on="https") - self.marionette.navigate( - inline("https is the future" % link_url)) - self.marionette.find_element(By.TAG_NAME, "a").click() - self.assertIn("https", self.marionette.get_url()) - - def test_deactivation(self): - invalid_cert_url = self.fixtures.where_is("/test.html", on="https") - - print "with safe session" - with self.safe_session() as session: - with self.assertRaises(errors.InsecureCertificateException): - session.navigate(invalid_cert_url) - - print "with unsafe session" - with self.unsafe_session() as session: - session.navigate(invalid_cert_url) - - print "with safe session again" - with self.safe_session() as session: - with self.assertRaises(errors.InsecureCertificateException): - session.navigate(invalid_cert_url) + @property + def location_href(self): + return self.marionette.execute_script("return window.location.href") diff --git a/testing/marionette/jar.mn b/testing/marionette/jar.mn index b415f21f1681..2a88c59440a5 100644 --- a/testing/marionette/jar.mn +++ b/testing/marionette/jar.mn @@ -15,7 +15,6 @@ marionette.jar: content/element.js (element.js) content/simpletest.js (simpletest.js) content/frame.js (frame.js) - content/cert.js (cert.js) content/event.js (event.js) content/error.js (error.js) content/message.js (message.js) From 96d5b195adf1a590577a95085b152c41fe9da7f5 Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Fri, 25 Nov 2016 00:18:23 +0100 Subject: [PATCH 28/53] Backed out changeset f27d827ba404 (bug 1103196) --- testing/marionette/driver.js | 19 +++++++------------ testing/marionette/listener.js | 9 ++------- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/testing/marionette/driver.js b/testing/marionette/driver.js index b2a20441740a..904ae2856c9c 100644 --- a/testing/marionette/driver.js +++ b/testing/marionette/driver.js @@ -1413,22 +1413,17 @@ GeckoDriver.prototype.switchToParentFrame = function*(cmd, resp) { GeckoDriver.prototype.switchToFrame = function*(cmd, resp) { let {id, element, focus} = cmd.parameters; - const otherErrorsExpr = /about:.+(error)|(blocked)\?/; - const checkTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); - + let checkTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); let curWindow = this.getCurrentWindow(); let checkLoad = function() { - let win = this.getCurrentWindow(); - if (win.document.readyState == "complete") { + let errorRegex = /about:.+(error)|(blocked)\?/; + let curWindow = this.getCurrentWindow(); + if (curWindow.document.readyState == "complete") { return; - } else if (win.document.readyState == "interactive") { - let baseURI = win.document.baseURI; - if (baseURI.startsWith("about:certerror")) { - throw new InsecureCertificateError(); - } else if (otherErrorsExpr.exec(win.document.baseURI)) { - throw new UnknownError("Error loading page"); - } + } else if (curWindow.document.readyState == "interactive" && + errorRegex.exec(curWindow.document.baseURI)) { + throw new UnknownError("Error loading page"); } checkTimer.initWithCallback(checkLoad.bind(this), 100, Ci.nsITimer.TYPE_ONE_SHOT); diff --git a/testing/marionette/listener.js b/testing/marionette/listener.js index ae0a409d0eda..de1300f17bad 100644 --- a/testing/marionette/listener.js +++ b/testing/marionette/listener.js @@ -875,15 +875,10 @@ function pollForReadyState(msg, start = undefined, callback = undefined) { callback(); sendOk(command_id); - // document with an insecure cert - } else if (doc.readyState == "interactive" && - doc.baseURI.startsWith("about:certerror")) { - callback(); - sendError(new InsecureCertificateError(), command_id); - // we have reached an error url without requesting it } else if (doc.readyState == "interactive" && - /about:.+(error)\?/.exec(doc.baseURI)) { + /about:.+(error)\?/.exec(doc.baseURI) && + !doc.baseURI.startsWith(url)) { callback(); sendError(new UnknownError("Reached error page: " + doc.baseURI), command_id); From 42f8e73f8620c756ebfec75791bd16722d12625a Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Fri, 25 Nov 2016 00:18:27 +0100 Subject: [PATCH 29/53] Backed out changeset 0c28b77a3279 (bug 1103196) --- testing/marionette/client/marionette_driver/errors.py | 4 ---- testing/marionette/error.js | 8 -------- 2 files changed, 12 deletions(-) diff --git a/testing/marionette/client/marionette_driver/errors.py b/testing/marionette/client/marionette_driver/errors.py index d03a320599b3..ba748b4f5e36 100644 --- a/testing/marionette/client/marionette_driver/errors.py +++ b/testing/marionette/client/marionette_driver/errors.py @@ -55,10 +55,6 @@ class ElementNotSelectableException(MarionetteException): status = "element not selectable" -class InsecureCertificateException(MarionetteException): - status = "insecure certificate" - - class InvalidArgumentException(MarionetteException): status = "invalid argument" diff --git a/testing/marionette/error.js b/testing/marionette/error.js index 3d27a1f207b2..e8321be695e6 100644 --- a/testing/marionette/error.js +++ b/testing/marionette/error.js @@ -9,7 +9,6 @@ const {interfaces: Ci, utils: Cu} = Components; const ERRORS = new Set([ "ElementNotAccessibleError", "ElementNotVisibleError", - "InsecureCertificateError", "InvalidArgumentError", "InvalidElementStateError", "InvalidSelectorError", @@ -230,13 +229,6 @@ this.ElementNotVisibleError = function(msg) { }; ElementNotVisibleError.prototype = Object.create(WebDriverError.prototype); -this.InsecureCertificateError = function(msg) { - WebDriverError.call(this, msg); - this.name = "InsecureCertificateError"; - this.status = "insecure certificate"; -}; -InsecureCertificateError.prototype = Object.create(WebDriverError.prototype); - this.InvalidArgumentError = function(msg) { WebDriverError.call(this, msg); this.name = "InvalidArgumentError"; From f57f50c634c0bf7c0abeca6b0fd3b4891ce7f397 Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Fri, 25 Nov 2016 00:18:31 +0100 Subject: [PATCH 30/53] Backed out changeset b2910c43905c (bug 1103196) --- testing/marionette/driver.js | 1 + 1 file changed, 1 insertion(+) diff --git a/testing/marionette/driver.js b/testing/marionette/driver.js index 904ae2856c9c..d7ac52e94a3b 100644 --- a/testing/marionette/driver.js +++ b/testing/marionette/driver.js @@ -155,6 +155,7 @@ this.GeckoDriver = function(appName, server) { // supported features "raisesAccessibilityExceptions": false, "rotatable": this.appName == "B2G", + "acceptSslCerts": false, "proxy": {}, // proprietary extensions From c46fde4a80ef1655941d7bb70d3845b59a14ee25 Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Fri, 25 Nov 2016 00:18:36 +0100 Subject: [PATCH 31/53] Backed out changeset 3d2b43bd09e6 (bug 1103196) --- testing/marionette/driver.js | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/testing/marionette/driver.js b/testing/marionette/driver.js index d7ac52e94a3b..0c5bcf97bea0 100644 --- a/testing/marionette/driver.js +++ b/testing/marionette/driver.js @@ -125,10 +125,6 @@ this.GeckoDriver = function(appName, server) { this.searchTimeout = null; this.pageTimeout = 300000; // five minutes - // Unsigned or invalid TLS certificates will be ignored if secureTLS - // is set to false. - this.secureTLS = true; - // The curent context decides if commands should affect chrome- or // content space. this.context = Context.CONTENT; @@ -150,7 +146,6 @@ this.GeckoDriver = function(appName, server) { "browserVersion": Services.appinfo.version, "platformName": Services.sysinfo.getProperty("name").toLowerCase(), "platformVersion": Services.sysinfo.getProperty("version"), - "acceptInsecureCerts": !this.secureTLS, // supported features "raisesAccessibilityExceptions": false, @@ -654,14 +649,6 @@ GeckoDriver.prototype.setSessionCapabilities = function(newCaps) { let caps = copy(this.sessionCapabilities); caps = copy(newCaps, caps); logger.config("Changing capabilities: " + JSON.stringify(caps)); - - // update session state - this.secureTLS = !caps.acceptInsecureCerts; - if (!this.secureTLS) { - logger.warn("Invalid or self-signed TLS certificates " + - "will be discarded for this session"); - } - this.sessionCapabilities = caps; }; From a907d2b98bf0cee7889a803d9ff09e473e5432ac Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Fri, 25 Nov 2016 00:18:40 +0100 Subject: [PATCH 32/53] Backed out changeset b63c853a1b56 (bug 1103196) --- testing/marionette/driver.js | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/testing/marionette/driver.js b/testing/marionette/driver.js index 0c5bcf97bea0..c5387f3b40b6 100644 --- a/testing/marionette/driver.js +++ b/testing/marionette/driver.js @@ -108,38 +108,30 @@ this.GeckoDriver = function(appName, server) { this.browsers = {}; // points to current browser this.curBrowser = null; + this.context = Context.CONTENT; + + this.scriptTimeout = 30000; // 30 seconds + this.searchTimeout = 0; + this.pageTimeout = 300000; // five minutes + + this.timer = null; + this.inactivityTimer = null; + this.marionetteLog = new logging.ContentLogger(); // topmost chrome frame this.mainFrame = null; // chrome iframe that currently has focus this.curFrame = null; this.mainContentFrameId = null; - this.mozBrowserClose = null; + this.importedScripts = new evaluate.ScriptStorageService([Context.CHROME, Context.CONTENT]); this.currentFrameElement = null; + this.testName = null; + this.mozBrowserClose = null; + this.sandboxes = new Sandboxes(() => this.getCurrentWindow()); // frame ID of the current remote frame, used for mozbrowserclose events this.oopFrameId = null; this.observing = null; this._browserIds = new WeakMap(); - // user-defined timeouts - this.scriptTimeout = 30000; // 30 seconds - this.searchTimeout = null; - this.pageTimeout = 300000; // five minutes - - // The curent context decides if commands should affect chrome- or - // content space. - this.context = Context.CONTENT; - - this.importedScripts = new evaluate.ScriptStorageService( - [Context.CHROME, Context.CONTENT]); - this.sandboxes = new Sandboxes(() => this.getCurrentWindow()); - this.actions = new action.Chain(); - - this.timer = null; - this.inactivityTimer = null; - - this.marionetteLog = new logging.ContentLogger(); - this.testName = null; - this.sessionCapabilities = { // mandated capabilities "browserName": Services.appinfo.name.toLowerCase(), From 1c19830a858d80ef27d2f841ec1a6199608163fc Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Fri, 25 Nov 2016 00:18:44 +0100 Subject: [PATCH 33/53] Backed out changeset baa46ca196fa (bug 1103196) --- testing/marionette/driver.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/marionette/driver.js b/testing/marionette/driver.js index c5387f3b40b6..251d6aab52ea 100644 --- a/testing/marionette/driver.js +++ b/testing/marionette/driver.js @@ -138,6 +138,7 @@ this.GeckoDriver = function(appName, server) { "browserVersion": Services.appinfo.version, "platformName": Services.sysinfo.getProperty("name").toLowerCase(), "platformVersion": Services.sysinfo.getProperty("version"), + "specificationLevel": 0, // supported features "raisesAccessibilityExceptions": false, @@ -146,7 +147,6 @@ this.GeckoDriver = function(appName, server) { "proxy": {}, // proprietary extensions - "specificationLevel": 0, "processId" : Services.appinfo.processID, }; From 4a04f654e37eee3a29142ec3616e1eda26341a55 Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Fri, 25 Nov 2016 00:20:30 +0100 Subject: [PATCH 34/53] Backed out changeset 4c42ee29c468 (bug 1103196) for broken Marionette tests on Windows (error loading pages). r=backout --- testing/marionette/harness/MANIFEST.in | 2 - .../marionette/marionette_test/testcases.py | 23 +- .../harness/marionette/runner/base.py | 108 +++++---- .../harness/marionette/runner/httpd.py | 172 +++++-------- .../harness/marionette/runner/serve.py | 226 ------------------ .../harness/marionette/runner/test.cert | 86 ------- .../harness/marionette/runner/test.key | 28 --- .../tests/harness_unit/test_httpd.py | 89 ------- .../harness_unit/test_marionette_runner.py | 4 +- .../tests/harness_unit/test_serve.py | 67 ------ .../marionette/tests/unit/test_httpd.py | 32 +++ .../marionette/tests/unit/unit-tests.ini | 1 + testing/marionette/harness/requirements.txt | 13 +- 13 files changed, 174 insertions(+), 677 deletions(-) delete mode 100755 testing/marionette/harness/marionette/runner/serve.py delete mode 100644 testing/marionette/harness/marionette/runner/test.cert delete mode 100644 testing/marionette/harness/marionette/runner/test.key delete mode 100644 testing/marionette/harness/marionette/tests/harness_unit/test_httpd.py delete mode 100644 testing/marionette/harness/marionette/tests/harness_unit/test_serve.py create mode 100644 testing/marionette/harness/marionette/tests/unit/test_httpd.py diff --git a/testing/marionette/harness/MANIFEST.in b/testing/marionette/harness/MANIFEST.in index dfaa3afa78c7..7dc49db874f9 100644 --- a/testing/marionette/harness/MANIFEST.in +++ b/testing/marionette/harness/MANIFEST.in @@ -4,5 +4,3 @@ recursive-include marionette/chrome * recursive-include marionette/runner/mixins/resources * exclude MANIFEST.in include requirements.txt -include marionette/runner/test.cert -include marionette/runner/test.key diff --git a/testing/marionette/harness/marionette/marionette_test/testcases.py b/testing/marionette/harness/marionette/marionette_test/testcases.py index e3b569814f4c..f83f02245e77 100644 --- a/testing/marionette/harness/marionette/marionette_test/testcases.py +++ b/testing/marionette/harness/marionette/marionette_test/testcases.py @@ -74,12 +74,8 @@ class CommonTestCase(unittest.TestCase): failureException = AssertionError pydebugger = None - def __init__(self, methodName, marionette_weakref, fixtures, **kwargs): + def __init__(self, methodName, **kwargs): super(CommonTestCase, self).__init__(methodName) - self.methodName = methodName - - self._marionette_weakref = marionette_weakref - self.fixtures = fixtures self.loglines = [] self.duration = 0 @@ -229,7 +225,7 @@ class CommonTestCase(unittest.TestCase): @classmethod def add_tests_to_suite(cls, mod_name, filepath, suite, testloader, marionette, - fixtures, testvars, **kwargs): + httpd, testvars): """Add all the tests in the specified file to the specified suite.""" raise NotImplementedError @@ -256,6 +252,7 @@ class CommonTestCase(unittest.TestCase): # proper garbage collection. self.start_time = time.time() self.marionette = self._marionette_weakref() + self.httpd = self._httpd_weakref() if self.marionette.session is None: self.marionette.start_session() self.marionette.timeout.reset() @@ -424,17 +421,21 @@ class MarionetteTestCase(CommonTestCase): match_re = re.compile(r"test_(.*)\.py$") - def __init__(self, marionette_weakref, fixtures, methodName='runTest', + def __init__(self, marionette_weakref, httpd_weakref, methodName='runTest', filepath='', **kwargs): + self._marionette_weakref = marionette_weakref + self._httpd_weakref = httpd_weakref + self.methodName = methodName self.filepath = filepath self.testvars = kwargs.pop('testvars', None) - super(MarionetteTestCase, self).__init__( - methodName, marionette_weakref=marionette_weakref, fixtures=fixtures, **kwargs) + self.marionette = None + + super(MarionetteTestCase, self).__init__(methodName, **kwargs) @classmethod def add_tests_to_suite(cls, mod_name, filepath, suite, testloader, marionette, - fixtures, testvars, **kwargs): + httpd, testvars, **kwargs): # since we use imp.load_source to load test modules, if a module # is loaded with the same name as another one the module would just be # reloaded. @@ -458,7 +459,7 @@ class MarionetteTestCase(CommonTestCase): testnames = testloader.getTestCaseNames(obj) for testname in testnames: suite.addTest(obj(weakref.ref(marionette), - fixtures, + weakref.ref(httpd), methodName=testname, filepath=filepath, testvars=testvars, diff --git a/testing/marionette/harness/marionette/runner/base.py b/testing/marionette/harness/marionette/runner/base.py index 4cabfed58dce..3ece3e1691b1 100644 --- a/testing/marionette/harness/marionette/runner/base.py +++ b/testing/marionette/harness/marionette/runner/base.py @@ -2,7 +2,12 @@ # 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/. +from argparse import ArgumentParser + +from copy import deepcopy import json +import mozinfo +import moznetwork import os import random import re @@ -11,20 +16,19 @@ import sys import time import traceback import unittest -from argparse import ArgumentParser -from copy import deepcopy - -import mozinfo +import warnings import mozprofile -from marionette_driver.marionette import Marionette -import mozversion -import serve + from manifestparser import TestManifest from manifestparser.filters import tags -from moztest.adapters.unit import StructuredTestResult, StructuredTestRunner -from moztest.results import TestResult, TestResultCollection, relevant_line -from serve import iter_proc, iter_url +from marionette_driver.marionette import Marionette +from moztest.adapters.unit import StructuredTestRunner, StructuredTestResult +from moztest.results import TestResultCollection, TestResult, relevant_line +import mozversion + +import httpd + here = os.path.abspath(os.path.dirname(__file__)) @@ -485,11 +489,6 @@ class RemoteMarionetteArguments(object): ] -class Fixtures(object): - def where_is(self, uri, on="http"): - return serve.where_is(uri, on) - - class BaseMarionetteTestRunner(object): textrunnerclass = MarionetteTextTestRunner @@ -507,8 +506,6 @@ class BaseMarionetteTestRunner(object): socket_timeout=BaseMarionetteArguments.socket_timeout_default, startup_timeout=None, addons=None, workspace=None, verbose=0, e10s=True, emulator=False, **kwargs): - self.fixture_servers = {} - self.fixtures = Fixtures() self.extra_kwargs = kwargs self.test_kwargs = deepcopy(kwargs) self.address = address @@ -519,6 +516,7 @@ class BaseMarionetteTestRunner(object): self.profile = profile self.addons = addons self.logger = logger + self.httpd = None self.marionette = None self.logdir = logdir self.repeat = repeat @@ -671,6 +669,7 @@ class BaseMarionetteTestRunner(object): @bin.setter def bin(self, path): """Set binary and reset parts of runner accordingly. + Intended use: to change binary between calls to run_tests """ self._bin = path @@ -762,6 +761,30 @@ class BaseMarionetteTestRunner(object): assert len(self.test_handlers) > 0 self.reset_test_stats() + def _start_marionette(self): + need_external_ip = True + if not self.marionette: + self.marionette = self.driverclass(**self._build_kwargs()) + # if we're working against a desktop version, we usually don't need + # an external ip + if self.appName != 'fennec': + need_external_ip = False + self.logger.info('Initial Profile Destination is ' + '"{}"'.format(self.marionette.profile_path)) + return need_external_ip + + def _set_baseurl(self, need_external_ip): + # Gaia sets server_root and that means we shouldn't spin up our own httpd + if not self.httpd: + if self.server_root is None or os.path.isdir(self.server_root): + self.logger.info("starting httpd") + self.start_httpd(need_external_ip) + self.marionette.baseurl = self.httpd.get_url() + self.logger.info("running httpd on {}".format(self.marionette.baseurl)) + else: + self.marionette.baseurl = self.server_root + self.logger.info("using remote content from {}".format(self.marionette.baseurl)) + def _add_tests(self, tests): for test in tests: self.add_test(test) @@ -790,19 +813,8 @@ class BaseMarionetteTestRunner(object): start_time = time.time() self._initialize_test_run(tests) - if self.marionette is None: - self.marionette = self.driverclass(**self._build_kwargs()) - self.logger.info("Profile path is %s" % self.marionette.profile_path) - - if len(self.fixture_servers) == 0 or \ - any(not server.is_alive for _, server in self.fixture_servers): - self.logger.info("Starting fixture servers") - self.fixture_servers = self.start_fixture_servers() - for url in iter_url(self.fixture_servers): - self.logger.info("Fixture server listening on %s" % url) - - # backwards compatibility - self.marionette.baseurl = serve.where_is("/") + need_external_ip = self._start_marionette() + self._set_baseurl(need_external_ip) self._add_tests(tests) @@ -811,17 +823,14 @@ class BaseMarionetteTestRunner(object): try: device_info = self.marionette.instance.runner.device.dm.getInfo() except Exception: - self.logger.warning('Could not get device info', exc_info=True) + self.logger.warning('Could not get device info.') # TODO: Get version_info in Fennec case version_info = None if self.bin: version_info = mozversion.get_version(binary=self.bin) - if self.e10s: - self.logger.info("e10s is enabled") - else: - self.logger.info("e10s is disabled") + self.logger.info("running with e10s: {}".format(self.e10s)) self.logger.suite_start(self.tests, version_info=version_info, @@ -857,8 +866,9 @@ class BaseMarionetteTestRunner(object): for run_tests in self.mixin_run_tests: run_tests(tests) if self.shuffle: - self.logger.info("Using shuffle seed: %d" % self.shuffle_seed) + self.logger.info("Using seed where seed is:{}".format(self.shuffle_seed)) + self.logger.info('mode: {}'.format('e10s' if self.e10s else 'non-e10s')) self.logger.suite_end() except: # raise only the exception if we were not interrupted @@ -890,9 +900,19 @@ class BaseMarionetteTestRunner(object): for failed_test in self.failures: self.logger.info('{}'.format(failed_test[0])) - def start_fixture_servers(self): + def start_httpd(self, need_external_ip): + warnings.warn("start_httpd has been deprecated in favour of create_httpd", + DeprecationWarning) + self.httpd = self.create_httpd(need_external_ip) + + def create_httpd(self, need_external_ip): + host = "127.0.0.1" + if need_external_ip: + host = moznetwork.get_ip() root = self.server_root or os.path.join(os.path.dirname(here), "www") - return serve.start(root) + rv = httpd.FixtureServer(root, host=host) + rv.start() + return rv def add_test(self, test, expected='pass'): filepath = os.path.abspath(test) @@ -952,6 +972,7 @@ class BaseMarionetteTestRunner(object): self.tests.append({'filepath': filepath, 'expected': expected}) def run_test(self, filepath, expected): + testloader = unittest.TestLoader() suite = unittest.TestSuite() self.test_kwargs['expected'] = expected @@ -963,7 +984,7 @@ class BaseMarionetteTestRunner(object): suite, testloader, self.marionette, - self.fixtures, + self.httpd, self.testvars, **self.test_kwargs) break @@ -1029,13 +1050,12 @@ class BaseMarionetteTestRunner(object): self.run_test_set(self.tests) def cleanup(self): - for proc in iter_proc(self.fixture_servers): - proc.stop() - proc.kill() - self.fixture_servers = {} + if hasattr(self, 'httpd') and self.httpd: + self.httpd.stop() + self.httpd = None if hasattr(self, 'marionette') and self.marionette: - if self.marionette.instance is not None: + if self.marionette.instance: self.marionette.instance.close() self.marionette.instance = None diff --git a/testing/marionette/harness/marionette/runner/httpd.py b/testing/marionette/harness/marionette/runner/httpd.py index 2136e2bccb17..968933124c1f 100755 --- a/testing/marionette/harness/marionette/runner/httpd.py +++ b/testing/marionette/harness/marionette/runner/httpd.py @@ -1,28 +1,61 @@ -#!/usr/bin/env python - # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -"""Specialisation of wptserver.server.WebTestHttpd for testing -Marionette. - -""" - -import argparse import os -import select -import sys import time -import urlparse from wptserve import server, handlers, routes as default_routes -here = os.path.abspath(os.path.dirname(__file__)) -default_doc_root = os.path.join(os.path.dirname(here), "www") -default_ssl_cert = os.path.join(here, "test.cert") -default_ssl_key = os.path.join(here, "test.key") +class FixtureServer(object): + + def __init__(self, root, host="127.0.0.1", port=0): + if not os.path.isdir(root): + raise IOError("Server root is not a valid path: {}".format(root)) + self.root = root + self.host = host + self.port = port + self._server = None + + def start(self, block=False): + if self.alive: + return + routes = [("POST", "/file_upload", upload_handler), + ("GET", "/slow", slow_loading_document)] + routes.extend(default_routes.routes) + self._server = server.WebTestHttpd( + port=self.port, + doc_root=self.root, + routes=routes, + host=self.host, + ) + self._server.start(block=block) + self.port = self._server.httpd.server_port + self.base_url = self.get_url() + + def stop(self): + if not self.alive: + return + self._server.stop() + self._server = None + + @property + def alive(self): + return self._server is not None + + def get_url(self, path="/"): + if not self.alive: + raise Exception("Server not started") + return self._server.get_url(path) + + @property + def router(self): + return self._server.router + + @property + def routes(self): + return self._server.router.routes @handlers.handler @@ -38,105 +71,12 @@ def slow_loading_document(request, response):

ok""" -class NotAliveError(Exception): - """Occurs when attempting to run a function that requires the HTTPD - to have been started, and it has not. - - """ - pass - - -class FixtureServer(object): - - def __init__(self, doc_root, url="http://127.0.0.1:0", use_ssl=False, - ssl_cert=None, ssl_key=None): - if not os.path.isdir(doc_root): - raise ValueError("Server root is not a directory: %s" % doc_root) - - url = urlparse.urlparse(url) - if url.scheme is None: - raise ValueError("Server scheme not provided") - - scheme, host, port = url.scheme, url.hostname, url.port - if host is None: - host = "127.0.0.1" - if port is None: - port = 0 - - routes = [("POST", "/file_upload", upload_handler), - ("GET", "/slow", slow_loading_document)] - routes.extend(default_routes.routes) - - self._httpd = server.WebTestHttpd(host=host, - port=port, - bind_hostname=True, - doc_root=doc_root, - routes=routes, - use_ssl=True if scheme == "https" else False, - certificate=ssl_cert, - key_file=ssl_key) - - def start(self, block=False): - if self.is_alive: - return - self._httpd.start(block=block) - - def wait(self): - if not self.is_alive: - return - try: - select.select([], [], []) - except KeyboardInterrupt: - self.stop() - - def stop(self): - if not self.is_alive: - return - self._httpd.stop() - - def get_url(self, path): - if not self.is_alive: - raise NotAliveError() - return self._httpd.get_url(path) - - @property - def doc_root(self): - return self._httpd.router.doc_root - - @property - def router(self): - return self._httpd.router - - @property - def routes(self): - return self._httpd.router.routes - - @property - def is_alive(self): - return self._httpd.started - - if __name__ == "__main__": - parser = argparse.ArgumentParser( - description="Specialised HTTP server for testing Marionette.") - parser.add_argument("url", help=""" -service address including scheme, hostname, port, and prefix for document root, -e.g. \"https://0.0.0.0:0/base/\"""") - parser.add_argument( - "-r", dest="doc_root", default=default_doc_root, - help="path to document root (default %(default)s)") - parser.add_argument( - "-c", dest="ssl_cert", default=default_ssl_cert, - help="path to SSL certificate (default %(default)s)") - parser.add_argument( - "-k", dest="ssl_key", default=default_ssl_key, - help="path to SSL certificate key (default %(default)s)") - args = parser.parse_args() - - httpd = FixtureServer(args.doc_root, args.url, - ssl_cert=args.ssl_cert, - ssl_key=args.ssl_key) - httpd.start() - print >>sys.stderr, "%s: started fixture server on %s" % \ - (sys.argv[0], httpd.get_url("/")) - httpd.wait() + here = os.path.abspath(os.path.dirname(__file__)) + doc_root = os.path.join(os.path.dirname(here), "www") + httpd = FixtureServer(doc_root, port=2829) + print "Started fixture server on http://{0}:{1}/".format(httpd.host, httpd.port) + try: + httpd.start(True) + except KeyboardInterrupt: + pass diff --git a/testing/marionette/harness/marionette/runner/serve.py b/testing/marionette/harness/marionette/runner/serve.py deleted file mode 100755 index 9daa80e95e61..000000000000 --- a/testing/marionette/harness/marionette/runner/serve.py +++ /dev/null @@ -1,226 +0,0 @@ -#!/usr/bin/env python - -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -"""Spawns necessary HTTP servers for testing Marionette in child -processes. - -""" - -from collections import defaultdict -import argparse -import multiprocessing -import os -import sys - -import httpd - - -__all__ = ["default_doc_root", - "iter_proc", - "iter_url", - "registered_servers", - "servers", - "start", - "where_is"] -here = os.path.abspath(os.path.dirname(__file__)) - - -class BlockingChannel(object): - - def __init__(self, channel): - self.chan = channel - self.lock = multiprocessing.Lock() - - def call(self, func, args=()): - self.send((func, args)) - return self.recv() - - def send(self, *args): - try: - self.lock.acquire() - self.chan.send(args) - finally: - self.lock.release() - - def recv(self): - try: - self.lock.acquire() - payload = self.chan.recv() - if isinstance(payload, tuple) and len(payload) == 1: - return payload[0] - return payload - except KeyboardInterrupt: - return ("stop", ()) - finally: - self.lock.release() - - -class ServerProxy(multiprocessing.Process, BlockingChannel): - - def __init__(self, channel, init_func, *init_args, **init_kwargs): - multiprocessing.Process.__init__(self) - BlockingChannel.__init__(self, channel) - self.init_func = init_func - self.init_args = init_args - self.init_kwargs = init_kwargs - - def run(self): - server = self.init_func(*self.init_args, **self.init_kwargs) - server.start(block=False) - - try: - while True: - # ["func", ("arg", ...)] - # ["prop", ()] - sattr, fargs = self.recv() - attr = getattr(server, sattr) - - # apply fargs to attr if it is a function - if callable(attr): - rv = attr(*fargs) - - # otherwise attr is a property - else: - rv = attr - - self.send(rv) - - if sattr == "stop": - return - - except KeyboardInterrupt: - server.stop() - - -class ServerProc(BlockingChannel): - - def __init__(self, init_func): - self._init_func = init_func - self.proc = None - - parent_chan, self.child_chan = multiprocessing.Pipe() - BlockingChannel.__init__(self, parent_chan) - - def start(self, doc_root, ssl_config, **kwargs): - self.proc = ServerProxy( - self.child_chan, self._init_func, doc_root, ssl_config, **kwargs) - self.proc.daemon = True - self.proc.start() - - def get_url(self, url): - return self.call("get_url", (url,)) - - @property - def doc_root(self): - return self.call("doc_root", ()) - - def stop(self): - self.call("stop") - if not self.is_alive: - return - self.proc.join() - - def kill(self): - if not self.is_alive: - return - self.proc.terminate() - self.proc.join(0) - - @property - def is_alive(self): - if self.proc is not None: - return self.proc.is_alive() - return False - - -def http_server(doc_root, ssl_config, **kwargs): - return httpd.FixtureServer(doc_root, url="http://0.0.0.0:0/") - - -def https_server(doc_root, ssl_config, **kwargs): - return httpd.FixtureServer(doc_root, - url="https://0.0.0.0:0/", - ssl_key=ssl_config["key_path"], - ssl_cert=ssl_config["cert_path"]) - - -def start_servers(doc_root, ssl_config, **kwargs): - servers = defaultdict() - for schema, builder_fn in registered_servers: - proc = ServerProc(builder_fn) - proc.start(doc_root, ssl_config, **kwargs) - servers[schema] = (proc.get_url("/"), proc) - return servers - - -def start(doc_root=None, **kwargs): - """Start all relevant test servers. - - If no `doc_root` is given the default - testing/marionette/harness/marionette/www directory will be used. - - Additional keyword arguments can be given which will be passed on - to the individual ``FixtureServer``'s in httpd.py. - - """ - doc_root = doc_root or default_doc_root - ssl_config = {"cert_path": httpd.default_ssl_cert, - "key_path": httpd.default_ssl_key} - - global servers - servers = start_servers(doc_root, ssl_config, **kwargs) - - return servers - - -def where_is(uri, on="http"): - """Returns the full URL, including scheme, hostname, and port, for - a fixture resource from the server associated with the ``on`` key. - It will by default look for the resource in the "http" server. - - """ - return servers.get(on)[1].get_url(uri) - - -def iter_proc(servers): - for _, (_, proc) in servers.iteritems(): - yield proc - - -def iter_url(servers): - for _, (url, _) in servers.iteritems(): - yield url - - -default_doc_root = os.path.join(os.path.dirname(here), "www") -registered_servers = [("http", http_server), - ("https", https_server)] -servers = defaultdict() - - -def main(args): - global servers - - parser = argparse.ArgumentParser() - parser.add_argument("-r", dest="doc_root", - help="Path to document root. Overrides default.") - args = parser.parse_args() - - servers = start(args.doc_root) - for url in iter_url(servers): - print >>sys.stderr, "%s: listening on %s" % (sys.argv[0], url) - - try: - while any(proc.is_alive for proc in iter_proc(servers)): - for proc in iter_proc(servers): - proc.proc.join(1) - except KeyboardInterrupt: - for proc in iter_proc(servers): - proc.kill() - - -if __name__ == "__main__": - main(sys.argv[1:]) diff --git a/testing/marionette/harness/marionette/runner/test.cert b/testing/marionette/harness/marionette/runner/test.cert deleted file mode 100644 index 3fd1cba2b7b1..000000000000 --- a/testing/marionette/harness/marionette/runner/test.cert +++ /dev/null @@ -1,86 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 2 (0x2) - Signature Algorithm: sha256WithRSAEncryption - Issuer: CN=web-platform-tests - Validity - Not Before: Dec 22 12:09:16 2014 GMT - Not After : Dec 21 12:09:16 2024 GMT - Subject: CN=web-platform.test - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:b3:84:d6:8b:01:59:18:85:d1:dc:32:df:38:f7: - 90:85:1b:3e:a5:5e:81:3e:2f:fc:3a:5f:7f:77:ef: - 23:bb:3a:88:27:0f:be:25:46:cd:63:7d:cb:95:d8: - a5:50:10:d2:a2:d2:b7:97:d1:0d:6c:fb:f9:05:e8: - 6f:a8:4b:bd:95:67:9e:7b:94:58:a9:6d:93:fd:e0: - 12:c5:cd:b4:8a:64:52:31:5f:0e:e3:89:84:71:da: - 98:dd:4b:ec:02:25:a5:7d:35:fe:63:da:b3:ac:ec: - a5:46:0f:0d:64:23:5c:6d:f3:ec:cc:28:63:23:c0: - 4b:9a:ec:8f:c1:ee:b1:a2:3e:72:4d:70:b5:09:c1: - eb:b4:10:55:3c:8b:ea:1b:94:7e:4b:74:e6:f4:9f: - 4f:a6:45:30:b5:f0:b8:b4:d1:59:50:65:0a:86:53: - ea:4c:9f:9e:f4:58:6c:31:f5:17:3a:6f:57:8b:cb: - 5f:f0:28:0b:45:92:8d:30:20:49:ff:52:e6:2c:cb: - 18:9a:d7:e6:ee:3e:4f:34:35:15:13:c5:02:da:c5: - 5f:be:fb:5b:ce:8d:bf:b5:35:76:3c:7c:e6:9c:3b: - 26:87:4d:8d:80:e6:16:c6:27:f2:50:49:b6:72:74: - 43:49:49:44:38:bb:78:43:23:ee:16:3e:d9:62:e6: - a5:d7 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - X509v3 Subject Key Identifier: - 2D:98:A3:99:39:1C:FE:E9:9A:6D:17:94:D2:3A:96:EE:C8:9E:04:22 - X509v3 Authority Key Identifier: - keyid:6A:AB:53:64:92:36:87:23:34:B3:1D:6F:85:4B:F5:DF:5A:5C:74:8F - - X509v3 Key Usage: - Digital Signature, Non Repudiation, Key Encipherment - X509v3 Extended Key Usage: - TLS Web Server Authentication - X509v3 Subject Alternative Name: - DNS:web-platform.test, DNS:www.web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.web-platform.test, DNS:xn--lve-6lad.web-platform.test, DNS:www2.web-platform.test, DNS:www1.web-platform.test - Signature Algorithm: sha256WithRSAEncryption - 33:db:f7:f0:f6:92:16:4f:2d:42:bc:b8:aa:e6:ab:5e:f9:b9: - b0:48:ae:b5:8d:cc:02:7b:e9:6f:4e:75:f7:17:a0:5e:7b:87: - 06:49:48:83:c5:bb:ca:95:07:37:0e:5d:e3:97:de:9e:0c:a4: - 82:30:11:81:49:5d:50:29:72:92:a5:ca:17:b1:7c:f1:32:11: - 17:57:e6:59:c1:ac:e3:3b:26:d2:94:97:50:6a:b9:54:88:84: - 9b:6f:b1:06:f5:80:04:22:10:14:b1:f5:97:25:fc:66:d6:69: - a3:36:08:85:23:ff:8e:3c:2b:e0:6d:e7:61:f1:00:8f:61:3d: - b0:87:ad:72:21:f6:f0:cc:4f:c9:20:bf:83:11:0f:21:f4:b8: - c0:dd:9c:51:d7:bb:27:32:ec:ab:a4:62:14:28:32:da:f2:87: - 80:68:9c:ea:ac:eb:f5:7f:f5:de:f4:c0:39:91:c8:76:a4:ee: - d0:a8:50:db:c1:4b:f9:c4:3d:d9:e8:8e:b6:3f:c0:96:79:12: - d8:fa:4d:0a:b3:36:76:aa:4e:b2:82:2f:a2:d4:0d:db:fd:64: - 77:6f:6e:e9:94:7f:0f:c8:3a:3c:96:3d:cd:4d:6c:ba:66:95: - f7:b4:9d:a4:94:9f:97:b3:9a:0d:dc:18:8c:11:0b:56:65:8e: - 46:4c:e6:5e ------BEGIN CERTIFICATE----- -MIID2jCCAsKgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAdMRswGQYDVQQDDBJ3ZWIt -cGxhdGZvcm0tdGVzdHMwHhcNMTQxMjIyMTIwOTE2WhcNMjQxMjIxMTIwOTE2WjAc -MRowGAYDVQQDExF3ZWItcGxhdGZvcm0udGVzdDCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBALOE1osBWRiF0dwy3zj3kIUbPqVegT4v/Dpff3fvI7s6iCcP -viVGzWN9y5XYpVAQ0qLSt5fRDWz7+QXob6hLvZVnnnuUWKltk/3gEsXNtIpkUjFf -DuOJhHHamN1L7AIlpX01/mPas6zspUYPDWQjXG3z7MwoYyPAS5rsj8HusaI+ck1w -tQnB67QQVTyL6huUfkt05vSfT6ZFMLXwuLTRWVBlCoZT6kyfnvRYbDH1FzpvV4vL -X/AoC0WSjTAgSf9S5izLGJrX5u4+TzQ1FRPFAtrFX777W86Nv7U1djx85pw7JodN -jYDmFsYn8lBJtnJ0Q0lJRDi7eEMj7hY+2WLmpdcCAwEAAaOCASQwggEgMAkGA1Ud -EwQCMAAwHQYDVR0OBBYEFC2Yo5k5HP7pmm0XlNI6lu7IngQiMB8GA1UdIwQYMBaA -FGqrU2SSNocjNLMdb4VL9d9aXHSPMAsGA1UdDwQEAwIF4DATBgNVHSUEDDAKBggr -BgEFBQcDATCBsAYDVR0RBIGoMIGlghF3ZWItcGxhdGZvcm0udGVzdIIVd3d3Lndl -Yi1wbGF0Zm9ybS50ZXN0gil4bi0tbjhqNmRzNTNsd3drcnFodjI4YS53ZWItcGxh -dGZvcm0udGVzdIIeeG4tLWx2ZS02bGFkLndlYi1wbGF0Zm9ybS50ZXN0ghZ3d3cy -LndlYi1wbGF0Zm9ybS50ZXN0ghZ3d3cxLndlYi1wbGF0Zm9ybS50ZXN0MA0GCSqG -SIb3DQEBCwUAA4IBAQAz2/fw9pIWTy1CvLiq5qte+bmwSK61jcwCe+lvTnX3F6Be -e4cGSUiDxbvKlQc3Dl3jl96eDKSCMBGBSV1QKXKSpcoXsXzxMhEXV+ZZwazjOybS -lJdQarlUiISbb7EG9YAEIhAUsfWXJfxm1mmjNgiFI/+OPCvgbedh8QCPYT2wh61y -IfbwzE/JIL+DEQ8h9LjA3ZxR17snMuyrpGIUKDLa8oeAaJzqrOv1f/Xe9MA5kch2 -pO7QqFDbwUv5xD3Z6I62P8CWeRLY+k0KszZ2qk6ygi+i1A3b/WR3b27plH8PyDo8 -lj3NTWy6ZpX3tJ2klJ+Xs5oN3BiMEQtWZY5GTOZe ------END CERTIFICATE----- \ No newline at end of file diff --git a/testing/marionette/harness/marionette/runner/test.key b/testing/marionette/harness/marionette/runner/test.key deleted file mode 100644 index 194a49ec42f3..000000000000 --- a/testing/marionette/harness/marionette/runner/test.key +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCzhNaLAVkYhdHc -Mt8495CFGz6lXoE+L/w6X3937yO7OognD74lRs1jfcuV2KVQENKi0reX0Q1s+/kF -6G+oS72VZ557lFipbZP94BLFzbSKZFIxXw7jiYRx2pjdS+wCJaV9Nf5j2rOs7KVG -Dw1kI1xt8+zMKGMjwEua7I/B7rGiPnJNcLUJweu0EFU8i+oblH5LdOb0n0+mRTC1 -8Li00VlQZQqGU+pMn570WGwx9Rc6b1eLy1/wKAtFko0wIEn/UuYsyxia1+buPk80 -NRUTxQLaxV+++1vOjb+1NXY8fOacOyaHTY2A5hbGJ/JQSbZydENJSUQ4u3hDI+4W -Ptli5qXXAgMBAAECggEBAIcwDQSnIjo2ZECHytQykpG6X6XXEksLhc1Lp0lhPC49 -uNR5pX6a4AcBb3PLr0opMQZO2tUoKA0ff3t0e8loKD+/xXhY0Z/dlioEOP7elwv0 -2nS1mhe9spCuxpk4GGXRhdtR8t2tj8s0do3YvgPgITXoEDX6YBZHNGhZpzSrFPgQ -/c3eGCVmzWYuLFfdj5OPQ9bwTaY4JSvDLZT0/WTgiica7VySwfz3HP1fFqNykTiK -ACQREvtxfk5Ym2nT6oni7CM2zOEJL9SXicXI5HO4bERH0ZYh//F3g6mwGiFXUJPd -NKgaTM1oT9kRGkUaEYsRWrddwR8d5mXLvBuTJbgIsSECgYEA1+2uJSYRW1OqbhYP -ms59YQHSs3VjpJpnCV2zNa2Wixs57KS2cOH7B6KrQCogJFLtgCDVLtyoErfVkD7E -FivTgYr1pVCRppJddQzXik31uOINOBVffr7/09g3GcRN+ubHPZPq3K+dD6gHa3Aj -0nH1EjEEV0QpSTQFn87OF2mc9wcCgYEA1NVqMbbzd+9Xft5FXuSbX6E+S02dOGat -SgpnkTM80rjqa6eHdQzqk3JqyteHPgdi1vdYRlSPOj/X+6tySY0Ej9sRnYOfddA2 -kpiDiVkmiqVolyJPY69Utj+E3TzJ1vhCQuYknJmB7zP9tDcTxMeq0l/NaWvGshEK -yC4UTQog1rECgYASOFILfGzWgfbNlzr12xqlRtwanHst9oFfPvLSQrWDQ2bd2wAy -Aj+GY2mD3oobxouX1i1m6OOdwLlalJFDNauBMNKNgoDnx03vhIfjebSURy7KXrNS -JJe9rm7n07KoyzRgs8yLlp3wJkOKA0pihY8iW9R78JpzPNqEo5SsURMXnQKBgBlV -gfuC9H4tPjP6zzUZbyk1701VYsaI6k2q6WMOP0ox+q1v1p7nN7DvaKjWeOG4TVqb -PKW6gQYE/XeWk9cPcyCQigs+1KdYbnaKsvWRaBYO1GFREzQhdarv6qfPCZOOH40J -Cgid+Sp4/NULzU2aGspJ3xCSZKdjge4MFhyJfRkxAoGBAJlwqY4nue0MBLGNpqcs -WwDtSasHvegKAcxGBKL5oWPbLBk7hk+hdqc8f6YqCkCNqv/ooBspL15ESItL+6yT -zt0YkK4oH9tmLDb+rvqZ7ZdXbWSwKITMoCyyHUtT6OKt/RtA0Vdy9LPnP27oSO/C -dk8Qf7KgKZLWo0ZNkvw38tEC ------END PRIVATE KEY----- \ No newline at end of file diff --git a/testing/marionette/harness/marionette/tests/harness_unit/test_httpd.py b/testing/marionette/harness/marionette/tests/harness_unit/test_httpd.py deleted file mode 100644 index 4bac9d722e33..000000000000 --- a/testing/marionette/harness/marionette/tests/harness_unit/test_httpd.py +++ /dev/null @@ -1,89 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -import json -import os -import types -import urllib2 - -import pytest - -from marionette.runner import httpd -from wptserve.handlers import json_handler - -here = os.path.abspath(os.path.dirname(__file__)) -parent = os.path.dirname(here) -default_doc_root = os.path.join(os.path.dirname(parent), "www") - - -@pytest.yield_fixture -def server(): - server = httpd.FixtureServer(default_doc_root) - yield server - server.stop() - - -def test_ctor(): - with pytest.raises(ValueError): - httpd.FixtureServer("foo") - httpd.FixtureServer(default_doc_root) - - -def test_start_stop(server): - server.start() - server.stop() - - -def test_get_url(server): - server.start() - url = server.get_url("/") - assert isinstance(url, types.StringTypes) - assert "http://" in url - - server.stop() - with pytest.raises(httpd.NotAliveError): - server.get_url("/") - - -def test_doc_root(server): - server.start() - assert isinstance(server.doc_root, types.StringTypes) - server.stop() - assert isinstance(server.doc_root, types.StringTypes) - - -def test_router(server): - assert server.router is not None - - -def test_routes(server): - assert server.routes is not None - - -def test_is_alive(server): - assert server.is_alive == False - server.start() - assert server.is_alive == True - - -def test_handler(server): - counter = 0 - - @json_handler - def handler(request, response): - return {"count": counter} - - route = ("GET", "/httpd/test_handler", handler) - server.router.register(*route) - server.start() - - url = server.get_url("/httpd/test_handler") - body = urllib2.urlopen(url).read() - res = json.loads(body) - assert res["count"] == counter - - -if __name__ == "__main__": - import sys - sys.exit(pytest.main(["--verbose", __file__])) diff --git a/testing/marionette/harness/marionette/tests/harness_unit/test_marionette_runner.py b/testing/marionette/harness/marionette/tests/harness_unit/test_marionette_runner.py index 079dcc753c85..6cd8013ff8cd 100644 --- a/testing/marionette/harness/marionette/tests/harness_unit/test_marionette_runner.py +++ b/testing/marionette/harness/marionette/tests/harness_unit/test_marionette_runner.py @@ -25,7 +25,7 @@ def mock_runner(runner, mock_marionette, monkeypatch): to enable testing runner.run_tests(). """ runner.driverclass = mock_marionette - for attr in ['run_test_set', '_capabilities']: + for attr in ['_set_baseurl', 'run_test_set', '_capabilities']: setattr(runner, attr, Mock()) runner._appName = 'fake_app' monkeypatch.setattr('marionette.runner.base.mozversion', Mock()) @@ -352,7 +352,7 @@ def test_cleanup_with_manifest(mock_runner, manifest_with_tests, monkeypatch): with context: mock_runner.run_tests([manifest_with_tests.filepath]) assert mock_runner.marionette is None - assert mock_runner.fixture_servers == {} + assert mock_runner.httpd is None def test_reset_test_stats(mock_runner): diff --git a/testing/marionette/harness/marionette/tests/harness_unit/test_serve.py b/testing/marionette/harness/marionette/tests/harness_unit/test_serve.py deleted file mode 100644 index 2f175812a9db..000000000000 --- a/testing/marionette/harness/marionette/tests/harness_unit/test_serve.py +++ /dev/null @@ -1,67 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -import types - -import pytest - -from marionette.runner import serve -from marionette.runner.serve import iter_proc, iter_url - - -def teardown_function(func): - for server in [server for server in iter_proc(serve.servers) if server.is_alive]: - server.stop() - server.kill() - - -def test_registered_servers(): - # [(name, factory), ...] - assert serve.registered_servers[0][0] == "http" - assert serve.registered_servers[1][0] == "https" - - -def test_globals(): - assert serve.default_doc_root is not None - assert serve.registered_servers is not None - assert serve.servers is not None - - -def test_start(): - serve.start() - assert len(serve.servers) == 2 - assert "http" in serve.servers - assert "https" in serve.servers - for url in iter_url(serve.servers): - assert isinstance(url, types.StringTypes) - - -def test_start_with_custom_root(tmpdir_factory): - tdir = tmpdir_factory.mktemp("foo") - serve.start(str(tdir)) - for server in iter_proc(serve.servers): - assert server.doc_root == tdir - - -def test_iter_proc(): - serve.start() - for server in iter_proc(serve.servers): - server.stop() - - -def test_iter_url(): - serve.start() - for url in iter_url(serve.servers): - assert isinstance(url, types.StringTypes) - - -def test_where_is(): - serve.start() - assert serve.where_is("/") == serve.servers["http"][1].get_url("/") - assert serve.where_is("/", on="https") == serve.servers["https"][1].get_url("/") - - -if __name__ == "__main__": - import sys - sys.exit(pytest.main(["-s", "--verbose", __file__])) diff --git a/testing/marionette/harness/marionette/tests/unit/test_httpd.py b/testing/marionette/harness/marionette/tests/unit/test_httpd.py new file mode 100644 index 000000000000..c987102c806c --- /dev/null +++ b/testing/marionette/harness/marionette/tests/unit/test_httpd.py @@ -0,0 +1,32 @@ +# 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/. + +from marionette import MarionetteTestCase +from marionette_driver import By + + +class TestHttpdServer(MarionetteTestCase): + + def test_handler(self): + status = {"count": 0} + + def handler(request, response): + status["count"] += 1 + + response.headers.set("Content-Type", "text/html") + response.content = "

{}

".format( + status["count"]) + + return () + + route = ("GET", "/httpd/test_handler", handler) + self.httpd.router.register(*route) + + url = self.marionette.absolute_url("httpd/test_handler") + + for counter in range(0, 5): + self.marionette.navigate(url) + self.assertEqual(status["count"], counter + 1) + elem = self.marionette.find_element(By.ID, "count") + self.assertEqual(elem.text, str(counter + 1)) diff --git a/testing/marionette/harness/marionette/tests/unit/unit-tests.ini b/testing/marionette/harness/marionette/tests/unit/unit-tests.ini index 9509e196d13d..f57aa9d2e30c 100644 --- a/testing/marionette/harness/marionette/tests/unit/unit-tests.ini +++ b/testing/marionette/harness/marionette/tests/unit/unit-tests.ini @@ -122,4 +122,5 @@ skip-if = appname == 'fennec' [test_select.py] [test_crash.py] +[test_httpd.py] [test_localization.py] diff --git a/testing/marionette/harness/requirements.txt b/testing/marionette/harness/requirements.txt index 16fde1a3d17c..ea93816c52ff 100644 --- a/testing/marionette/harness/requirements.txt +++ b/testing/marionette/harness/requirements.txt @@ -1,13 +1,14 @@ +marionette-driver >= 2.1.0 browsermob-proxy >= 0.6.0 manifestparser >= 1.1 -marionette-driver >= 2.1.0 -mozcrash >= 0.5 -mozdevice >= 0.44 +wptserve >= 1.3.0 mozinfo >= 0.8 -mozlog >= 3.0 mozprocess >= 0.9 -mozprofile >= 0.7 mozrunner >= 6.13 +mozdevice >= 0.44 +mozlog >= 3.0 +moznetwork >= 0.21 +mozcrash >= 0.5 +mozprofile >= 0.7 moztest >= 0.7 mozversion >= 1.1 -wptserve >= 1.3.0 From 777838332c4352b3d71f533c01a00e0e4b09dfe4 Mon Sep 17 00:00:00 2001 From: Karl Tomlinson Date: Wed, 23 Nov 2016 16:41:57 +1300 Subject: [PATCH 35/53] bug 1319650 mimic gtk_style_context_save() in WidgetStyleCache with a new context r=stransky+263117 This makes balancing with gtk_style_context_restore()/ReleaseStyleContext() unnecessary, and the style resolution cached in the style contexts is not invalidated so frequently. MozReview-Commit-ID: BKwyqoQsjv2 --HG-- extra : rebase_source : 2091fc84a9ecb8b55e7d3e36e72cbd03ea826ac8 --- widget/gtk/WidgetStyleCache.cpp | 271 +++++++++++++++++++------------- widget/gtk/mozgtk/mozgtk.c | 1 + 2 files changed, 167 insertions(+), 105 deletions(-) diff --git a/widget/gtk/WidgetStyleCache.cpp b/widget/gtk/WidgetStyleCache.cpp index b1c4d928569e..11c60957e12b 100644 --- a/widget/gtk/WidgetStyleCache.cpp +++ b/widget/gtk/WidgetStyleCache.cpp @@ -20,10 +20,6 @@ static_assert(GTK_STATE_FLAG_DIR_LTR == STATE_FLAG_DIR_LTR && static GtkWidget* sWidgetStorage[MOZ_GTK_WIDGET_NODE_COUNT]; static GtkStyleContext* sStyleStorage[MOZ_GTK_WIDGET_NODE_COUNT]; -static bool sStyleContextNeedsRestore; -#ifdef DEBUG -static GtkStyleContext* sCurrentStyleContext; -#endif static GtkStyleContext* GetWidgetRootStyle(WidgetNodeType aNodeType); static GtkStyleContext* @@ -642,6 +638,16 @@ GetWidget(WidgetNodeType aWidgetType) return widget; } +static void +AddStyleClassesFromStyle(GtkStyleContext* aDest, GtkStyleContext* aSrc) +{ + GList* classes = gtk_style_context_list_classes(aSrc); + for (GList* link = classes; link; link = link->next) { + gtk_style_context_add_class(aDest, static_cast(link->data)); + } + g_list_free(classes); +} + GtkStyleContext* CreateStyleForWidget(GtkWidget* aWidget, GtkStyleContext* aParentStyle) { @@ -673,11 +679,7 @@ CreateStyleForWidget(GtkWidget* aWidget, GtkStyleContext* aParentStyle) // gtk_widget_path_append_for_widget() from finding classes in GTK 3.20, // is not a problem. GtkStyleContext* widgetStyle = gtk_widget_get_style_context(aWidget); - GList* classes = gtk_style_context_list_classes(widgetStyle); - for (GList* link = classes; link; link = link->next) { - gtk_style_context_add_class(context, static_cast(link->data)); - } - g_list_free(classes); + AddStyleClassesFromStyle(context, widgetStyle); // Release any floating reference on aWidget. g_object_ref_sink(aWidget); @@ -789,13 +791,58 @@ CreateChildCSSNode(const char* aName, WidgetNodeType aParentNodeType) return CreateCSSNode(aName, GetCssNodeStyleInternal(aParentNodeType)); } +// Create a style context equivalent to a saved root style context of +// |aWidgetType| with |aStyleClass| as an additional class. This is used to +// produce a context equivalent to what GTK versions < 3.20 use for many +// internal parts of widgets. static GtkStyleContext* -GetWidgetStyleWithClass(WidgetNodeType aWidgetType, const gchar* aStyleClass) +CreateSubStyleWithClass(WidgetNodeType aWidgetType, const gchar* aStyleClass) { - GtkStyleContext* style = GetWidgetRootStyle(aWidgetType); - gtk_style_context_save(style); - MOZ_ASSERT(!sStyleContextNeedsRestore); - sStyleContextNeedsRestore = true; + static auto sGtkWidgetPathIterGetObjectName = + reinterpret_cast + (dlsym(RTLD_DEFAULT, "gtk_widget_path_iter_get_object_name")); + + GtkStyleContext* parentStyle = GetWidgetRootStyle(aWidgetType); + + // Create a new context that behaves like |parentStyle| would after + // gtk_style_context_save(parentStyle). + // + // Avoiding gtk_style_context_save() avoids the need to manage the + // restore, and a new context permits caching style resolution. + // + // gtk_style_context_save(context) changes the node hierarchy of |context| + // to add a new GtkCssNodeDeclaration that is a copy of its original node. + // The new node is a child of the original node, and so the new heirarchy is + // one level deeper. The new node receives the same classes as the + // original, but any changes to the classes on |context| will change only + // the new node. The new node inherits properties from the original node + // (which retains the original heirarchy and classes) and matches CSS rules + // with the new heirarchy and any changes to the classes. + // + // The change in hierarchy can produce some surprises in matching theme CSS + // rules (e.g. https://bugzilla.gnome.org/show_bug.cgi?id=761870#c2), but it + // is important here to produce the same behavior so that rules match the + // same widget parts in Gecko as they do in GTK. + // + // When using public GTK API to construct style contexts, a widget path is + // required. CSS rules are not matched against the style context heirarchy + // but according to the heirarchy in the widget path. The path that matches + // the same CSS rules as a saved context is like the path of |parentStyle| + // but with an extra copy of the head (last) object appended. Setting + // |parentStyle| as the parent context provides the same inheritance of + // properties from the widget root node. + const GtkWidgetPath* parentPath = gtk_style_context_get_path(parentStyle); + const gchar* name = sGtkWidgetPathIterGetObjectName ? + sGtkWidgetPathIterGetObjectName(parentPath, -1) : nullptr; + GType objectType = gtk_widget_path_get_object_type(parentPath); + + GtkStyleContext* style = CreateCSSNode(name, parentStyle, objectType); + + // Start with the same classes on the new node as were on |parentStyle|. + // GTK puts no regions or junction_sides on widget root nodes, and so there + // is no need to copy these. + AddStyleClassesFromStyle(style, parentStyle); + gtk_style_context_add_class(style, aStyleClass); return style; } @@ -864,35 +911,42 @@ GetCssNodeStyleInternal(WidgetNodeType aNodeType) break; case MOZ_GTK_GRIPPER: // TODO - create from CSS node - return GetWidgetStyleWithClass(MOZ_GTK_GRIPPER, - GTK_STYLE_CLASS_GRIP); + style = CreateSubStyleWithClass(MOZ_GTK_GRIPPER, + GTK_STYLE_CLASS_GRIP); + break; case MOZ_GTK_INFO_BAR: // TODO - create from CSS node - return GetWidgetStyleWithClass(MOZ_GTK_INFO_BAR, - GTK_STYLE_CLASS_INFO); + style = CreateSubStyleWithClass(MOZ_GTK_INFO_BAR, + GTK_STYLE_CLASS_INFO); + break; case MOZ_GTK_SPINBUTTON_ENTRY: // TODO - create from CSS node - return GetWidgetStyleWithClass(MOZ_GTK_SPINBUTTON, - GTK_STYLE_CLASS_ENTRY); + style = CreateSubStyleWithClass(MOZ_GTK_SPINBUTTON, + GTK_STYLE_CLASS_ENTRY); + break; case MOZ_GTK_SCROLLED_WINDOW: // TODO - create from CSS node - return GetWidgetStyleWithClass(MOZ_GTK_SCROLLED_WINDOW, - GTK_STYLE_CLASS_FRAME); + style = CreateSubStyleWithClass(MOZ_GTK_SCROLLED_WINDOW, + GTK_STYLE_CLASS_FRAME); + break; case MOZ_GTK_TEXT_VIEW: // TODO - create from CSS node - return GetWidgetStyleWithClass(MOZ_GTK_TEXT_VIEW, - GTK_STYLE_CLASS_VIEW); + style = CreateSubStyleWithClass(MOZ_GTK_TEXT_VIEW, + GTK_STYLE_CLASS_VIEW); + break; case MOZ_GTK_FRAME_BORDER: style = CreateChildCSSNode("border", MOZ_GTK_FRAME); break; case MOZ_GTK_TREEVIEW_VIEW: // TODO - create from CSS node - return GetWidgetStyleWithClass(MOZ_GTK_TREEVIEW, - GTK_STYLE_CLASS_VIEW); + style = CreateSubStyleWithClass(MOZ_GTK_TREEVIEW, + GTK_STYLE_CLASS_VIEW); + break; case MOZ_GTK_TREEVIEW_EXPANDER: // TODO - create from CSS node - return GetWidgetStyleWithClass(MOZ_GTK_TREEVIEW, - GTK_STYLE_CLASS_EXPANDER); + style = CreateSubStyleWithClass(MOZ_GTK_TREEVIEW, + GTK_STYLE_CLASS_EXPANDER); + break; case MOZ_GTK_SPLITTER_SEPARATOR_HORIZONTAL: style = CreateChildCSSNode("separator", MOZ_GTK_SPLITTER_HORIZONTAL); @@ -928,7 +982,7 @@ GetCssNodeStyleInternal(WidgetNodeType aNodeType) case MOZ_GTK_TAB_TOP: { // TODO - create from CSS node - style = GetWidgetStyleWithClass(MOZ_GTK_NOTEBOOK, + style = CreateSubStyleWithClass(MOZ_GTK_NOTEBOOK, GTK_STYLE_CLASS_TOP); gtk_style_context_add_region(style, GTK_STYLE_REGION_TAB, static_cast(0)); @@ -937,7 +991,7 @@ GetCssNodeStyleInternal(WidgetNodeType aNodeType) case MOZ_GTK_TAB_BOTTOM: { // TODO - create from CSS node - style = GetWidgetStyleWithClass(MOZ_GTK_NOTEBOOK, + style = CreateSubStyleWithClass(MOZ_GTK_NOTEBOOK, GTK_STYLE_CLASS_BOTTOM); gtk_style_context_add_region(style, GTK_STYLE_REGION_TAB, static_cast(0)); @@ -965,91 +1019,111 @@ GetCssNodeStyleInternal(WidgetNodeType aNodeType) static GtkStyleContext* GetWidgetStyleInternal(WidgetNodeType aNodeType) { + GtkStyleContext* style = sStyleStorage[aNodeType]; + if (style) + return style; + switch (aNodeType) { case MOZ_GTK_SCROLLBAR_TROUGH_HORIZONTAL: - return GetWidgetStyleWithClass(MOZ_GTK_SCROLLBAR_HORIZONTAL, - GTK_STYLE_CLASS_TROUGH); + style = CreateSubStyleWithClass(MOZ_GTK_SCROLLBAR_HORIZONTAL, + GTK_STYLE_CLASS_TROUGH); + break; case MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL: - return GetWidgetStyleWithClass(MOZ_GTK_SCROLLBAR_HORIZONTAL, - GTK_STYLE_CLASS_SLIDER); + style = CreateSubStyleWithClass(MOZ_GTK_SCROLLBAR_HORIZONTAL, + GTK_STYLE_CLASS_SLIDER); + break; case MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL: - return GetWidgetStyleWithClass(MOZ_GTK_SCROLLBAR_VERTICAL, - GTK_STYLE_CLASS_TROUGH); + style = CreateSubStyleWithClass(MOZ_GTK_SCROLLBAR_VERTICAL, + GTK_STYLE_CLASS_TROUGH); + break; case MOZ_GTK_SCROLLBAR_THUMB_VERTICAL: - return GetWidgetStyleWithClass(MOZ_GTK_SCROLLBAR_VERTICAL, - GTK_STYLE_CLASS_SLIDER); + style = CreateSubStyleWithClass(MOZ_GTK_SCROLLBAR_VERTICAL, + GTK_STYLE_CLASS_SLIDER); + break; case MOZ_GTK_RADIOBUTTON: - return GetWidgetStyleWithClass(MOZ_GTK_RADIOBUTTON_CONTAINER, - GTK_STYLE_CLASS_RADIO); + style = CreateSubStyleWithClass(MOZ_GTK_RADIOBUTTON_CONTAINER, + GTK_STYLE_CLASS_RADIO); + break; case MOZ_GTK_CHECKBUTTON: - return GetWidgetStyleWithClass(MOZ_GTK_CHECKBUTTON_CONTAINER, - GTK_STYLE_CLASS_CHECK); + style = CreateSubStyleWithClass(MOZ_GTK_CHECKBUTTON_CONTAINER, + GTK_STYLE_CLASS_CHECK); + break; case MOZ_GTK_RADIOMENUITEM_INDICATOR: - return GetWidgetStyleWithClass(MOZ_GTK_RADIOMENUITEM, - GTK_STYLE_CLASS_RADIO); + style = CreateSubStyleWithClass(MOZ_GTK_RADIOMENUITEM, + GTK_STYLE_CLASS_RADIO); + break; case MOZ_GTK_CHECKMENUITEM_INDICATOR: - return GetWidgetStyleWithClass(MOZ_GTK_CHECKMENUITEM, - GTK_STYLE_CLASS_CHECK); + style = CreateSubStyleWithClass(MOZ_GTK_CHECKMENUITEM, + GTK_STYLE_CLASS_CHECK); + break; case MOZ_GTK_PROGRESS_TROUGH: - return GetWidgetStyleWithClass(MOZ_GTK_PROGRESSBAR, - GTK_STYLE_CLASS_TROUGH); + style = CreateSubStyleWithClass(MOZ_GTK_PROGRESSBAR, + GTK_STYLE_CLASS_TROUGH); + break; case MOZ_GTK_GRIPPER: - return GetWidgetStyleWithClass(MOZ_GTK_GRIPPER, - GTK_STYLE_CLASS_GRIP); + style = CreateSubStyleWithClass(MOZ_GTK_GRIPPER, + GTK_STYLE_CLASS_GRIP); + break; case MOZ_GTK_INFO_BAR: - return GetWidgetStyleWithClass(MOZ_GTK_INFO_BAR, - GTK_STYLE_CLASS_INFO); + style = CreateSubStyleWithClass(MOZ_GTK_INFO_BAR, + GTK_STYLE_CLASS_INFO); + break; case MOZ_GTK_SPINBUTTON_ENTRY: - return GetWidgetStyleWithClass(MOZ_GTK_SPINBUTTON, - GTK_STYLE_CLASS_ENTRY); + style = CreateSubStyleWithClass(MOZ_GTK_SPINBUTTON, + GTK_STYLE_CLASS_ENTRY); + break; case MOZ_GTK_SCROLLED_WINDOW: - return GetWidgetStyleWithClass(MOZ_GTK_SCROLLED_WINDOW, - GTK_STYLE_CLASS_FRAME); + style = CreateSubStyleWithClass(MOZ_GTK_SCROLLED_WINDOW, + GTK_STYLE_CLASS_FRAME); + break; case MOZ_GTK_TEXT_VIEW: - return GetWidgetStyleWithClass(MOZ_GTK_TEXT_VIEW, - GTK_STYLE_CLASS_VIEW); + style = CreateSubStyleWithClass(MOZ_GTK_TEXT_VIEW, + GTK_STYLE_CLASS_VIEW); + break; case MOZ_GTK_FRAME_BORDER: return GetWidgetRootStyle(MOZ_GTK_FRAME); case MOZ_GTK_TREEVIEW_VIEW: - return GetWidgetStyleWithClass(MOZ_GTK_TREEVIEW, - GTK_STYLE_CLASS_VIEW); + style = CreateSubStyleWithClass(MOZ_GTK_TREEVIEW, + GTK_STYLE_CLASS_VIEW); + break; case MOZ_GTK_TREEVIEW_EXPANDER: - return GetWidgetStyleWithClass(MOZ_GTK_TREEVIEW, - GTK_STYLE_CLASS_EXPANDER); + style = CreateSubStyleWithClass(MOZ_GTK_TREEVIEW, + GTK_STYLE_CLASS_EXPANDER); + break; case MOZ_GTK_SPLITTER_SEPARATOR_HORIZONTAL: - return GetWidgetStyleWithClass(MOZ_GTK_SPLITTER_HORIZONTAL, - GTK_STYLE_CLASS_PANE_SEPARATOR); + style = CreateSubStyleWithClass(MOZ_GTK_SPLITTER_HORIZONTAL, + GTK_STYLE_CLASS_PANE_SEPARATOR); + break; case MOZ_GTK_SPLITTER_SEPARATOR_VERTICAL: - return GetWidgetStyleWithClass(MOZ_GTK_SPLITTER_VERTICAL, - GTK_STYLE_CLASS_PANE_SEPARATOR); + style = CreateSubStyleWithClass(MOZ_GTK_SPLITTER_VERTICAL, + GTK_STYLE_CLASS_PANE_SEPARATOR); + break; case MOZ_GTK_SCALE_TROUGH_HORIZONTAL: - return GetWidgetStyleWithClass(MOZ_GTK_SCALE_HORIZONTAL, - GTK_STYLE_CLASS_TROUGH); + style = CreateSubStyleWithClass(MOZ_GTK_SCALE_HORIZONTAL, + GTK_STYLE_CLASS_TROUGH); + break; case MOZ_GTK_SCALE_TROUGH_VERTICAL: - return GetWidgetStyleWithClass(MOZ_GTK_SCALE_VERTICAL, - GTK_STYLE_CLASS_TROUGH); + style = CreateSubStyleWithClass(MOZ_GTK_SCALE_VERTICAL, + GTK_STYLE_CLASS_TROUGH); + break; case MOZ_GTK_SCALE_THUMB_HORIZONTAL: - return GetWidgetStyleWithClass(MOZ_GTK_SCALE_HORIZONTAL, - GTK_STYLE_CLASS_SLIDER); + style = CreateSubStyleWithClass(MOZ_GTK_SCALE_HORIZONTAL, + GTK_STYLE_CLASS_SLIDER); + break; case MOZ_GTK_SCALE_THUMB_VERTICAL: - return GetWidgetStyleWithClass(MOZ_GTK_SCALE_VERTICAL, - GTK_STYLE_CLASS_SLIDER); + style = CreateSubStyleWithClass(MOZ_GTK_SCALE_VERTICAL, + GTK_STYLE_CLASS_SLIDER); + break; case MOZ_GTK_TAB_TOP: - { - GtkStyleContext* style = GetWidgetStyleWithClass(MOZ_GTK_NOTEBOOK, - GTK_STYLE_CLASS_TOP); + style = CreateSubStyleWithClass(MOZ_GTK_NOTEBOOK, GTK_STYLE_CLASS_TOP); gtk_style_context_add_region(style, GTK_STYLE_REGION_TAB, static_cast(0)); - return style; - } + break; case MOZ_GTK_TAB_BOTTOM: - { - GtkStyleContext* style = GetWidgetStyleWithClass(MOZ_GTK_NOTEBOOK, - GTK_STYLE_CLASS_BOTTOM); + style = CreateSubStyleWithClass(MOZ_GTK_NOTEBOOK, GTK_STYLE_CLASS_BOTTOM); gtk_style_context_add_region(style, GTK_STYLE_REGION_TAB, static_cast(0)); - return style; - } + break; case MOZ_GTK_NOTEBOOK: case MOZ_GTK_NOTEBOOK_HEADER: case MOZ_GTK_TABPANELS: @@ -1061,16 +1135,15 @@ GetWidgetStyleInternal(WidgetNodeType aNodeType) default: return GetWidgetRootStyle(aNodeType); } + + MOZ_ASSERT(style); + sStyleStorage[aNodeType] = style; + return style; } void ResetWidgetCache(void) { - MOZ_ASSERT(!sStyleContextNeedsRestore); -#ifdef DEBUG - MOZ_ASSERT(!sCurrentStyleContext); -#endif - for (int i = 0; i < MOZ_GTK_WIDGET_NODE_COUNT; i++) { if (sStyleStorage[i]) g_object_unref(sStyleStorage[i]); @@ -1089,17 +1162,12 @@ GtkStyleContext* ClaimStyleContext(WidgetNodeType aNodeType, GtkTextDirection aDirection, GtkStateFlags aStateFlags, StyleFlags aFlags) { - MOZ_ASSERT(!sStyleContextNeedsRestore); GtkStyleContext* style; if (gtk_check_version(3, 20, 0) != nullptr) { style = GetWidgetStyleInternal(aNodeType); } else { style = GetCssNodeStyleInternal(aNodeType); } -#ifdef DEBUG - MOZ_ASSERT(!sCurrentStyleContext); - sCurrentStyleContext = style; -#endif bool stateChanged = false; bool stateHasDirection = gtk_get_minor_version() >= 8; GtkStateFlags oldState = gtk_style_context_get_state(style); @@ -1139,9 +1207,10 @@ ClaimStyleContext(WidgetNodeType aNodeType, GtkTextDirection aDirection, // // https://bugzilla.mozilla.org/show_bug.cgi?id=1272194#c7 // - // Avoid calling invalidate on saved contexts to avoid performing - // build_properties() (in 3.16 stylecontext.c) unnecessarily early. - if (stateChanged && !sStyleContextNeedsRestore) { + // Avoid calling invalidate on contexts that are not owned and constructed + // by widgets to avoid performing build_properties() (in 3.16 stylecontext.c) + // unnecessarily early. + if (stateChanged && sWidgetStorage[aNodeType]) { gtk_style_context_invalidate(style); } return style; @@ -1150,12 +1219,4 @@ ClaimStyleContext(WidgetNodeType aNodeType, GtkTextDirection aDirection, void ReleaseStyleContext(GtkStyleContext* aStyleContext) { - if (sStyleContextNeedsRestore) { - gtk_style_context_restore(aStyleContext); - } - sStyleContextNeedsRestore = false; -#ifdef DEBUG - MOZ_ASSERT(sCurrentStyleContext == aStyleContext); - sCurrentStyleContext = nullptr; -#endif } diff --git a/widget/gtk/mozgtk/mozgtk.c b/widget/gtk/mozgtk/mozgtk.c index e42446e43195..76964122c941 100644 --- a/widget/gtk/mozgtk/mozgtk.c +++ b/widget/gtk/mozgtk/mozgtk.c @@ -581,6 +581,7 @@ STUB(gtk_widget_path_append_type) STUB(gtk_widget_path_copy) STUB(gtk_widget_path_free) STUB(gtk_widget_path_iter_add_class) +STUB(gtk_widget_path_get_object_type) STUB(gtk_widget_path_new) STUB(gtk_widget_path_unref) STUB(gtk_widget_set_visual) From f3312b9b72f66c7433515313bfcd5b21a30f9435 Mon Sep 17 00:00:00 2001 From: Mark Hammond Date: Mon, 21 Nov 2016 12:22:24 +1100 Subject: [PATCH 36/53] Bug 1319323 (part 1) - improve sync unit tests; remove many ensureLegacyIdentityManager calls. r=tcsc MozReview-Commit-ID: CV6cpo2Tp5O --HG-- extra : rebase_source : 03f8fb39e69065bf7263b8bc20e4b2641a247b01 --- services/sync/modules-testing/utils.js | 21 ++++- services/sync/modules/browserid_identity.js | 2 +- .../sync/tests/unit/test_bookmark_record.js | 9 +-- .../sync/tests/unit/test_clients_engine.js | 22 ++++-- .../sync/tests/unit/test_clients_escape.js | 9 +-- services/sync/tests/unit/test_corrupt_keys.js | 12 +-- .../sync/tests/unit/test_errorhandler_1.js | 20 ++--- .../sync/tests/unit/test_errorhandler_2.js | 2 - services/sync/tests/unit/test_hmac_error.js | 76 ++++++++++--------- .../sync/tests/unit/test_records_crypto.js | 11 +-- services/sync/tests/unit/test_records_wbo.js | 1 - services/sync/tests/unit/test_resource_ua.js | 12 ++- .../tests/unit/test_service_attributes.js | 30 +++----- 13 files changed, 113 insertions(+), 114 deletions(-) diff --git a/services/sync/modules-testing/utils.js b/services/sync/modules-testing/utils.js index fcb0034c3f55..1ad1e1b570ae 100644 --- a/services/sync/modules-testing/utils.js +++ b/services/sync/modules-testing/utils.js @@ -144,6 +144,8 @@ this.setBasicCredentials = // Return an identity configuration suitable for testing with our identity // providers. |overrides| can specify overrides for any default values. +// |server| is optional, but if specified, will be used to form the cluster +// URL for the FxA identity. this.makeIdentityConfig = function(overrides) { // first setup the defaults. let result = { @@ -249,13 +251,28 @@ this.configureFxAccountIdentity = function(authService, authService._account = config.fxaccount.user.email; } -this.configureIdentity = async function(identityOverrides) { - let config = makeIdentityConfig(identityOverrides); +this.configureIdentity = async function(identityOverrides, server) { + let config = makeIdentityConfig(identityOverrides, server); let ns = {}; Cu.import("resource://services-sync/service.js", ns); + if (server) { + ns.Service.serverURL = server.baseURI; + } + if (ns.Service.identity instanceof BrowserIDManager) { // do the FxAccounts thang... + + // If a server was specified, ensure FxA has a correct cluster URL available. + if (server && !config.fxaccount.token.endpoint) { + let ep = server.baseURI; + if (!ep.endsWith("/")) { + ep += "/"; + } + ep += "1.1/" + config.username + "/"; + config.fxaccount.token.endpoint = ep; + } + configureFxAccountIdentity(ns.Service.identity, config); await ns.Service.identity.initializeWithCurrentIdentity(); // need to wait until this identity manager is readyToAuthenticate. diff --git a/services/sync/modules/browserid_identity.js b/services/sync/modules/browserid_identity.js index 31e3461a13e3..26d3deeee96f 100644 --- a/services/sync/modules/browserid_identity.js +++ b/services/sync/modules/browserid_identity.js @@ -377,7 +377,7 @@ this.BrowserIDManager.prototype = { * Changes will not persist unless persistSyncCredentials() is called. */ set basicPassword(value) { - throw "basicPassword setter should be not used in BrowserIDManager"; + throw new Error("basicPassword setter should be not used in BrowserIDManager"); }, /** diff --git a/services/sync/tests/unit/test_bookmark_record.js b/services/sync/tests/unit/test_bookmark_record.js index 194fef5e23d0..f559f3e4f8e7 100644 --- a/services/sync/tests/unit/test_bookmark_record.js +++ b/services/sync/tests/unit/test_bookmark_record.js @@ -15,10 +15,9 @@ function prepareBookmarkItem(collection, id) { return b; } -function run_test() { - ensureLegacyIdentityManager(); - Service.identity.username = "john@example.com"; - Service.identity.syncKey = "abcdeabcdeabcdeabcdeabcdea"; +add_task(async function test_bookmark_record() { + await configureIdentity(); + generateNewKeys(Service.collectionKeys); let keyBundle = Service.identity.syncKeyBundle; @@ -45,4 +44,4 @@ function run_test() { do_check_eq(payload.stuff, "my payload here"); do_check_eq(bookmarkItem.getTypeObject(bookmarkItem.type), Bookmark); do_check_neq(payload, bookmarkItem.payload); // wrap.data.payload is the encrypted one -} +}); diff --git a/services/sync/tests/unit/test_clients_engine.js b/services/sync/tests/unit/test_clients_engine.js index d2123f80a044..3993b8c1eab1 100644 --- a/services/sync/tests/unit/test_clients_engine.js +++ b/services/sync/tests/unit/test_clients_engine.js @@ -37,7 +37,19 @@ function check_record_version(user, id) { equal("1.5", cleartext.protocols[1]); } -add_test(function test_bad_hmac() { +// compare 2 different command arrays, taking into account that a flowID +// attribute must exist, be unique in the commands, but isn't specified in +// "expected" as the value isn't known. +function compareCommands(actual, expected, description) { + let tweakedActual = JSON.parse(JSON.stringify(actual)); + tweakedActual.map(elt => delete elt.flowID); + deepEqual(tweakedActual, expected, description); + // each item must have a unique flowID. + let allIDs = new Set(actual.map(elt => elt.flowID).filter(fid => !!fid)); + equal(allIDs.size, actual.length, "all items have unique IDs"); +} + +add_task(async function test_bad_hmac() { _("Ensure that Clients engine deletes corrupt records."); let contents = { meta: {global: {engines: {clients: {version: engine.version, @@ -81,10 +93,8 @@ add_test(function test_bad_hmac() { } try { - ensureLegacyIdentityManager(); - let passphrase = "abcdeabcdeabcdeabcdeabcdea"; - Service.serverURL = server.baseURI; - Service.login("foo", "ilovejane", passphrase); + await configureIdentity({username: "foo"}, server); + Service.login("foo"); generateNewKeys(Service.collectionKeys); @@ -174,7 +184,7 @@ add_test(function test_bad_hmac() { } finally { Svc.Prefs.resetBranch(""); Service.recordManager.clearCache(); - server.stop(run_next_test); + await promiseStopServer(server); } }); diff --git a/services/sync/tests/unit/test_clients_escape.js b/services/sync/tests/unit/test_clients_escape.js index 8c8cd63e3ed8..837afc7a49a5 100644 --- a/services/sync/tests/unit/test_clients_escape.js +++ b/services/sync/tests/unit/test_clients_escape.js @@ -7,17 +7,14 @@ Cu.import("resource://services-sync/service.js"); Cu.import("resource://services-sync/util.js"); Cu.import("resource://testing-common/services/sync/utils.js"); -function run_test() { +add_task(async function test_clients_escape() { _("Set up test fixtures."); - ensureLegacyIdentityManager(); - Service.identity.username = "john@example.com"; - Service.clusterURL = "http://fakebase/"; + await configureIdentity(); let baseUri = "http://fakebase/1.1/foo/storage/"; let pubUri = baseUri + "keys/pubkey"; let privUri = baseUri + "keys/privkey"; - Service.identity.syncKey = "abcdeabcdeabcdeabcdeabcdea"; let keyBundle = Service.identity.syncKeyBundle; let engine = Service.clientsEngine; @@ -61,4 +58,4 @@ function run_test() { } finally { Svc.Prefs.resetBranch(""); } -} +}); diff --git a/services/sync/tests/unit/test_corrupt_keys.js b/services/sync/tests/unit/test_corrupt_keys.js index f92f169f85be..f64f11912965 100644 --- a/services/sync/tests/unit/test_corrupt_keys.js +++ b/services/sync/tests/unit/test_corrupt_keys.js @@ -14,8 +14,6 @@ Cu.import("resource://services-sync/util.js"); Cu.import("resource://testing-common/services/sync/utils.js"); add_task(async function test_locally_changed_keys() { - let passphrase = "abcdeabcdeabcdeabcdeabcdea"; - let hmacErrorCount = 0; function counting(f) { return function() { @@ -53,9 +51,9 @@ add_task(async function test_locally_changed_keys() { getBrowserState: () => JSON.stringify(myTabs) }; - setBasicCredentials("johndoe", "password", passphrase); - Service.serverURL = server.baseURI; - Service.clusterURL = server.baseURI; + await configureIdentity({ username: "johndoe" }, server); + // We aren't doing a .login yet, so fudge the cluster URL. + Service.clusterURL = Service.identity._token.endpoint; Service.engineManager.register(HistoryEngine); Service.engineManager.unregister("addons"); @@ -82,7 +80,7 @@ add_task(async function test_locally_changed_keys() { do_check_true(serverKeys.upload(Service.resource(Service.cryptoKeysURL)).success); // Check that login works. - do_check_true(Service.login("johndoe", "ilovejane", passphrase)); + do_check_true(Service.login("johndoe")); do_check_true(Service.isLoggedIn); // Sync should upload records. @@ -208,8 +206,6 @@ function run_test() { Log.repository.rootLogger.addAppender(new Log.DumpAppender()); validate_all_future_pings(); - ensureLegacyIdentityManager(); - run_next_test(); } diff --git a/services/sync/tests/unit/test_errorhandler_1.js b/services/sync/tests/unit/test_errorhandler_1.js index b68b39e35ce3..192fcb9363aa 100644 --- a/services/sync/tests/unit/test_errorhandler_1.js +++ b/services/sync/tests/unit/test_errorhandler_1.js @@ -52,8 +52,6 @@ function run_test() { Log.repository.getLogger("Sync.SyncScheduler").level = Log.Level.Trace; Log.repository.getLogger("Sync.ErrorHandler").level = Log.Level.Trace; - ensureLegacyIdentityManager(); - run_next_test(); } @@ -406,21 +404,19 @@ add_identity_test(this, function test_shouldReportLoginFailureWithNoCluster() { do_check_false(errorHandler.shouldReportError()); }); -// XXX - how to arrange for 'Service.identity.basicPassword = null;' in -// an fxaccounts environment? add_task(async function test_login_syncAndReportErrors_non_network_error() { // Test non-network errors are reported // when calling syncAndReportErrors let server = EHTestsCommon.sync_httpd_setup(); await EHTestsCommon.setUp(server); - Service.identity.basicPassword = null; + Service.identity.resetSyncKey(); let promiseObserved = promiseOneObserver("weave:ui:login:error"); setLastSync(NON_PROLONGED_ERROR_DURATION); errorHandler.syncAndReportErrors(); await promiseObserved; - do_check_eq(Status.login, LOGIN_FAILED_NO_PASSWORD); + do_check_eq(Status.login, LOGIN_FAILED_NO_PASSPHRASE); clean(); await promiseStopServer(server); @@ -456,21 +452,19 @@ add_identity_test(this, async function test_sync_syncAndReportErrors_non_network clean(); }); -// XXX - how to arrange for 'Service.identity.basicPassword = null;' in -// an fxaccounts environment? add_task(async function test_login_syncAndReportErrors_prolonged_non_network_error() { // Test prolonged, non-network errors are // reported when calling syncAndReportErrors. let server = EHTestsCommon.sync_httpd_setup(); await EHTestsCommon.setUp(server); - Service.identity.basicPassword = null; + Service.identity.resetSyncKey(); let promiseObserved = promiseOneObserver("weave:ui:login:error"); setLastSync(PROLONGED_ERROR_DURATION); errorHandler.syncAndReportErrors(); await promiseObserved; - do_check_eq(Status.login, LOGIN_FAILED_NO_PASSWORD); + do_check_eq(Status.login, LOGIN_FAILED_NO_PASSPHRASE); clean(); await promiseStopServer(server); @@ -581,7 +575,7 @@ add_task(async function test_login_prolonged_non_network_error() { // Test prolonged, non-network errors are reported let server = EHTestsCommon.sync_httpd_setup(); await EHTestsCommon.setUp(server); - Service.identity.basicPassword = null; + Service.identity.resetSyncKey(); let promiseObserved = promiseOneObserver("weave:ui:login:error"); @@ -663,14 +657,14 @@ add_task(async function test_login_non_network_error() { // Test non-network errors are reported let server = EHTestsCommon.sync_httpd_setup(); await EHTestsCommon.setUp(server); - Service.identity.basicPassword = null; + Service.identity.resetSyncKey(); let promiseObserved = promiseOneObserver("weave:ui:login:error"); setLastSync(NON_PROLONGED_ERROR_DURATION); Service.sync(); await promiseObserved; - do_check_eq(Status.login, LOGIN_FAILED_NO_PASSWORD); + do_check_eq(Status.login, LOGIN_FAILED_NO_PASSPHRASE); do_check_false(errorHandler.didReportProlongedError); clean(); diff --git a/services/sync/tests/unit/test_errorhandler_2.js b/services/sync/tests/unit/test_errorhandler_2.js index 21939649bdb1..2b91790d085b 100644 --- a/services/sync/tests/unit/test_errorhandler_2.js +++ b/services/sync/tests/unit/test_errorhandler_2.js @@ -52,8 +52,6 @@ function run_test() { Log.repository.getLogger("Sync.SyncScheduler").level = Log.Level.Trace; Log.repository.getLogger("Sync.ErrorHandler").level = Log.Level.Trace; - ensureLegacyIdentityManager(); - run_next_test(); } diff --git a/services/sync/tests/unit/test_hmac_error.js b/services/sync/tests/unit/test_hmac_error.js index 0b8866a64716..b83c5de8d94d 100644 --- a/services/sync/tests/unit/test_hmac_error.js +++ b/services/sync/tests/unit/test_hmac_error.js @@ -20,10 +20,6 @@ var hmacErrorCount = 0; function shared_setup() { hmacErrorCount = 0; - // Do not instantiate SyncTestingInfrastructure; we need real crypto. - ensureLegacyIdentityManager(); - setBasicCredentials("foo", "foo", "aabcdeabcdeabcdeabcdeabcde"); - // Make sure RotaryEngine is the only one we sync. Service.engineManager._engines = {}; Service.engineManager.register(RotaryEngine); @@ -79,7 +75,9 @@ add_task(async function hmac_error_during_404() { }; let server = sync_httpd_setup(handlers); - Service.serverURL = server.baseURI; + // Do not instantiate SyncTestingInfrastructure; we need real crypto. + await configureIdentity({ username: "foo" }, server); + Service.login(); try { _("Syncing."); @@ -102,7 +100,7 @@ add_task(async function hmac_error_during_404() { } }); -add_test(function hmac_error_during_node_reassignment() { +add_task(async function hmac_error_during_node_reassignment() { _("Attempt to replicate an HMAC error during node reassignment."); let [engine, rotaryColl, clientsColl, keysWBO, global] = shared_setup(); @@ -156,7 +154,9 @@ add_test(function hmac_error_during_node_reassignment() { }; let server = sync_httpd_setup(handlers); - Service.serverURL = server.baseURI; + // Do not instantiate SyncTestingInfrastructure; we need real crypto. + await configureIdentity({ username: "foo" }, server); + _("Syncing."); // First hit of clients will 401. This will happen after meta/global and // keys -- i.e., in the middle of the sync, but before RotaryEngine. @@ -202,44 +202,46 @@ add_test(function hmac_error_during_node_reassignment() { } _("Make sure that syncing again causes recovery."); - onSyncFinished = function() { - _("== First sync done."); - _("---------------------------"); + await new Promise(resolve => { onSyncFinished = function() { - _("== Second (automatic) sync done."); - hasData = rotaryColl.wbo("flying") || - rotaryColl.wbo("scotsman"); - hasKeys = keysWBO.modified; - do_check_true(!hasData == !hasKeys); + _("== First sync done."); + _("---------------------------"); + onSyncFinished = function() { + _("== Second (automatic) sync done."); + hasData = rotaryColl.wbo("flying") || + rotaryColl.wbo("scotsman"); + hasKeys = keysWBO.modified; + do_check_true(!hasData == !hasKeys); - // Kick off another sync. Can't just call it, because we're inside the - // lock... - Utils.nextTick(function() { - _("Now a fresh sync will get no HMAC errors."); - _("Partially resetting client, as if after a restart, and forcing redownload."); - Service.collectionKeys.clear(); - engine.lastSync = 0; - hmacErrorCount = 0; + // Kick off another sync. Can't just call it, because we're inside the + // lock... + Utils.nextTick(function() { + _("Now a fresh sync will get no HMAC errors."); + _("Partially resetting client, as if after a restart, and forcing redownload."); + Service.collectionKeys.clear(); + engine.lastSync = 0; + hmacErrorCount = 0; - onSyncFinished = function() { - // Two rotary items, one client record... no errors. - do_check_eq(hmacErrorCount, 0) + onSyncFinished = function() { + // Two rotary items, one client record... no errors. + do_check_eq(hmacErrorCount, 0) - Svc.Obs.remove("weave:service:sync:finish", obs); - Svc.Obs.remove("weave:service:sync:error", obs); + Svc.Obs.remove("weave:service:sync:finish", obs); + Svc.Obs.remove("weave:service:sync:error", obs); - Svc.Prefs.resetBranch(""); - Service.recordManager.clearCache(); - server.stop(run_next_test); - }; + Svc.Prefs.resetBranch(""); + Service.recordManager.clearCache(); + server.stop(resolve); + }; - Service.sync(); - }, - this); + Service.sync(); + }, + this); + }; }; - }; - onwards(); + onwards(); + }); }); function run_test() { diff --git a/services/sync/tests/unit/test_records_crypto.js b/services/sync/tests/unit/test_records_crypto.js index 392a746efa0c..45340e9a31cc 100644 --- a/services/sync/tests/unit/test_records_crypto.js +++ b/services/sync/tests/unit/test_records_crypto.js @@ -27,13 +27,10 @@ function prepareCryptoWrap(collection, id) { return w; } -function run_test() { +add_task(async function test_records_crypto() { let server; - do_test_pending(); - ensureLegacyIdentityManager(); - Service.identity.username = "john@example.com"; - Service.identity.syncKey = "a-abcde-abcde-abcde-abcde-abcde"; + await configureIdentity({ username: "john@example.com" }); let keyBundle = Service.identity.syncKeyBundle; try { @@ -177,6 +174,6 @@ function run_test() { log.info("Done!"); } finally { - server.stop(do_test_finished); + await promiseStopServer(server); } -} +}); diff --git a/services/sync/tests/unit/test_records_wbo.js b/services/sync/tests/unit/test_records_wbo.js index e3277b0a70a5..73f2e4ffbe34 100644 --- a/services/sync/tests/unit/test_records_wbo.js +++ b/services/sync/tests/unit/test_records_wbo.js @@ -79,7 +79,6 @@ function test_fetch() { function run_test() { initTestLogging("Trace"); - ensureLegacyIdentityManager(); test_toJSON(); test_fetch(); diff --git a/services/sync/tests/unit/test_resource_ua.js b/services/sync/tests/unit/test_resource_ua.js index 31c2cd3791bc..f077e062e381 100644 --- a/services/sync/tests/unit/test_resource_ua.js +++ b/services/sync/tests/unit/test_resource_ua.js @@ -26,7 +26,8 @@ function uaHandler(f) { }; } -function run_test() { +add_task(async function setup() { + Log.repository.rootLogger.addAppender(new Log.DumpAppender()); meta_global = new ServerWBO('global'); server = httpd_setup({ @@ -34,10 +35,7 @@ function run_test() { "/1.1/johndoe/storage/meta/global": uaHandler(meta_global.handler()), }); - ensureLegacyIdentityManager(); - setBasicCredentials("johndoe", "ilovejane"); - Service.serverURL = server.baseURI + "/"; - Service.clusterURL = server.baseURI + "/"; + await configureIdentity({ username: "johndoe" }, server); _("Server URL: " + server.baseURI); // Note this string is missing the trailing ".destkop" as the test @@ -47,11 +45,11 @@ function run_test() { " FxSync/" + WEAVE_VERSION + "." + Services.appinfo.appBuildID; - run_next_test(); -} +}) add_test(function test_fetchInfo() { _("Testing _fetchInfo."); + Service.login(); Service._fetchInfo(); _("User-Agent: " + ua); do_check_eq(ua, expectedUA + ".desktop"); diff --git a/services/sync/tests/unit/test_service_attributes.js b/services/sync/tests/unit/test_service_attributes.js index 931c7741a3b8..abcd49401632 100644 --- a/services/sync/tests/unit/test_service_attributes.js +++ b/services/sync/tests/unit/test_service_attributes.js @@ -7,13 +7,12 @@ Cu.import("resource://services-sync/util.js"); Cu.import("resource://testing-common/services/sync/fakeservices.js"); Cu.import("resource://testing-common/services/sync/utils.js"); -function test_urls() { +add_task(async function test_urls() { _("URL related Service properties correspond to preference settings."); try { - ensureLegacyIdentityManager(); do_check_true(!!Service.serverURL); // actual value may change do_check_eq(Service.clusterURL, ""); - do_check_eq(Service.userBaseURL, undefined); + do_check_false(Service.userBaseURL); do_check_eq(Service.infoURL, undefined); do_check_eq(Service.storageURL, undefined); do_check_eq(Service.metaURL, undefined); @@ -23,12 +22,12 @@ function test_urls() { // Since we don't have a cluster URL yet, these will still not be defined. do_check_eq(Service.infoURL, undefined); - do_check_eq(Service.userBaseURL, undefined); + do_check_false(Service.userBaseURL); do_check_eq(Service.storageURL, undefined); do_check_eq(Service.metaURL, undefined); Service.serverURL = "http://weave.server/"; - Service.clusterURL = "http://weave.cluster/"; + Service.clusterURL = "http://weave.cluster/1.1/johndoe/"; do_check_eq(Service.userBaseURL, "http://weave.cluster/1.1/johndoe/"); do_check_eq(Service.infoURL, @@ -60,9 +59,6 @@ function test_urls() { do_check_eq(Service.identity.username, null); _("The 'serverURL' attributes updates/resets preferences."); - // Identical value doesn't do anything - Service.serverURL = Service.serverURL; - do_check_eq(Service.clusterURL, "http://weave.cluster/"); Service.serverURL = "http://different.auth.node/"; do_check_eq(Svc.Prefs.get("serverURL"), "http://different.auth.node/"); @@ -71,10 +67,10 @@ function test_urls() { } finally { Svc.Prefs.resetBranch(""); } -} +}); -function test_syncID() { +add_test(function test_syncID() { _("Service.syncID is auto-generated, corresponds to preference."); new FakeGUIDService(); @@ -92,10 +88,11 @@ function test_syncID() { } finally { Svc.Prefs.resetBranch(""); new FakeGUIDService(); + run_next_test(); } -} +}); -function test_locked() { +add_test(function test_locked() { _("The 'locked' attribute can be toggled with lock() and unlock()"); // Defaults to false @@ -109,10 +106,5 @@ function test_locked() { Service.unlock(); do_check_eq(Service.locked, false); -} - -function run_test() { - test_urls(); - test_syncID(); - test_locked(); -} + run_next_test(); +}); From 40140fc9de3d138f3044ebd37ff8efa4c45dc7e6 Mon Sep 17 00:00:00 2001 From: Mark Hammond Date: Tue, 22 Nov 2016 15:03:47 +1100 Subject: [PATCH 37/53] Bug 1319323 (part 2) - improve sync unit tests; SyncTestingInfrastructure now uses the FxA identity provider. r=tcsc MozReview-Commit-ID: 2zpZMpvbAy --HG-- extra : rebase_source : a33b15a3ef8acf39a7a423694093a690ca519c88 --- services/sync/modules-testing/utils.js | 48 ++--- .../tests/unit/head_errorhandler_common.js | 28 ++- services/sync/tests/unit/head_helpers.js | 2 +- .../sync/tests/unit/test_addons_engine.js | 11 +- .../sync/tests/unit/test_bookmark_duping.js | 24 ++- .../sync/tests/unit/test_bookmark_engine.js | 20 +- .../unit/test_bookmark_smart_bookmarks.js | 10 +- .../sync/tests/unit/test_clients_engine.js | 66 +++--- .../tests/unit/test_collections_recovery.js | 4 +- services/sync/tests/unit/test_engine_abort.js | 6 +- .../sync/tests/unit/test_errorhandler_1.js | 21 +- .../sync/tests/unit/test_errorhandler_2.js | 72 ++----- .../sync/tests/unit/test_errorhandler_eol.js | 4 +- ...test_errorhandler_sync_checkServerError.js | 4 +- .../sync/tests/unit/test_history_engine.js | 13 +- .../sync/tests/unit/test_interval_triggers.js | 4 +- .../sync/tests/unit/test_score_triggers.js | 63 +++--- .../sync/tests/unit/test_service_sync_401.js | 15 +- .../tests/unit/test_service_sync_specified.js | 35 ++-- .../test_service_sync_updateEnabledEngines.js | 71 ++++--- .../tests/unit/test_service_wipeServer.js | 10 +- services/sync/tests/unit/test_syncengine.js | 62 +++--- .../sync/tests/unit/test_syncengine_sync.js | 188 +++++++++--------- .../sync/tests/unit/test_syncscheduler.js | 21 +- services/sync/tests/unit/test_tab_engine.js | 21 +- services/sync/tests/unit/test_telemetry.js | 27 ++- 26 files changed, 395 insertions(+), 455 deletions(-) diff --git a/services/sync/modules-testing/utils.js b/services/sync/modules-testing/utils.js index 1ad1e1b570ae..fa575ce09544 100644 --- a/services/sync/modules-testing/utils.js +++ b/services/sync/modules-testing/utils.js @@ -260,6 +260,8 @@ this.configureIdentity = async function(identityOverrides, server) { ns.Service.serverURL = server.baseURI; } + ns.Service._clusterManager = ns.Service.identity.createClusterManager(ns.Service); + if (ns.Service.identity instanceof BrowserIDManager) { // do the FxAccounts thang... @@ -275,42 +277,34 @@ this.configureIdentity = async function(identityOverrides, server) { configureFxAccountIdentity(ns.Service.identity, config); await ns.Service.identity.initializeWithCurrentIdentity(); - // need to wait until this identity manager is readyToAuthenticate. - await ns.Service.identity.whenReadyToAuthenticate.promise; + // and cheat to avoid requiring each test do an explicit login - give it + // a cluster URL. + if (config.fxaccount.token.endpoint) { + ns.Service.clusterURL = config.fxaccount.token.endpoint; + } return; } // old style identity provider. + if (server) { + ns.Service.clusterURL = server.baseURI + "/"; + } + ns.Service.identity.username = config.username; + ns.Service._updateCachedURLs(); setBasicCredentials(config.username, config.sync.password, config.sync.syncKey); } -this.SyncTestingInfrastructure = function (server, username, password, syncKey) { +this.SyncTestingInfrastructure = async function (server, username, password) { let ns = {}; Cu.import("resource://services-sync/service.js", ns); - ensureLegacyIdentityManager(); - let config = makeIdentityConfig(); - // XXX - hacks for the sync identity provider. - if (username) - config.username = username; - if (password) - config.sync.password = password; - if (syncKey) - config.sync.syncKey = syncKey; - let cb = Async.makeSpinningCallback(); - configureIdentity(config).then(cb, cb); - cb.wait(); - - let i = server.identity; - let uri = i.primaryScheme + "://" + i.primaryHost + ":" + - i.primaryPort + "/"; - - ns.Service.serverURL = uri; - ns.Service.clusterURL = uri; - - this.logStats = initTestLogging(); - this.fakeFilesystem = new FakeFilesystemService({}); - this.fakeGUIDService = new FakeGUIDService(); - this.fakeCryptoService = new FakeCryptoService(); + let config = makeIdentityConfig({ username, password }); + await configureIdentity(config, server); + return { + logStats: initTestLogging(), + fakeFilesystem: new FakeFilesystemService({}), + fakeGUIDService: new FakeGUIDService(), + fakeCryptoService: new FakeCryptoService(), + } } /** diff --git a/services/sync/tests/unit/head_errorhandler_common.js b/services/sync/tests/unit/head_errorhandler_common.js index 10c3694d3176..0b8031605946 100644 --- a/services/sync/tests/unit/head_errorhandler_common.js +++ b/services/sync/tests/unit/head_errorhandler_common.js @@ -43,25 +43,25 @@ const EHTestsCommon = { "/1.1/janedoe/info/collections": handler_401, // Maintenance or overloaded (503 + Retry-After) at info/collections. - "/maintenance/1.1/broken.info/info/collections": EHTestsCommon.service_unavailable, + "/1.1/broken.info/info/collections": EHTestsCommon.service_unavailable, // Maintenance or overloaded (503 + Retry-After) at meta/global. - "/maintenance/1.1/broken.meta/storage/meta/global": EHTestsCommon.service_unavailable, - "/maintenance/1.1/broken.meta/info/collections": collectionsHelper.handler, + "/1.1/broken.meta/storage/meta/global": EHTestsCommon.service_unavailable, + "/1.1/broken.meta/info/collections": collectionsHelper.handler, // Maintenance or overloaded (503 + Retry-After) at crypto/keys. - "/maintenance/1.1/broken.keys/storage/meta/global": upd("meta", global.handler()), - "/maintenance/1.1/broken.keys/info/collections": collectionsHelper.handler, - "/maintenance/1.1/broken.keys/storage/crypto/keys": EHTestsCommon.service_unavailable, + "/1.1/broken.keys/storage/meta/global": upd("meta", global.handler()), + "/1.1/broken.keys/info/collections": collectionsHelper.handler, + "/1.1/broken.keys/storage/crypto/keys": EHTestsCommon.service_unavailable, // Maintenance or overloaded (503 + Retry-After) at wiping collection. - "/maintenance/1.1/broken.wipe/info/collections": collectionsHelper.handler, - "/maintenance/1.1/broken.wipe/storage/meta/global": upd("meta", global.handler()), - "/maintenance/1.1/broken.wipe/storage/crypto/keys": + "/1.1/broken.wipe/info/collections": collectionsHelper.handler, + "/1.1/broken.wipe/storage/meta/global": upd("meta", global.handler()), + "/1.1/broken.wipe/storage/crypto/keys": upd("crypto", (new ServerWBO("keys")).handler()), - "/maintenance/1.1/broken.wipe/storage": EHTestsCommon.service_unavailable, - "/maintenance/1.1/broken.wipe/storage/clients": upd("clients", clientsColl.handler()), - "/maintenance/1.1/broken.wipe/storage/catapult": EHTestsCommon.service_unavailable + "/1.1/broken.wipe/storage": EHTestsCommon.service_unavailable, + "/1.1/broken.wipe/storage/clients": upd("clients", clientsColl.handler()), + "/1.1/broken.wipe/storage/catapult": EHTestsCommon.service_unavailable }); }, @@ -93,9 +93,7 @@ const EHTestsCommon = { }, async setUp(server) { - await configureIdentity({ username: "johndoe" }); - Service.serverURL = server.baseURI + "/"; - Service.clusterURL = server.baseURI + "/"; + await configureIdentity({ username: "johndoe" }, server); return EHTestsCommon.generateAndUploadKeys() }, diff --git a/services/sync/tests/unit/head_helpers.js b/services/sync/tests/unit/head_helpers.js index 906a75af372a..b830c8d5cbe4 100644 --- a/services/sync/tests/unit/head_helpers.js +++ b/services/sync/tests/unit/head_helpers.js @@ -295,7 +295,7 @@ function assert_success_ping(ping) { ok(!!ping); assert_valid_ping(ping); ping.syncs.forEach(record => { - ok(!record.failureReason); + ok(!record.failureReason, JSON.stringify(record.failureReason)); equal(undefined, record.status); greater(record.engines.length, 0); for (let e of record.engines) { diff --git a/services/sync/tests/unit/test_addons_engine.js b/services/sync/tests/unit/test_addons_engine.js index 64e4e32e8ca2..177e65b43e14 100644 --- a/services/sync/tests/unit/test_addons_engine.js +++ b/services/sync/tests/unit/test_addons_engine.js @@ -143,7 +143,7 @@ add_test(function test_get_changed_ids() { advance_test(); }); -add_test(function test_disabled_install_semantics() { +add_task(async function test_disabled_install_semantics() { _("Ensure that syncing a disabled add-on preserves proper state."); // This is essentially a test for bug 712542, which snuck into the original @@ -151,12 +151,11 @@ add_test(function test_disabled_install_semantics() { // disabled state and incoming syncGUID is preserved, even on the next sync. const USER = "foo"; const PASSWORD = "password"; - const PASSPHRASE = "abcdeabcdeabcdeabcdeabcdea"; const ADDON_ID = "addon1@tests.mozilla.org"; let server = new SyncServer(); server.start(); - new SyncTestingInfrastructure(server.server, USER, PASSWORD, PASSPHRASE); + await SyncTestingInfrastructure(server, USER, PASSWORD); generateNewKeys(Service.collectionKeys); @@ -199,9 +198,7 @@ add_test(function test_disabled_install_semantics() { // At this point the non-restartless extension should be staged for install. // Don't need this server any more. - let cb = Async.makeSpinningCallback(); - amoServer.stop(cb); - cb.wait(); + await promiseStopServer(amoServer); // We ensure the reconciler has recorded the proper ID and enabled state. let addon = reconciler.getAddonStateFromSyncGUID(id); @@ -224,7 +221,7 @@ add_test(function test_disabled_install_semantics() { do_check_eq(ADDON_ID, payload.addonID); do_check_false(payload.enabled); - server.stop(advance_test); + promiseStopServer(server); }); add_test(function cleanup() { diff --git a/services/sync/tests/unit/test_bookmark_duping.js b/services/sync/tests/unit/test_bookmark_duping.js index f6fd3c48bebf..02aed3318810 100644 --- a/services/sync/tests/unit/test_bookmark_duping.js +++ b/services/sync/tests/unit/test_bookmark_duping.js @@ -23,7 +23,7 @@ const store = engine._store; store._log.level = Log.Level.Trace; engine._log.level = Log.Level.Trace; -function setup() { +async function setup() { let server = serverForUsers({"foo": "password"}, { meta: {global: {engines: {bookmarks: {version: engine.version, syncID: engine.syncID}}}}, @@ -32,10 +32,16 @@ function setup() { generateNewKeys(Service.collectionKeys); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); let collection = server.user("foo").collection("bookmarks"); + // The bookmarks engine *always* tracks changes, meaning we might try + // and sync due to the bookmarks we ourselves create! Worse, because we + // do an engine sync only, there's no locking - so we end up with multiple + // syncs running. Neuter that by making the threshold very large. + Service.scheduler.syncThreshold = 10000000; + Svc.Obs.notify("weave:engine:start-tracking"); // We skip usual startup... return { server, collection }; @@ -130,7 +136,7 @@ async function validate(collection, expectedFailures = []) { add_task(async function test_dupe_bookmark() { _("Ensure that a bookmark we consider a dupe is handled correctly."); - let { server, collection } = this.setup(); + let { server, collection } = await this.setup(); try { // The parent folder and one bookmark in it. @@ -181,7 +187,7 @@ add_task(async function test_dupe_bookmark() { add_task(async function test_dupe_reparented_bookmark() { _("Ensure that a bookmark we consider a dupe from a different parent is handled correctly"); - let { server, collection } = this.setup(); + let { server, collection } = await this.setup(); try { // The parent folder and one bookmark in it. @@ -247,7 +253,7 @@ add_task(async function test_dupe_reparented_bookmark() { add_task(async function test_dupe_reparented_locally_changed_bookmark() { _("Ensure that a bookmark with local changes we consider a dupe from a different parent is handled correctly"); - let { server, collection } = this.setup(); + let { server, collection } = await this.setup(); try { // The parent folder and one bookmark in it. @@ -324,7 +330,7 @@ add_task(async function test_dupe_reparented_to_earlier_appearing_parent_bookmar _("Ensure that a bookmark we consider a dupe from a different parent that " + "appears in the same sync before the dupe item"); - let { server, collection } = this.setup(); + let { server, collection } = await this.setup(); try { // The parent folder and one bookmark in it. @@ -401,7 +407,7 @@ add_task(async function test_dupe_reparented_to_later_appearing_parent_bookmark( _("Ensure that a bookmark we consider a dupe from a different parent that " + "doesn't exist locally as we process the child, but does appear in the same sync"); - let { server, collection } = this.setup(); + let { server, collection } = await this.setup(); try { // The parent folder and one bookmark in it. @@ -478,7 +484,7 @@ add_task(async function test_dupe_reparented_to_future_arriving_parent_bookmark( _("Ensure that a bookmark we consider a dupe from a different parent that " + "doesn't exist locally and doesn't appear in this Sync is handled correctly"); - let { server, collection } = this.setup(); + let { server, collection } = await this.setup(); try { // The parent folder and one bookmark in it. @@ -598,7 +604,7 @@ add_task(async function test_dupe_empty_folder() { _("Ensure that an empty folder we consider a dupe is handled correctly."); // Empty folders aren't particularly interesting in practice (as that seems // an edge-case) but duping folders with items is broken - bug 1293163. - let { server, collection } = this.setup(); + let { server, collection } = await this.setup(); try { // The folder we will end up duping away. diff --git a/services/sync/tests/unit/test_bookmark_engine.js b/services/sync/tests/unit/test_bookmark_engine.js index 801a4a049aa6..81614b4da892 100644 --- a/services/sync/tests/unit/test_bookmark_engine.js +++ b/services/sync/tests/unit/test_bookmark_engine.js @@ -51,7 +51,7 @@ add_task(async function test_delete_invalid_roots_from_server() { let store = engine._store; let tracker = engine._tracker; let server = serverForFoo(engine); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); let collection = server.user("foo").collection("bookmarks"); @@ -108,7 +108,7 @@ add_task(async function test_change_during_sync() { let store = engine._store; let tracker = engine._tracker; let server = serverForFoo(engine); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); let collection = server.user("foo").collection("bookmarks"); @@ -256,7 +256,7 @@ add_task(async function test_change_during_sync() { add_task(async function bad_record_allIDs() { let server = new SyncServer(); server.start(); - let syncTesting = new SyncTestingInfrastructure(server.server); + let syncTesting = await SyncTestingInfrastructure(server); _("Ensure that bad Places queries don't cause an error in getAllIDs."); let engine = new BookmarksEngine(Service); @@ -285,6 +285,12 @@ add_task(async function bad_record_allIDs() { }); function serverForFoo(engine) { + // The bookmarks engine *always* tracks changes, meaning we might try + // and sync due to the bookmarks we ourselves create! Worse, because we + // do an engine sync only, there's no locking - so we end up with multiple + // syncs running. Neuter that by making the threshold very large. + Service.scheduler.syncThreshold = 10000000; + return serverForUsers({"foo": "password"}, { meta: {global: {engines: {bookmarks: {version: engine.version, syncID: engine.syncID}}}}, @@ -298,7 +304,7 @@ add_task(async function test_processIncoming_error_orderChildren() { let engine = new BookmarksEngine(Service); let store = engine._store; let server = serverForFoo(engine); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); let collection = server.user("foo").collection("bookmarks"); @@ -368,7 +374,7 @@ add_task(async function test_restorePromptsReupload() { let engine = new BookmarksEngine(Service); let store = engine._store; let server = serverForFoo(engine); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); let collection = server.user("foo").collection("bookmarks"); @@ -538,7 +544,7 @@ add_task(async function test_mismatched_types() { let engine = new BookmarksEngine(Service); let store = engine._store; let server = serverForFoo(engine); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); _("GUID: " + store.GUIDForId(6, true)); @@ -583,7 +589,7 @@ add_task(async function test_bookmark_guidMap_fail() { let server = serverForFoo(engine); let coll = server.user("foo").collection("bookmarks"); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); // Add one item to the server. let itemID = PlacesUtils.bookmarks.createFolder( diff --git a/services/sync/tests/unit/test_bookmark_smart_bookmarks.js b/services/sync/tests/unit/test_bookmark_smart_bookmarks.js index 9f60a065bc31..d87e9e757af4 100644 --- a/services/sync/tests/unit/test_bookmark_smart_bookmarks.js +++ b/services/sync/tests/unit/test_bookmark_smart_bookmarks.js @@ -59,7 +59,7 @@ function serverForFoo(engine) { // handled locally. add_task(async function test_annotation_uploaded() { let server = serverForFoo(engine); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); let startCount = smartBookmarkCount(); @@ -168,13 +168,13 @@ add_task(async function test_annotation_uploaded() { store.wipe(); Svc.Prefs.resetBranch(""); Service.recordManager.clearCache(); - server.stop(run_next_test); + await promiseStopServer(server); } }); -add_test(function test_smart_bookmarks_duped() { +add_task(async function test_smart_bookmarks_duped() { let server = serverForFoo(engine); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); let parent = PlacesUtils.toolbarFolderId; let uri = @@ -219,7 +219,7 @@ add_test(function test_smart_bookmarks_duped() { } finally { // Clean up. store.wipe(); - server.stop(do_test_finished); + await promiseStopServer(server); Svc.Prefs.resetBranch(""); Service.recordManager.clearCache(); } diff --git a/services/sync/tests/unit/test_clients_engine.js b/services/sync/tests/unit/test_clients_engine.js index 3993b8c1eab1..5575bee9ee96 100644 --- a/services/sync/tests/unit/test_clients_engine.js +++ b/services/sync/tests/unit/test_clients_engine.js @@ -203,7 +203,7 @@ add_test(function test_properties() { } }); -add_test(function test_full_sync() { +add_task(async function test_full_sync() { _("Ensure that Clients engine fetches all records for each sync."); let now = Date.now() / 1000; @@ -216,7 +216,7 @@ add_test(function test_full_sync() { let server = serverForUsers({"foo": "password"}, contents); let user = server.user("foo"); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); generateNewKeys(Service.collectionKeys); let activeID = Utils.makeGUID(); @@ -271,12 +271,12 @@ add_test(function test_full_sync() { try { server.deleteCollections("foo"); } finally { - server.stop(run_next_test); + await promiseStopServer(server); } } }); -add_test(function test_sync() { +add_task(async function test_sync() { _("Ensure that Clients engine uploads a new client record once a week."); let contents = { @@ -288,7 +288,7 @@ add_test(function test_sync() { let server = serverForUsers({"foo": "password"}, contents); let user = server.user("foo"); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); generateNewKeys(Service.collectionKeys); function clientWBO() { @@ -326,7 +326,7 @@ add_test(function test_sync() { } finally { Svc.Prefs.resetBranch(""); Service.recordManager.clearCache(); - server.stop(run_next_test); + await promiseStopServer(server); } }); @@ -524,7 +524,7 @@ add_test(function test_process_incoming_commands() { ok(!engine.processIncomingCommands()); }); -add_test(function test_filter_duplicate_names() { +add_task(async function test_filter_duplicate_names() { _("Ensure that we exclude clients with identical names that haven't synced in a week."); let now = Date.now() / 1000; @@ -537,7 +537,7 @@ add_test(function test_filter_duplicate_names() { let server = serverForUsers({"foo": "password"}, contents); let user = server.user("foo"); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); generateNewKeys(Service.collectionKeys); // Synced recently. @@ -675,12 +675,12 @@ add_test(function test_filter_duplicate_names() { try { server.deleteCollections("foo"); } finally { - server.stop(run_next_test); + await promiseStopServer(server); } } }); -add_test(function test_command_sync() { +add_task(async function test_command_sync() { _("Ensure that commands are synced across clients."); engine._store.wipe(); @@ -693,7 +693,7 @@ add_test(function test_command_sync() { crypto: {} }; let server = serverForUsers({"foo": "password"}, contents); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); let user = server.user("foo"); let remoteId = Utils.makeGUID(); @@ -753,7 +753,7 @@ add_test(function test_command_sync() { let collection = server.getCollection("foo", "clients"); collection.remove(remoteId); } finally { - server.stop(run_next_test); + await promiseStopServer(server); } } }); @@ -880,7 +880,7 @@ add_test(function test_optional_client_fields() { run_next_test(); }); -add_test(function test_merge_commands() { +add_task(async function test_merge_commands() { _("Verifies local commands for remote clients are merged with the server's"); let now = Date.now() / 1000; @@ -893,7 +893,7 @@ add_test(function test_merge_commands() { let server = serverForUsers({"foo": "password"}, contents); let user = server.user("foo"); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); generateNewKeys(Service.collectionKeys); let desktopID = Utils.makeGUID(); @@ -954,12 +954,12 @@ add_test(function test_merge_commands() { try { server.deleteCollections("foo"); } finally { - server.stop(run_next_test); + await promiseStopServer(server); } } }); -add_test(function test_duplicate_remote_commands() { +add_task(async function test_duplicate_remote_commands() { _("Verifies local commands for remote clients are sent only once (bug 1289287)"); let now = Date.now() / 1000; @@ -972,7 +972,7 @@ add_test(function test_duplicate_remote_commands() { let server = serverForUsers({"foo": "password"}, contents); let user = server.user("foo"); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); generateNewKeys(Service.collectionKeys); let desktopID = Utils.makeGUID(); @@ -1024,12 +1024,12 @@ add_test(function test_duplicate_remote_commands() { try { server.deleteCollections("foo"); } finally { - server.stop(run_next_test); + await promiseStopServer(server); } } }); -add_test(function test_upload_after_reboot() { +add_task(async function test_upload_after_reboot() { _("Multiple downloads, reboot, then upload (bug 1289287)"); let now = Date.now() / 1000; @@ -1042,7 +1042,7 @@ add_test(function test_upload_after_reboot() { let server = serverForUsers({"foo": "password"}, contents); let user = server.user("foo"); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); generateNewKeys(Service.collectionKeys); let deviceBID = Utils.makeGUID(); @@ -1115,12 +1115,12 @@ add_test(function test_upload_after_reboot() { try { server.deleteCollections("foo"); } finally { - server.stop(run_next_test); + await promiseStopServer(server); } } }); -add_test(function test_keep_cleared_commands_after_reboot() { +add_task(async function test_keep_cleared_commands_after_reboot() { _("Download commands, fail upload, reboot, then apply new commands (bug 1289287)"); let now = Date.now() / 1000; @@ -1133,7 +1133,7 @@ add_test(function test_keep_cleared_commands_after_reboot() { let server = serverForUsers({"foo": "password"}, contents); let user = server.user("foo"); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); generateNewKeys(Service.collectionKeys); let deviceBID = Utils.makeGUID(); @@ -1233,12 +1233,12 @@ add_test(function test_keep_cleared_commands_after_reboot() { try { server.deleteCollections("foo"); } finally { - server.stop(run_next_test); + await promiseStopServer(server); } } }); -add_test(function test_deleted_commands() { +add_task(async function test_deleted_commands() { _("Verifies commands for a deleted client are discarded"); let now = Date.now() / 1000; @@ -1251,7 +1251,7 @@ add_test(function test_deleted_commands() { let server = serverForUsers({"foo": "password"}, contents); let user = server.user("foo"); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); generateNewKeys(Service.collectionKeys); let activeID = Utils.makeGUID(); @@ -1302,12 +1302,12 @@ add_test(function test_deleted_commands() { try { server.deleteCollections("foo"); } finally { - server.stop(run_next_test); + await promiseStopServer(server); } } }); -add_test(function test_send_uri_ack() { +add_task(async function test_send_uri_ack() { _("Ensure a sent URI is deleted when the client syncs"); let now = Date.now() / 1000; @@ -1320,7 +1320,7 @@ add_test(function test_send_uri_ack() { let server = serverForUsers({"foo": "password"}, contents); let user = server.user("foo"); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); generateNewKeys(Service.collectionKeys); try { @@ -1365,12 +1365,12 @@ add_test(function test_send_uri_ack() { try { server.deleteCollections("foo"); } finally { - server.stop(run_next_test); + await promiseStopServer(server); } } }); -add_test(function test_command_sync() { +add_task(async function test_command_sync() { _("Notify other clients when writing their record."); engine._store.wipe(); @@ -1383,7 +1383,7 @@ add_test(function test_command_sync() { crypto: {} }; let server = serverForUsers({"foo": "password"}, contents); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); let user = server.user("foo"); let collection = server.getCollection("foo", "clients"); @@ -1437,7 +1437,7 @@ add_test(function test_command_sync() { try { server.deleteCollections("foo"); } finally { - server.stop(run_next_test); + await promiseStopServer(server); } } }); diff --git a/services/sync/tests/unit/test_collections_recovery.js b/services/sync/tests/unit/test_collections_recovery.js index 5f9a6ed19c4c..dde230a44ec4 100644 --- a/services/sync/tests/unit/test_collections_recovery.js +++ b/services/sync/tests/unit/test_collections_recovery.js @@ -24,8 +24,6 @@ add_identity_test(this, async function test_missing_crypto_collection() { }; } - await configureIdentity({username: "johndoe"}); - let handlers = { "/1.1/johndoe/info/collections": maybe_empty(johnHelper.handler), "/1.1/johndoe/storage/crypto/keys": johnU("crypto", new ServerWBO("keys").handler()), @@ -41,7 +39,7 @@ add_identity_test(this, async function test_missing_crypto_collection() { johnU(coll, new ServerCollection({}, true).handler()); } let server = httpd_setup(handlers); - Service.serverURL = server.baseURI; + await configureIdentity({username: "johndoe"}, server); try { let fresh = 0; diff --git a/services/sync/tests/unit/test_engine_abort.js b/services/sync/tests/unit/test_engine_abort.js index 8ec8664435a3..5981cfc10ce0 100644 --- a/services/sync/tests/unit/test_engine_abort.js +++ b/services/sync/tests/unit/test_engine_abort.js @@ -8,7 +8,7 @@ Cu.import("resource://services-sync/util.js"); Cu.import("resource://testing-common/services/sync/rotaryengine.js"); Cu.import("resource://testing-common/services/sync/utils.js"); -add_test(function test_processIncoming_abort() { +add_task(async function test_processIncoming_abort() { _("An abort exception, raised in applyIncoming, will abort _processIncoming."); let engine = new RotaryEngine(Service); @@ -21,7 +21,7 @@ add_test(function test_processIncoming_abort() { "/1.1/foo/storage/rotary": collection.handler() }); - new SyncTestingInfrastructure(server); + await SyncTestingInfrastructure(server); generateNewKeys(Service.collectionKeys); _("Create some server data."); @@ -59,7 +59,7 @@ add_test(function test_processIncoming_abort() { do_check_eq(err, undefined); - server.stop(run_next_test); + await promiseStopServer(server); Svc.Prefs.resetBranch(""); Service.recordManager.clearCache(); }); diff --git a/services/sync/tests/unit/test_errorhandler_1.js b/services/sync/tests/unit/test_errorhandler_1.js index 192fcb9363aa..a4cf613ce2f9 100644 --- a/services/sync/tests/unit/test_errorhandler_1.js +++ b/services/sync/tests/unit/test_errorhandler_1.js @@ -99,7 +99,7 @@ add_identity_test(this, async function test_401_logout() { } // Make sync fail due to login rejected. - await configureIdentity({username: "janedoe"}); + await configureIdentity({username: "janedoe"}, server); Service._updateCachedURLs(); _("Starting first sync."); @@ -448,8 +448,9 @@ add_identity_test(this, async function test_sync_syncAndReportErrors_non_network do_check_eq(Status.sync, CREDENTIALS_CHANGED); // If we clean this tick, telemetry won't get the right error - await promiseStopServer(server); + await promiseNextTick(); clean(); + await promiseStopServer(server); }); add_task(async function test_login_syncAndReportErrors_prolonged_non_network_error() { @@ -496,8 +497,9 @@ add_identity_test(this, async function test_sync_syncAndReportErrors_prolonged_n do_check_eq(Status.sync, CREDENTIALS_CHANGED); // If we clean this tick, telemetry won't get the right error - await promiseStopServer(server); + await promiseNextTick(); clean(); + await promiseStopServer(server); }); add_identity_test(this, async function test_login_syncAndReportErrors_network_error() { @@ -614,8 +616,8 @@ add_task(async function test_sync_prolonged_non_network_error() { await promiseObserved; do_check_eq(Status.sync, PROLONGED_SYNC_FAILURE); do_check_true(errorHandler.didReportProlongedError); - await promiseStopServer(server); clean(); + await promiseStopServer(server); }); add_identity_test(this, async function test_login_prolonged_network_error() { @@ -761,8 +763,8 @@ add_identity_test(this, async function test_sync_server_maintenance_error() { do_check_eq(Status.sync, SERVER_MAINTENANCE); do_check_false(errorHandler.didReportProlongedError); - await promiseStopServer(server); clean(); + await promiseStopServer(server); }); add_identity_test(this, async function test_info_collections_login_server_maintenance_error() { @@ -770,10 +772,7 @@ add_identity_test(this, async function test_info_collections_login_server_mainte let server = EHTestsCommon.sync_httpd_setup(); await EHTestsCommon.setUp(server); - Service.username = "broken.info"; - await configureIdentity({username: "broken.info"}); - Service.serverURL = server.baseURI + "/maintenance/"; - Service.clusterURL = server.baseURI + "/maintenance/"; + await configureIdentity({username: "broken.info"}, server); let backoffInterval; Svc.Obs.add("weave:service:backoff:interval", function observe(subject, data) { @@ -811,9 +810,7 @@ add_identity_test(this, async function test_meta_global_login_server_maintenance let server = EHTestsCommon.sync_httpd_setup(); await EHTestsCommon.setUp(server); - await configureIdentity({username: "broken.meta"}); - Service.serverURL = server.baseURI + "/maintenance/"; - Service.clusterURL = server.baseURI + "/maintenance/"; + await configureIdentity({username: "broken.meta"}, server); let backoffInterval; Svc.Obs.add("weave:service:backoff:interval", function observe(subject, data) { diff --git a/services/sync/tests/unit/test_errorhandler_2.js b/services/sync/tests/unit/test_errorhandler_2.js index 2b91790d085b..efa1f97ec9ce 100644 --- a/services/sync/tests/unit/test_errorhandler_2.js +++ b/services/sync/tests/unit/test_errorhandler_2.js @@ -69,9 +69,7 @@ add_identity_test(this, async function test_crypto_keys_login_server_maintenance let server = EHTestsCommon.sync_httpd_setup(); await EHTestsCommon.setUp(server); - await configureIdentity({username: "broken.keys"}); - Service.serverURL = server.baseURI + "/maintenance/"; - Service.clusterURL = server.baseURI + "/maintenance/"; + await configureIdentity({username: "broken.keys"}, server); // Force re-download of keys Service.collectionKeys.clear(); @@ -142,9 +140,7 @@ add_identity_test(this, async function test_info_collections_login_prolonged_ser let server = EHTestsCommon.sync_httpd_setup(); await EHTestsCommon.setUp(server); - await configureIdentity({username: "broken.info"}); - Service.serverURL = server.baseURI + "/maintenance/"; - Service.clusterURL = server.baseURI + "/maintenance/"; + await configureIdentity({username: "broken.info"}, server); let backoffInterval; Svc.Obs.add("weave:service:backoff:interval", function observe(subject, data) { @@ -176,9 +172,7 @@ add_identity_test(this, async function test_meta_global_login_prolonged_server_m let server = EHTestsCommon.sync_httpd_setup(); await EHTestsCommon.setUp(server); - await configureIdentity({username: "broken.meta"}); - Service.serverURL = server.baseURI + "/maintenance/"; - Service.clusterURL = server.baseURI + "/maintenance/"; + await configureIdentity({username: "broken.meta"}, server); let backoffInterval; Svc.Obs.add("weave:service:backoff:interval", function observe(subject, data) { @@ -210,9 +204,7 @@ add_identity_test(this, async function test_download_crypto_keys_login_prolonged let server = EHTestsCommon.sync_httpd_setup(); await EHTestsCommon.setUp(server); - await configureIdentity({username: "broken.keys"}); - Service.serverURL = server.baseURI + "/maintenance/"; - Service.clusterURL = server.baseURI + "/maintenance/"; + await configureIdentity({username: "broken.keys"}, server); // Force re-download of keys Service.collectionKeys.clear(); @@ -245,9 +237,7 @@ add_identity_test(this, async function test_upload_crypto_keys_login_prolonged_s let server = EHTestsCommon.sync_httpd_setup(); // Start off with an empty account, do not upload a key. - await configureIdentity({username: "broken.keys"}); - Service.serverURL = server.baseURI + "/maintenance/"; - Service.clusterURL = server.baseURI + "/maintenance/"; + await configureIdentity({username: "broken.keys"}, server); let backoffInterval; Svc.Obs.add("weave:service:backoff:interval", function observe(subject, data) { @@ -280,9 +270,7 @@ add_identity_test(this, async function test_wipeServer_login_prolonged_server_ma let server = EHTestsCommon.sync_httpd_setup(); // Start off with an empty account, do not upload a key. - await configureIdentity({username: "broken.wipe"}); - Service.serverURL = server.baseURI + "/maintenance/"; - Service.clusterURL = server.baseURI + "/maintenance/"; + await configureIdentity({username: "broken.wipe"}, server); let backoffInterval; Svc.Obs.add("weave:service:backoff:interval", function observe(subject, data) { @@ -315,9 +303,7 @@ add_identity_test(this, async function test_wipeRemote_prolonged_server_maintena let server = EHTestsCommon.sync_httpd_setup(); server.registerPathHandler("/1.1/broken.wipe/storage/catapult", EHTestsCommon.service_unavailable); - await configureIdentity({username: "broken.wipe"}); - Service.serverURL = server.baseURI + "/maintenance/"; - Service.clusterURL = server.baseURI + "/maintenance/"; + await configureIdentity({username: "broken.wipe"}, server); EHTestsCommon.generateAndUploadKeys(); let engine = engineManager.get("catapult"); @@ -385,9 +371,7 @@ add_identity_test(this, async function test_info_collections_login_syncAndReport let server = EHTestsCommon.sync_httpd_setup(); await EHTestsCommon.setUp(server); - await configureIdentity({username: "broken.info"}); - Service.serverURL = server.baseURI + "/maintenance/"; - Service.clusterURL = server.baseURI + "/maintenance/"; + await configureIdentity({username: "broken.info"}, server); let backoffInterval; Svc.Obs.add("weave:service:backoff:interval", function observe(subject, data) { @@ -420,9 +404,7 @@ add_identity_test(this, async function test_meta_global_login_syncAndReportError let server = EHTestsCommon.sync_httpd_setup(); await EHTestsCommon.setUp(server); - await configureIdentity({username: "broken.meta"}); - Service.serverURL = server.baseURI + "/maintenance/"; - Service.clusterURL = server.baseURI + "/maintenance/"; + await configureIdentity({username: "broken.meta"}, server); let backoffInterval; Svc.Obs.add("weave:service:backoff:interval", function observe(subject, data) { @@ -455,9 +437,7 @@ add_identity_test(this, async function test_download_crypto_keys_login_syncAndRe let server = EHTestsCommon.sync_httpd_setup(); await EHTestsCommon.setUp(server); - await configureIdentity({username: "broken.keys"}); - Service.serverURL = server.baseURI + "/maintenance/"; - Service.clusterURL = server.baseURI + "/maintenance/"; + await configureIdentity({username: "broken.keys"}, server); // Force re-download of keys Service.collectionKeys.clear(); @@ -492,9 +472,7 @@ add_identity_test(this, async function test_upload_crypto_keys_login_syncAndRepo let server = EHTestsCommon.sync_httpd_setup(); // Start off with an empty account, do not upload a key. - await configureIdentity({username: "broken.keys"}); - Service.serverURL = server.baseURI + "/maintenance/"; - Service.clusterURL = server.baseURI + "/maintenance/"; + await configureIdentity({username: "broken.keys"}, server); let backoffInterval; Svc.Obs.add("weave:service:backoff:interval", function observe(subject, data) { @@ -527,9 +505,7 @@ add_identity_test(this, async function test_wipeServer_login_syncAndReportErrors let server = EHTestsCommon.sync_httpd_setup(); // Start off with an empty account, do not upload a key. - await configureIdentity({username: "broken.wipe"}); - Service.serverURL = server.baseURI + "/maintenance/"; - Service.clusterURL = server.baseURI + "/maintenance/"; + await configureIdentity({username: "broken.wipe"}, server); let backoffInterval; Svc.Obs.add("weave:service:backoff:interval", function observe(subject, data) { @@ -561,9 +537,7 @@ add_identity_test(this, async function test_wipeRemote_syncAndReportErrors_serve // wiping all remote devices. let server = EHTestsCommon.sync_httpd_setup(); - await configureIdentity({username: "broken.wipe"}); - Service.serverURL = server.baseURI + "/maintenance/"; - Service.clusterURL = server.baseURI + "/maintenance/"; + await configureIdentity({username: "broken.wipe"}, server); EHTestsCommon.generateAndUploadKeys(); let engine = engineManager.get("catapult"); @@ -633,9 +607,7 @@ add_identity_test(this, async function test_info_collections_login_syncAndReport let server = EHTestsCommon.sync_httpd_setup(); await EHTestsCommon.setUp(server); - await configureIdentity({username: "broken.info"}); - Service.serverURL = server.baseURI + "/maintenance/"; - Service.clusterURL = server.baseURI + "/maintenance/"; + await configureIdentity({username: "broken.info"}, server); let backoffInterval; Svc.Obs.add("weave:service:backoff:interval", function observe(subject, data) { @@ -670,9 +642,7 @@ add_identity_test(this, async function test_meta_global_login_syncAndReportError let server = EHTestsCommon.sync_httpd_setup(); await EHTestsCommon.setUp(server); - await configureIdentity({username: "broken.meta"}); - Service.serverURL = server.baseURI + "/maintenance/"; - Service.clusterURL = server.baseURI + "/maintenance/"; + await configureIdentity({username: "broken.meta"}, server); let backoffInterval; Svc.Obs.add("weave:service:backoff:interval", function observe(subject, data) { @@ -707,9 +677,7 @@ add_identity_test(this, async function test_download_crypto_keys_login_syncAndRe let server = EHTestsCommon.sync_httpd_setup(); await EHTestsCommon.setUp(server); - await configureIdentity({username: "broken.keys"}); - Service.serverURL = server.baseURI + "/maintenance/"; - Service.clusterURL = server.baseURI + "/maintenance/"; + await configureIdentity({username: "broken.keys"}, server); // Force re-download of keys Service.collectionKeys.clear(); @@ -746,9 +714,7 @@ add_identity_test(this, async function test_upload_crypto_keys_login_syncAndRepo let server = EHTestsCommon.sync_httpd_setup(); // Start off with an empty account, do not upload a key. - await configureIdentity({username: "broken.keys"}); - Service.serverURL = server.baseURI + "/maintenance/"; - Service.clusterURL = server.baseURI + "/maintenance/"; + await configureIdentity({username: "broken.keys"}, server); let backoffInterval; Svc.Obs.add("weave:service:backoff:interval", function observe(subject, data) { @@ -783,9 +749,7 @@ add_identity_test(this, async function test_wipeServer_login_syncAndReportErrors let server = EHTestsCommon.sync_httpd_setup(); // Start off with an empty account, do not upload a key. - await configureIdentity({username: "broken.wipe"}); - Service.serverURL = server.baseURI + "/maintenance/"; - Service.clusterURL = server.baseURI + "/maintenance/"; + await configureIdentity({username: "broken.wipe"}, server); let backoffInterval; Svc.Obs.add("weave:service:backoff:interval", function observe(subject, data) { diff --git a/services/sync/tests/unit/test_errorhandler_eol.js b/services/sync/tests/unit/test_errorhandler_eol.js index e786891beec0..ea35d6f55b37 100644 --- a/services/sync/tests/unit/test_errorhandler_eol.js +++ b/services/sync/tests/unit/test_errorhandler_eol.js @@ -44,9 +44,7 @@ function sync_httpd_setup(infoHandler) { } async function setUp(server) { - await configureIdentity({username: "johndoe"}); - Service.serverURL = server.baseURI + "/"; - Service.clusterURL = server.baseURI + "/"; + await configureIdentity({username: "johndoe"}, server); new FakeCryptoService(); } diff --git a/services/sync/tests/unit/test_errorhandler_sync_checkServerError.js b/services/sync/tests/unit/test_errorhandler_sync_checkServerError.js index f85920dec950..d10728b061b5 100644 --- a/services/sync/tests/unit/test_errorhandler_sync_checkServerError.js +++ b/services/sync/tests/unit/test_errorhandler_sync_checkServerError.js @@ -54,9 +54,7 @@ function sync_httpd_setup() { } async function setUp(server) { - await configureIdentity({username: "johndoe"}); - Service.serverURL = server.baseURI + "/"; - Service.clusterURL = server.baseURI + "/"; + await configureIdentity({username: "johndoe"}, server); new FakeCryptoService(); } diff --git a/services/sync/tests/unit/test_history_engine.js b/services/sync/tests/unit/test_history_engine.js index fd5067ce9521..4c043a28116f 100644 --- a/services/sync/tests/unit/test_history_engine.js +++ b/services/sync/tests/unit/test_history_engine.js @@ -16,7 +16,7 @@ add_test(function test_setup() { PlacesTestUtils.clearHistory().then(run_next_test); }); -add_test(function test_processIncoming_mobile_history_batched() { +add_task(async function test_processIncoming_mobile_history_batched() { _("SyncEngine._processIncoming works on history engine."); let FAKE_DOWNLOAD_LIMIT = 100; @@ -37,7 +37,7 @@ add_test(function test_processIncoming_mobile_history_batched() { "/1.1/foo/storage/history": collection.handler() }); - new SyncTestingInfrastructure(server); + await SyncTestingInfrastructure(server); // Let's create some 234 server side history records. They're all at least // 10 minutes old. @@ -132,11 +132,10 @@ add_test(function test_processIncoming_mobile_history_batched() { } } finally { - PlacesTestUtils.clearHistory().then(() => { - server.stop(do_test_finished); - Svc.Prefs.resetBranch(""); - Service.recordManager.clearCache(); - }); + await PlacesTestUtils.clearHistory(); + await promiseStopServer(server); + Svc.Prefs.resetBranch(""); + Service.recordManager.clearCache(); } }); diff --git a/services/sync/tests/unit/test_interval_triggers.js b/services/sync/tests/unit/test_interval_triggers.js index 89e67269889b..1bd4e7f5b28d 100644 --- a/services/sync/tests/unit/test_interval_triggers.js +++ b/services/sync/tests/unit/test_interval_triggers.js @@ -41,9 +41,7 @@ function sync_httpd_setup() { } async function setUp(server) { - await configureIdentity({username: "johndoe"}); - Service.serverURL = server.baseURI + "/"; - Service.clusterURL = server.baseURI + "/"; + await configureIdentity({username: "johndoe"}, server); generateNewKeys(Service.collectionKeys); let serverKeys = Service.collectionKeys.asWBO("crypto", "keys"); serverKeys.encrypt(Service.identity.syncKeyBundle); diff --git a/services/sync/tests/unit/test_score_triggers.js b/services/sync/tests/unit/test_score_triggers.js index 513be685a815..8d1eb99afa78 100644 --- a/services/sync/tests/unit/test_score_triggers.js +++ b/services/sync/tests/unit/test_score_triggers.js @@ -43,8 +43,8 @@ function sync_httpd_setup() { return httpd_setup(handlers); } -function setUp(server) { - new SyncTestingInfrastructure(server, "johndoe", "ilovejane", "sekrit"); +async function setUp(server) { + await SyncTestingInfrastructure(server, "johndoe", "ilovejane"); } function run_test() { @@ -78,24 +78,23 @@ add_test(function test_tracker_score_updated() { } }); -add_test(function test_sync_triggered() { +add_task(async function test_sync_triggered() { let server = sync_httpd_setup(); - setUp(server); + await setUp(server); Service.login(); Service.scheduler.syncThreshold = MULTI_DEVICE_THRESHOLD; - Svc.Obs.add("weave:service:sync:finish", function onSyncFinish() { - Svc.Obs.remove("weave:service:sync:finish", onSyncFinish); - _("Sync completed!"); - server.stop(run_next_test); - }); + do_check_eq(Status.login, LOGIN_SUCCEEDED); tracker.score += SCORE_INCREMENT_XLARGE; + + await promiseOneObserver("weave:service:sync:finish") + await promiseStopServer(server); }); -add_test(function test_clients_engine_sync_triggered() { +add_task(async function test_clients_engine_sync_triggered() { _("Ensure that client engine score changes trigger a sync."); // The clients engine is not registered like other engines. Therefore, @@ -103,25 +102,22 @@ add_test(function test_clients_engine_sync_triggered() { // global score tracker gives it that treatment. See bug 676042 for more. let server = sync_httpd_setup(); - setUp(server); + await setUp(server); Service.login(); - const TOPIC = "weave:service:sync:finish"; - Svc.Obs.add(TOPIC, function onSyncFinish() { - Svc.Obs.remove(TOPIC, onSyncFinish); - _("Sync due to clients engine change completed."); - server.stop(run_next_test); - }); - Service.scheduler.syncThreshold = MULTI_DEVICE_THRESHOLD; do_check_eq(Status.login, LOGIN_SUCCEEDED); Service.clientsEngine._tracker.score += SCORE_INCREMENT_XLARGE; + + await promiseOneObserver("weave:service:sync:finish"); + _("Sync due to clients engine change completed."); + await promiseStopServer(server); }); -add_test(function test_incorrect_credentials_sync_not_triggered() { +add_task(async function test_incorrect_credentials_sync_not_triggered() { _("Ensure that score changes don't trigger a sync if Status.login != LOGIN_SUCCEEDED."); let server = sync_httpd_setup(); - setUp(server); + await setUp(server); // Ensure we don't actually try to sync. function onSyncStart() { @@ -129,21 +125,20 @@ add_test(function test_incorrect_credentials_sync_not_triggered() { } Svc.Obs.add("weave:service:sync:start", onSyncStart); - // First wait >100ms (nsITimers can take up to that much time to fire, so - // we can account for the timer in delayedAutoconnect) and then one event - // loop tick (to account for a possible call to weave:service:sync:start). - Utils.namedTimer(function() { - Utils.nextTick(function() { - Svc.Obs.remove("weave:service:sync:start", onSyncStart); - - do_check_eq(Status.login, LOGIN_FAILED_LOGIN_REJECTED); - - Service.startOver(); - server.stop(run_next_test); - }); - }, 150, {}, "timer"); - // Faking incorrect credentials to prevent score update. Status.login = LOGIN_FAILED_LOGIN_REJECTED; tracker.score += SCORE_INCREMENT_XLARGE; + + // First wait >100ms (nsITimers can take up to that much time to fire, so + // we can account for the timer in delayedAutoconnect) and then one event + // loop tick (to account for a possible call to weave:service:sync:start). + await promiseNamedTimer(150, {}, "timer"); + await promiseNextTick(); + + Svc.Obs.remove("weave:service:sync:start", onSyncStart); + + do_check_eq(Status.login, LOGIN_FAILED_LOGIN_REJECTED); + + Service.startOver(); + await promiseStopServer(server); }); diff --git a/services/sync/tests/unit/test_service_sync_401.js b/services/sync/tests/unit/test_service_sync_401.js index 9e9db813743c..b8547129dee8 100644 --- a/services/sync/tests/unit/test_service_sync_401.js +++ b/services/sync/tests/unit/test_service_sync_401.js @@ -9,7 +9,8 @@ Cu.import("resource://testing-common/services/sync/utils.js"); function login_handling(handler) { return function (request, response) { - if (basic_auth_matches(request, "johndoe", "ilovejane")) { + if (request.hasHeader("Authorization") && + request.getHeader("Authorization").includes('Hawk id="id"')) { handler(request, response); } else { let body = "Unauthorized"; @@ -19,7 +20,7 @@ function login_handling(handler) { }; } -function run_test() { +add_task(async function run_test() { let logger = Log.repository.rootLogger; Log.repository.rootLogger.addAppender(new Log.DumpAppender()); @@ -27,7 +28,6 @@ function run_test() { let upd = collectionsHelper.with_updated_collection; let collections = collectionsHelper.collections; - do_test_pending(); let server = httpd_setup({ "/1.1/johndoe/storage/crypto/keys": upd("crypto", new ServerWBO("keys").handler()), "/1.1/johndoe/storage/meta/global": upd("meta", new ServerWBO("global").handler()), @@ -38,7 +38,7 @@ function run_test() { try { _("Set up test fixtures."); - new SyncTestingInfrastructure(server, "johndoe", "ilovejane", "foo"); + await SyncTestingInfrastructure(server, "johndoe", "ilovejane"); Service.scheduler.globalScore = GLOBAL_SCORE; // Avoid daily ping Svc.Prefs.set("lastPing", Math.floor(Date.now() / 1000)); @@ -54,7 +54,8 @@ function run_test() { do_check_eq(Service.status.login, LOGIN_SUCCEEDED); _("Simulate having changed the password somewhere else."); - Service.identity.basicPassword = "ilovejosephine"; + Service.identity._token.id = "somethingelse"; + Service.identity.unlockAndVerifyAuthState = () => Promise.resolve(LOGIN_FAILED_LOGIN_REJECTED); _("Let's try to sync."); Service.sync(); @@ -79,6 +80,6 @@ function run_test() { } finally { Svc.Prefs.resetBranch(""); - server.stop(do_test_finished); + await promiseStopServer(server); } -} +}); diff --git a/services/sync/tests/unit/test_service_sync_specified.js b/services/sync/tests/unit/test_service_sync_specified.js index 7cb0f9d9c68a..2f6085219c8b 100644 --- a/services/sync/tests/unit/test_service_sync_specified.js +++ b/services/sync/tests/unit/test_service_sync_specified.js @@ -57,7 +57,7 @@ function sync_httpd_setup(handlers) { return httpd_setup(handlers); } -function setUp() { +async function setUp() { syncedEngines = []; let engine = Service.engineManager.get("steam"); engine.enabled = true; @@ -70,8 +70,7 @@ function setUp() { let server = sync_httpd_setup({ "/1.1/johndoe/storage/meta/global": new ServerWBO("global", {}).handler(), }); - new SyncTestingInfrastructure(server, "johndoe", "ilovejane", - "abcdeabcdeabcdeabcdeabcdea"); + await SyncTestingInfrastructure(server, "johndoe", "ilovejane"); return server; } @@ -84,9 +83,9 @@ function run_test() { run_next_test(); } -add_test(function test_noEngines() { +add_task(async function test_noEngines() { _("Test: An empty array of engines to sync does nothing."); - let server = setUp(); + let server = await setUp(); try { _("Sync with no engines specified."); @@ -95,13 +94,13 @@ add_test(function test_noEngines() { } finally { Service.startOver(); - server.stop(run_next_test); + await promiseStopServer(server); } }); -add_test(function test_oneEngine() { +add_task(async function test_oneEngine() { _("Test: Only one engine is synced."); - let server = setUp(); + let server = await setUp(); try { @@ -111,13 +110,13 @@ add_test(function test_oneEngine() { } finally { Service.startOver(); - server.stop(run_next_test); + await promiseStopServer(server); } }); -add_test(function test_bothEnginesSpecified() { +add_task(async function test_bothEnginesSpecified() { _("Test: All engines are synced when specified in the correct order (1)."); - let server = setUp(); + let server = await setUp(); try { _("Sync with both engines specified."); @@ -126,13 +125,13 @@ add_test(function test_bothEnginesSpecified() { } finally { Service.startOver(); - server.stop(run_next_test); + await promiseStopServer(server); } }); -add_test(function test_bothEnginesSpecified() { +add_task(async function test_bothEnginesSpecified() { _("Test: All engines are synced when specified in the correct order (2)."); - let server = setUp(); + let server = await setUp(); try { _("Sync with both engines specified."); @@ -141,13 +140,13 @@ add_test(function test_bothEnginesSpecified() { } finally { Service.startOver(); - server.stop(run_next_test); + await promiseStopServer(server); } }); -add_test(function test_bothEnginesDefault() { +add_task(async function test_bothEnginesDefault() { _("Test: All engines are synced when nothing is specified."); - let server = setUp(); + let server = await setUp(); try { Service.sync(); @@ -155,6 +154,6 @@ add_test(function test_bothEnginesDefault() { } finally { Service.startOver(); - server.stop(run_next_test); + await promiseStopServer(server); } }); diff --git a/services/sync/tests/unit/test_service_sync_updateEnabledEngines.js b/services/sync/tests/unit/test_service_sync_updateEnabledEngines.js index ee1800fd3f98..bf90296e5c35 100644 --- a/services/sync/tests/unit/test_service_sync_updateEnabledEngines.js +++ b/services/sync/tests/unit/test_service_sync_updateEnabledEngines.js @@ -68,9 +68,8 @@ function sync_httpd_setup(handlers) { return httpd_setup(handlers); } -function setUp(server) { - new SyncTestingInfrastructure(server, "johndoe", "ilovejane", - "abcdeabcdeabcdeabcdeabcdea"); +async function setUp(server) { + await SyncTestingInfrastructure(server, "johndoe", "ilovejane"); // Ensure that the server has valid keys so that logging in will work and not // result in a server wipe, rendering many of these tests useless. generateNewKeys(Service.collectionKeys); @@ -91,14 +90,14 @@ function run_test() { run_next_test(); } -add_test(function test_newAccount() { +add_task(async function test_newAccount() { _("Test: New account does not disable locally enabled engines."); let engine = Service.engineManager.get("steam"); let server = sync_httpd_setup({ "/1.1/johndoe/storage/meta/global": new ServerWBO("global", {}).handler(), "/1.1/johndoe/storage/steam": new ServerWBO("steam", {}).handler() }); - setUp(server); + await setUp(server); try { _("Engine is enabled from the beginning."); @@ -113,11 +112,11 @@ add_test(function test_newAccount() { do_check_true(engine.enabled); } finally { Service.startOver(); - server.stop(run_next_test); + await promiseStopServer(server); } }); -add_test(function test_enabledLocally() { +add_task(async function test_enabledLocally() { _("Test: Engine is disabled on remote clients and enabled locally"); Service.syncID = "abcdefghij"; let engine = Service.engineManager.get("steam"); @@ -128,7 +127,7 @@ add_test(function test_enabledLocally() { "/1.1/johndoe/storage/meta/global": metaWBO.handler(), "/1.1/johndoe/storage/steam": new ServerWBO("steam", {}).handler() }); - setUp(server); + await setUp(server); try { _("Enable engine locally."); @@ -144,11 +143,11 @@ add_test(function test_enabledLocally() { do_check_true(engine.enabled); } finally { Service.startOver(); - server.stop(run_next_test); + await promiseStopServer(server); } }); -add_test(function test_disabledLocally() { +add_task(async function test_disabledLocally() { _("Test: Engine is enabled on remote clients and disabled locally"); Service.syncID = "abcdefghij"; let engine = Service.engineManager.get("steam"); @@ -164,7 +163,7 @@ add_test(function test_disabledLocally() { "/1.1/johndoe/storage/meta/global": metaWBO.handler(), "/1.1/johndoe/storage/steam": steamCollection.handler() }); - setUp(server); + await setUp(server); try { _("Disable engine locally."); @@ -186,11 +185,11 @@ add_test(function test_disabledLocally() { do_check_false(engine.enabled); } finally { Service.startOver(); - server.stop(run_next_test); + await promiseStopServer(server); } }); -add_test(function test_disabledLocally_wipe503() { +add_task(async function test_disabledLocally_wipe503() { _("Test: Engine is enabled on remote clients and disabled locally"); Service.syncID = "abcdefghij"; let engine = Service.engineManager.get("steam"); @@ -213,7 +212,7 @@ add_test(function test_disabledLocally_wipe503() { "/1.1/johndoe/storage/meta/global": metaWBO.handler(), "/1.1/johndoe/storage/steam": service_unavailable }); - setUp(server); + await setUp(server); _("Disable engine locally."); Service._ignorePrefObserver = true; @@ -221,20 +220,18 @@ add_test(function test_disabledLocally_wipe503() { Service._ignorePrefObserver = false; engine.enabled = false; - Svc.Obs.add("weave:ui:sync:error", function onSyncError() { - Svc.Obs.remove("weave:ui:sync:error", onSyncError); - - do_check_eq(Service.status.sync, SERVER_MAINTENANCE); - - Service.startOver(); - server.stop(run_next_test); - }); + let promiseObserved = promiseOneObserver("weave:ui:sync:error"); _("Sync."); Service.errorHandler.syncAndReportErrors(); + await promiseObserved; + do_check_eq(Service.status.sync, SERVER_MAINTENANCE); + + Service.startOver(); + await promiseStopServer(server); }); -add_test(function test_enabledRemotely() { +add_task(async function test_enabledRemotely() { _("Test: Engine is disabled locally and enabled on a remote client"); Service.syncID = "abcdefghij"; let engine = Service.engineManager.get("steam"); @@ -251,7 +248,7 @@ add_test(function test_enabledRemotely() { "/1.1/johndoe/storage/steam": upd("steam", new ServerWBO("steam", {}).handler()) }); - setUp(server); + await setUp(server); // We need to be very careful how we do this, so that we don't trigger a // fresh start! @@ -274,11 +271,11 @@ add_test(function test_enabledRemotely() { do_check_eq(metaWBO.data.engines.steam.syncID, engine.syncID); } finally { Service.startOver(); - server.stop(run_next_test); + await promiseStopServer(server); } }); -add_test(function test_disabledRemotelyTwoClients() { +add_task(async function test_disabledRemotelyTwoClients() { _("Test: Engine is enabled locally and disabled on a remote client... with two clients."); Service.syncID = "abcdefghij"; let engine = Service.engineManager.get("steam"); @@ -292,7 +289,7 @@ add_test(function test_disabledRemotelyTwoClients() { "/1.1/johndoe/storage/steam": upd("steam", new ServerWBO("steam", {}).handler()) }); - setUp(server); + await setUp(server); try { _("Enable engine locally."); @@ -318,11 +315,11 @@ add_test(function test_disabledRemotelyTwoClients() { } finally { Service.startOver(); - server.stop(run_next_test); + await promiseStopServer(server); } }); -add_test(function test_disabledRemotely() { +add_task(async function test_disabledRemotely() { _("Test: Engine is enabled locally and disabled on a remote client"); Service.syncID = "abcdefghij"; let engine = Service.engineManager.get("steam"); @@ -333,7 +330,7 @@ add_test(function test_disabledRemotely() { "/1.1/johndoe/storage/meta/global": metaWBO.handler(), "/1.1/johndoe/storage/steam": new ServerWBO("steam", {}).handler() }); - setUp(server); + await setUp(server); try { _("Enable engine locally."); @@ -349,11 +346,11 @@ add_test(function test_disabledRemotely() { } finally { Service.startOver(); - server.stop(run_next_test); + await promiseStopServer(server); } }); -add_test(function test_dependentEnginesEnabledLocally() { +add_task(async function test_dependentEnginesEnabledLocally() { _("Test: Engine is disabled on remote clients and enabled locally"); Service.syncID = "abcdefghij"; let steamEngine = Service.engineManager.get("steam"); @@ -366,7 +363,7 @@ add_test(function test_dependentEnginesEnabledLocally() { "/1.1/johndoe/storage/steam": new ServerWBO("steam", {}).handler(), "/1.1/johndoe/storage/stirling": new ServerWBO("stirling", {}).handler() }); - setUp(server); + await setUp(server); try { _("Enable engine locally. Doing it on one is enough."); @@ -384,11 +381,11 @@ add_test(function test_dependentEnginesEnabledLocally() { do_check_true(stirlingEngine.enabled); } finally { Service.startOver(); - server.stop(run_next_test); + await promiseStopServer(server); } }); -add_test(function test_dependentEnginesDisabledLocally() { +add_task(async function test_dependentEnginesDisabledLocally() { _("Test: Two dependent engines are enabled on remote clients and disabled locally"); Service.syncID = "abcdefghij"; let steamEngine = Service.engineManager.get("steam"); @@ -410,7 +407,7 @@ add_test(function test_dependentEnginesDisabledLocally() { "/1.1/johndoe/storage/steam": steamCollection.handler(), "/1.1/johndoe/storage/stirling": stirlingCollection.handler() }); - setUp(server); + await setUp(server); try { _("Disable engines locally. Doing it on one is enough."); @@ -437,6 +434,6 @@ add_test(function test_dependentEnginesDisabledLocally() { do_check_false(stirlingEngine.enabled); } finally { Service.startOver(); - server.stop(run_next_test); + await promiseStopServer(server); } }); diff --git a/services/sync/tests/unit/test_service_wipeServer.js b/services/sync/tests/unit/test_service_wipeServer.js index 059a0c887260..b616cfcdce65 100644 --- a/services/sync/tests/unit/test_service_wipeServer.js +++ b/services/sync/tests/unit/test_service_wipeServer.js @@ -60,7 +60,7 @@ add_identity_test(this, async function test_wipeServer_list_success() { try { await setUpTestFixtures(server); - new SyncTestingInfrastructure(server, "johndoe", "irrelevant", "irrelevant"); + await SyncTestingInfrastructure(server, "johndoe", "irrelevant"); _("Confirm initial environment."); do_check_false(steam_coll.deleted); @@ -94,7 +94,7 @@ add_identity_test(this, async function test_wipeServer_list_503() { try { await setUpTestFixtures(server); - new SyncTestingInfrastructure(server, "johndoe", "irrelevant", "irrelevant"); + await SyncTestingInfrastructure(server, "johndoe", "irrelevant"); _("Confirm initial environment."); do_check_false(steam_coll.deleted); @@ -142,7 +142,7 @@ add_identity_test(this, async function test_wipeServer_all_success() { await setUpTestFixtures(server); _("Try deletion."); - new SyncTestingInfrastructure(server, "johndoe", "irrelevant", "irrelevant"); + await SyncTestingInfrastructure(server, "johndoe", "irrelevant"); let returnedTimestamp = Service.wipeServer(); do_check_true(deleted); do_check_eq(returnedTimestamp, serverTimestamp); @@ -174,7 +174,7 @@ add_identity_test(this, async function test_wipeServer_all_404() { await setUpTestFixtures(server); _("Try deletion."); - new SyncTestingInfrastructure(server, "johndoe", "irrelevant", "irrelevant"); + await SyncTestingInfrastructure(server, "johndoe", "irrelevant"); let returnedTimestamp = Service.wipeServer(); do_check_true(deleted); do_check_eq(returnedTimestamp, serverTimestamp); @@ -203,7 +203,7 @@ add_identity_test(this, async function test_wipeServer_all_503() { _("Try deletion."); let error; try { - new SyncTestingInfrastructure(server, "johndoe", "irrelevant", "irrelevant"); + await SyncTestingInfrastructure(server, "johndoe", "irrelevant"); Service.wipeServer(); do_throw("Should have thrown!"); } catch (ex) { diff --git a/services/sync/tests/unit/test_syncengine.js b/services/sync/tests/unit/test_syncengine.js index 8c01ca04890c..c125b04de21a 100644 --- a/services/sync/tests/unit/test_syncengine.js +++ b/services/sync/tests/unit/test_syncengine.js @@ -10,12 +10,13 @@ function makeSteamEngine() { return new SyncEngine('Steam', Service); } -var server; +var server = httpd_setup({}); -function test_url_attributes() { + +add_task(async function test_url_attributes() { _("SyncEngine url attributes"); - let syncTesting = new SyncTestingInfrastructure(server); - Service.clusterURL = "https://cluster/"; + let syncTesting = await SyncTestingInfrastructure(server); + Service.clusterURL = "https://cluster/1.1/foo/"; let engine = makeSteamEngine(); try { do_check_eq(engine.storageURL, "https://cluster/1.1/foo/storage/"); @@ -24,11 +25,11 @@ function test_url_attributes() { } finally { Svc.Prefs.resetBranch(""); } -} +}); -function test_syncID() { +add_task(async function test_syncID() { _("SyncEngine.syncID corresponds to preference"); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); let engine = makeSteamEngine(); try { // Ensure pristine environment @@ -44,11 +45,11 @@ function test_syncID() { } finally { Svc.Prefs.resetBranch(""); } -} +}) -function test_lastSync() { +add_task(async function test_lastSync() { _("SyncEngine.lastSync and SyncEngine.lastSyncLocal correspond to preferences"); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); let engine = makeSteamEngine(); try { // Ensure pristine environment @@ -74,11 +75,11 @@ function test_lastSync() { } finally { Svc.Prefs.resetBranch(""); } -} +}) -function test_toFetch() { +add_task(async function test_toFetch() { _("SyncEngine.toFetch corresponds to file on disk"); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); const filename = "weave/toFetch/steam.json"; let engine = makeSteamEngine(); try { @@ -104,11 +105,11 @@ function test_toFetch() { } finally { Svc.Prefs.resetBranch(""); } -} +}); -function test_previousFailed() { +add_task(async function test_previousFailed() { _("SyncEngine.previousFailed corresponds to file on disk"); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); const filename = "weave/failed/steam.json"; let engine = makeSteamEngine(); try { @@ -134,11 +135,11 @@ function test_previousFailed() { } finally { Svc.Prefs.resetBranch(""); } -} +}); -function test_resetClient() { +add_task(async function test_resetClient() { _("SyncEngine.resetClient resets lastSync and toFetch"); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); let engine = makeSteamEngine(); try { // Ensure pristine environment @@ -159,9 +160,9 @@ function test_resetClient() { } finally { Svc.Prefs.resetBranch(""); } -} +}); -function test_wipeServer() { +add_task(async function test_wipeServer() { _("SyncEngine.wipeServer deletes server data and resets the client."); let engine = makeSteamEngine(); @@ -170,7 +171,7 @@ function test_wipeServer() { let server = httpd_setup({ "/1.1/foo/storage/steam": steamCollection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); do_test_pending(); try { @@ -188,17 +189,8 @@ function test_wipeServer() { server.stop(do_test_finished); Svc.Prefs.resetBranch(""); } -} +}); -function run_test() { - server = httpd_setup({}); - test_url_attributes(); - test_syncID(); - test_lastSync(); - test_toFetch(); - test_previousFailed(); - test_resetClient(); - test_wipeServer(); - - server.stop(run_next_test); -} +add_task(async function finish() { + await promiseStopServer(server); +}); diff --git a/services/sync/tests/unit/test_syncengine_sync.js b/services/sync/tests/unit/test_syncengine_sync.js index bcc3f2f4aeb1..a5b2f754760c 100644 --- a/services/sync/tests/unit/test_syncengine_sync.js +++ b/services/sync/tests/unit/test_syncengine_sync.js @@ -21,9 +21,9 @@ function clean() { Service.recordManager.clearCache(); } -function cleanAndGo(server) { +async function cleanAndGo(server) { clean(); - server.stop(run_next_test); + await promiseStopServer(server); } async function promiseClean(server) { @@ -38,7 +38,7 @@ function configureService(server, username, password) { Service.identity.basicPassword = password || "password"; } -function createServerAndConfigureClient() { +async function createServerAndConfigureClient() { let engine = new RotaryEngine(Service); let contents = { @@ -54,9 +54,7 @@ function createServerAndConfigureClient() { server.createContents(USER, contents); server.start(); - Service.serverURL = server.baseURI; - Service.clusterURL = server.baseURI; - Service.identity.username = USER; + await SyncTestingInfrastructure(server, USER); Service._updateCachedURLs(); return [engine, server, USER]; @@ -82,7 +80,7 @@ function run_test() { * different scenarios below. */ -add_test(function test_syncStartup_emptyOrOutdatedGlobalsResetsSync() { +add_task(async function test_syncStartup_emptyOrOutdatedGlobalsResetsSync() { _("SyncEngine._syncStartup resets sync and wipes server data if there's no or an outdated global record"); // Some server side data that's going to be wiped @@ -98,7 +96,7 @@ add_test(function test_syncStartup_emptyOrOutdatedGlobalsResetsSync() { "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); Service.identity.username = "foo"; let engine = makeRotaryEngine(); @@ -130,11 +128,11 @@ add_test(function test_syncStartup_emptyOrOutdatedGlobalsResetsSync() { do_check_eq(collection.payload("scotsman"), undefined); } finally { - cleanAndGo(server); + await cleanAndGo(server); } }); -add_test(function test_syncStartup_serverHasNewerVersion() { +add_task(async function test_syncStartup_serverHasNewerVersion() { _("SyncEngine._syncStartup "); let global = new ServerWBO('global', {engines: {rotary: {version: 23456}}}); @@ -142,7 +140,7 @@ add_test(function test_syncStartup_serverHasNewerVersion() { "/1.1/foo/storage/meta/global": global.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); Service.identity.username = "foo"; let engine = makeRotaryEngine(); @@ -159,16 +157,16 @@ add_test(function test_syncStartup_serverHasNewerVersion() { do_check_eq(error.failureCode, VERSION_OUT_OF_DATE); } finally { - cleanAndGo(server); + await cleanAndGo(server); } }); -add_test(function test_syncStartup_syncIDMismatchResetsClient() { +add_task(async function test_syncStartup_syncIDMismatchResetsClient() { _("SyncEngine._syncStartup resets sync if syncIDs don't match"); let server = sync_httpd_setup({}); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); Service.identity.username = "foo"; // global record with a different syncID than our engine has @@ -195,12 +193,12 @@ add_test(function test_syncStartup_syncIDMismatchResetsClient() { do_check_eq(engine.lastSync, 0); } finally { - cleanAndGo(server); + await cleanAndGo(server); } }); -add_test(function test_processIncoming_emptyServer() { +add_task(async function test_processIncoming_emptyServer() { _("SyncEngine._processIncoming working with an empty server backend"); let collection = new ServerCollection(); @@ -208,7 +206,7 @@ add_test(function test_processIncoming_emptyServer() { "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); Service.identity.username = "foo"; let engine = makeRotaryEngine(); @@ -219,12 +217,12 @@ add_test(function test_processIncoming_emptyServer() { do_check_eq(engine.lastSync, 0); } finally { - cleanAndGo(server); + await cleanAndGo(server); } }); -add_test(function test_processIncoming_createFromServer() { +add_task(async function test_processIncoming_createFromServer() { _("SyncEngine._processIncoming creates new records from server data"); // Some server records that will be downloaded @@ -247,7 +245,7 @@ add_test(function test_processIncoming_createFromServer() { "/1.1/foo/storage/rotary/scotsman": collection.wbo("scotsman").handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); Service.identity.username = "foo"; generateNewKeys(Service.collectionKeys); @@ -280,12 +278,12 @@ add_test(function test_processIncoming_createFromServer() { do_check_eq(engine._store.items['../pathological'], "Pathological Case"); } finally { - cleanAndGo(server); + await cleanAndGo(server); } }); -add_test(function test_processIncoming_reconcile() { +add_task(async function test_processIncoming_reconcile() { _("SyncEngine._processIncoming updates local records"); let collection = new ServerCollection(); @@ -332,7 +330,7 @@ add_test(function test_processIncoming_reconcile() { "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); Service.identity.username = "foo"; let engine = makeRotaryEngine(); @@ -391,16 +389,16 @@ add_test(function test_processIncoming_reconcile() { // The 'nukeme' record marked as deleted is removed. do_check_eq(engine._store.items.nukeme, undefined); } finally { - cleanAndGo(server); + await cleanAndGo(server); } }); -add_test(function test_processIncoming_reconcile_local_deleted() { +add_task(async function test_processIncoming_reconcile_local_deleted() { _("Ensure local, duplicate ID is deleted on server."); // When a duplicate is resolved, the local ID (which is never taken) should // be deleted on the server. - let [engine, server, user] = createServerAndConfigureClient(); + let [engine, server, user] = await createServerAndConfigureClient(); let now = Date.now() / 1000 - 10; engine.lastSync = now; @@ -427,13 +425,13 @@ add_test(function test_processIncoming_reconcile_local_deleted() { do_check_eq(1, collection.count()); do_check_neq(undefined, collection.wbo("DUPE_INCOMING")); - cleanAndGo(server); + await cleanAndGo(server); }); -add_test(function test_processIncoming_reconcile_equivalent() { +add_task(async function test_processIncoming_reconcile_equivalent() { _("Ensure proper handling of incoming records that match local."); - let [engine, server, user] = createServerAndConfigureClient(); + let [engine, server, user] = await createServerAndConfigureClient(); let now = Date.now() / 1000 - 10; engine.lastSync = now; @@ -450,17 +448,17 @@ add_test(function test_processIncoming_reconcile_equivalent() { do_check_attribute_count(engine._store.items, 1); - cleanAndGo(server); + await cleanAndGo(server); }); -add_test(function test_processIncoming_reconcile_locally_deleted_dupe_new() { +add_task(async function test_processIncoming_reconcile_locally_deleted_dupe_new() { _("Ensure locally deleted duplicate record newer than incoming is handled."); // This is a somewhat complicated test. It ensures that if a client receives // a modified record for an item that is deleted locally but with a different // ID that the incoming record is ignored. This is a corner case for record // handling, but it needs to be supported. - let [engine, server, user] = createServerAndConfigureClient(); + let [engine, server, user] = await createServerAndConfigureClient(); let now = Date.now() / 1000 - 10; engine.lastSync = now; @@ -489,16 +487,16 @@ add_test(function test_processIncoming_reconcile_locally_deleted_dupe_new() { let payload = JSON.parse(JSON.parse(wbo.payload).ciphertext); do_check_true(payload.deleted); - cleanAndGo(server); + await cleanAndGo(server); }); -add_test(function test_processIncoming_reconcile_locally_deleted_dupe_old() { +add_task(async function test_processIncoming_reconcile_locally_deleted_dupe_old() { _("Ensure locally deleted duplicate record older than incoming is restored."); // This is similar to the above test except it tests the condition where the // incoming record is newer than the local deletion, therefore overriding it. - let [engine, server, user] = createServerAndConfigureClient(); + let [engine, server, user] = await createServerAndConfigureClient(); let now = Date.now() / 1000 - 10; engine.lastSync = now; @@ -528,13 +526,13 @@ add_test(function test_processIncoming_reconcile_locally_deleted_dupe_old() { let payload = JSON.parse(JSON.parse(wbo.payload).ciphertext); do_check_eq("incoming", payload.denomination); - cleanAndGo(server); + await cleanAndGo(server); }); -add_test(function test_processIncoming_reconcile_changed_dupe() { +add_task(async function test_processIncoming_reconcile_changed_dupe() { _("Ensure that locally changed duplicate record is handled properly."); - let [engine, server, user] = createServerAndConfigureClient(); + let [engine, server, user] = await createServerAndConfigureClient(); let now = Date.now() / 1000 - 10; engine.lastSync = now; @@ -565,15 +563,15 @@ add_test(function test_processIncoming_reconcile_changed_dupe() { let payload = JSON.parse(JSON.parse(wbo.payload).ciphertext); do_check_eq("local", payload.denomination); - cleanAndGo(server); + await cleanAndGo(server); }); -add_test(function test_processIncoming_reconcile_changed_dupe_new() { +add_task(async function test_processIncoming_reconcile_changed_dupe_new() { _("Ensure locally changed duplicate record older than incoming is ignored."); // This test is similar to the above except the incoming record is younger // than the local record. The incoming record should be authoritative. - let [engine, server, user] = createServerAndConfigureClient(); + let [engine, server, user] = await createServerAndConfigureClient(); let now = Date.now() / 1000 - 10; engine.lastSync = now; @@ -602,10 +600,10 @@ add_test(function test_processIncoming_reconcile_changed_dupe_new() { do_check_neq(undefined, wbo); let payload = JSON.parse(JSON.parse(wbo.payload).ciphertext); do_check_eq("incoming", payload.denomination); - cleanAndGo(server); + await cleanAndGo(server); }); -add_test(function test_processIncoming_mobile_batchSize() { +add_task(async function test_processIncoming_mobile_batchSize() { _("SyncEngine._processIncoming doesn't fetch everything at once on mobile clients"); Svc.Prefs.set("client.type", "mobile"); @@ -634,7 +632,7 @@ add_test(function test_processIncoming_mobile_batchSize() { "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); let engine = makeRotaryEngine(); let meta_global = Service.recordManager.set(engine.metaURL, @@ -671,7 +669,7 @@ add_test(function test_processIncoming_mobile_batchSize() { } } finally { - cleanAndGo(server); + await cleanAndGo(server); } }); @@ -709,7 +707,7 @@ add_task(async function test_processIncoming_store_toFetch() { "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); let meta_global = Service.recordManager.set(engine.metaURL, new WBORecord(engine.metaURL)); @@ -743,7 +741,7 @@ add_task(async function test_processIncoming_store_toFetch() { }); -add_test(function test_processIncoming_resume_toFetch() { +add_task(async function test_processIncoming_resume_toFetch() { _("toFetch and previousFailed items left over from previous syncs are fetched on the next sync, along with new items."); Service.identity.username = "foo"; @@ -782,7 +780,7 @@ add_test(function test_processIncoming_resume_toFetch() { "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); let meta_global = Service.recordManager.set(engine.metaURL, new WBORecord(engine.metaURL)); @@ -807,12 +805,12 @@ add_test(function test_processIncoming_resume_toFetch() { do_check_eq(engine._store.items.failed2, "Record No. 2"); do_check_eq(engine.previousFailed.length, 0); } finally { - cleanAndGo(server); + await cleanAndGo(server); } }); -add_test(function test_processIncoming_applyIncomingBatchSize_smaller() { +add_task(async function test_processIncoming_applyIncomingBatchSize_smaller() { _("Ensure that a number of incoming items less than applyIncomingBatchSize is still applied."); Service.identity.username = "foo"; @@ -840,7 +838,7 @@ add_test(function test_processIncoming_applyIncomingBatchSize_smaller() { "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); let meta_global = Service.recordManager.set(engine.metaURL, new WBORecord(engine.metaURL)); @@ -862,12 +860,12 @@ add_test(function test_processIncoming_applyIncomingBatchSize_smaller() { do_check_eq(engine.previousFailed[1], "record-no-8"); } finally { - cleanAndGo(server); + await cleanAndGo(server); } }); -add_test(function test_processIncoming_applyIncomingBatchSize_multiple() { +add_task(async function test_processIncoming_applyIncomingBatchSize_multiple() { _("Ensure that incoming items are applied according to applyIncomingBatchSize."); Service.identity.username = "foo"; @@ -896,7 +894,7 @@ add_test(function test_processIncoming_applyIncomingBatchSize_multiple() { "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); let meta_global = Service.recordManager.set(engine.metaURL, new WBORecord(engine.metaURL)); @@ -915,12 +913,12 @@ add_test(function test_processIncoming_applyIncomingBatchSize_multiple() { do_check_attribute_count(engine._store.items, APPLY_BATCH_SIZE * 3); } finally { - cleanAndGo(server); + await cleanAndGo(server); } }); -add_test(function test_processIncoming_notify_count() { +add_task(async function test_processIncoming_notify_count() { _("Ensure that failed records are reported only once."); Service.identity.username = "foo"; @@ -948,7 +946,7 @@ add_test(function test_processIncoming_notify_count() { "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); let meta_global = Service.recordManager.set(engine.metaURL, new WBORecord(engine.metaURL)); @@ -1004,12 +1002,12 @@ add_test(function test_processIncoming_notify_count() { Svc.Obs.remove("weave:engine:sync:applied", onApplied); } finally { - cleanAndGo(server); + await cleanAndGo(server); } }); -add_test(function test_processIncoming_previousFailed() { +add_task(async function test_processIncoming_previousFailed() { _("Ensure that failed records are retried."); Service.identity.username = "foo"; Svc.Prefs.set("client.type", "mobile"); @@ -1038,7 +1036,7 @@ add_test(function test_processIncoming_previousFailed() { "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); let meta_global = Service.recordManager.set(engine.metaURL, new WBORecord(engine.metaURL)); @@ -1090,12 +1088,12 @@ add_test(function test_processIncoming_previousFailed() { do_check_eq(engine._store.items['record-no-12'], "Record No. 12"); do_check_eq(engine._store.items['record-no-13'], "Record No. 13"); } finally { - cleanAndGo(server); + await cleanAndGo(server); } }); -add_test(function test_processIncoming_failed_records() { +add_task(async function test_processIncoming_failed_records() { _("Ensure that failed records from _reconcile and applyIncomingBatch are refetched."); Service.identity.username = "foo"; @@ -1154,7 +1152,7 @@ add_test(function test_processIncoming_failed_records() { "/1.1/foo/storage/rotary": recording_handler(collection) }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); let meta_global = Service.recordManager.set(engine.metaURL, new WBORecord(engine.metaURL)); @@ -1224,7 +1222,7 @@ add_test(function test_processIncoming_failed_records() { do_check_eq(batchDownload(BOGUS_RECORDS.length), 4); } finally { - cleanAndGo(server); + await cleanAndGo(server); } }); @@ -1267,7 +1265,7 @@ add_task(async function test_processIncoming_decrypt_failed() { "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); let meta_global = Service.recordManager.set(engine.metaURL, new WBORecord(engine.metaURL)); @@ -1310,7 +1308,7 @@ add_task(async function test_processIncoming_decrypt_failed() { }); -add_test(function test_uploadOutgoing_toEmptyServer() { +add_task(async function test_uploadOutgoing_toEmptyServer() { _("SyncEngine._uploadOutgoing uploads new records to server"); Service.identity.username = "foo"; @@ -1324,7 +1322,7 @@ add_test(function test_uploadOutgoing_toEmptyServer() { "/1.1/foo/storage/rotary/scotsman": collection.wbo("scotsman").handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); generateNewKeys(Service.collectionKeys); let engine = makeRotaryEngine(); @@ -1364,12 +1362,12 @@ add_test(function test_uploadOutgoing_toEmptyServer() { do_check_eq(collection.payload("flying"), undefined); } finally { - cleanAndGo(server); + await cleanAndGo(server); } }); -add_test(function test_uploadOutgoing_huge() { +add_task(async function test_uploadOutgoing_huge() { Service.identity.username = "foo"; let collection = new ServerCollection(); collection._wbos.flying = new ServerWBO('flying'); @@ -1380,7 +1378,7 @@ add_test(function test_uploadOutgoing_huge() { "/1.1/foo/storage/rotary/flying": collection.wbo("flying").handler(), }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); generateNewKeys(Service.collectionKeys); let engine = makeRotaryEngine(); @@ -1429,7 +1427,7 @@ add_task(async function test_uploadOutgoing_failed() { "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); let engine = makeRotaryEngine(); engine.lastSync = 123; // needs to be non-zero so that tracker is queried @@ -1482,7 +1480,7 @@ add_task(async function test_uploadOutgoing_failed() { POST requests. More comprehensive unit-tests for this "batching" are in test_postqueue.js. */ -add_test(function test_uploadOutgoing_MAX_UPLOAD_RECORDS() { +add_task(async function test_uploadOutgoing_MAX_UPLOAD_RECORDS() { _("SyncEngine._uploadOutgoing uploads in batches of MAX_UPLOAD_RECORDS"); Service.identity.username = "foo"; @@ -1524,7 +1522,7 @@ add_test(function test_uploadOutgoing_MAX_UPLOAD_RECORDS() { "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); try { @@ -1543,11 +1541,11 @@ add_test(function test_uploadOutgoing_MAX_UPLOAD_RECORDS() { do_check_eq(noOfUploads, Math.ceil(234/MAX_UPLOAD_RECORDS)); } finally { - cleanAndGo(server); + await cleanAndGo(server); } }); -add_test(function test_uploadOutgoing_largeRecords() { +add_task(async function test_uploadOutgoing_largeRecords() { _("SyncEngine._uploadOutgoing throws on records larger than MAX_UPLOAD_BYTES"); Service.identity.username = "foo"; @@ -1569,7 +1567,7 @@ add_test(function test_uploadOutgoing_largeRecords() { "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); try { engine._syncStartup(); @@ -1581,17 +1579,17 @@ add_test(function test_uploadOutgoing_largeRecords() { } ok(!!error); } finally { - cleanAndGo(server); + await cleanAndGo(server); } }); -add_test(function test_syncFinish_noDelete() { +add_task(async function test_syncFinish_noDelete() { _("SyncEngine._syncFinish resets tracker's score"); let server = httpd_setup({}); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); let engine = makeRotaryEngine(); engine._delete = {}; // Nothing to delete engine._tracker.score = 100; @@ -1603,7 +1601,7 @@ add_test(function test_syncFinish_noDelete() { }); -add_test(function test_syncFinish_deleteByIds() { +add_task(async function test_syncFinish_deleteByIds() { _("SyncEngine._syncFinish deletes server records slated for deletion (list of record IDs)."); Service.identity.username = "foo"; @@ -1621,7 +1619,7 @@ add_test(function test_syncFinish_deleteByIds() { let server = httpd_setup({ "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); let engine = makeRotaryEngine(); try { @@ -1638,12 +1636,12 @@ add_test(function test_syncFinish_deleteByIds() { do_check_eq(engine._delete.ids, undefined); } finally { - cleanAndGo(server); + await cleanAndGo(server); } }); -add_test(function test_syncFinish_deleteLotsInBatches() { +add_task(async function test_syncFinish_deleteLotsInBatches() { _("SyncEngine._syncFinish deletes server records in batches of 100 (list of record IDs)."); Service.identity.username = "foo"; @@ -1672,7 +1670,7 @@ add_test(function test_syncFinish_deleteLotsInBatches() { "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); let engine = makeRotaryEngine(); try { @@ -1709,7 +1707,7 @@ add_test(function test_syncFinish_deleteLotsInBatches() { do_check_eq(engine._delete.ids, undefined); } finally { - cleanAndGo(server); + await cleanAndGo(server); } }); @@ -1723,7 +1721,7 @@ add_task(async function test_sync_partialUpload() { let server = sync_httpd_setup({ "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); generateNewKeys(Service.collectionKeys); let engine = makeRotaryEngine(); @@ -1789,7 +1787,7 @@ add_task(async function test_sync_partialUpload() { } }); -add_test(function test_canDecrypt_noCryptoKeys() { +add_task(async function test_canDecrypt_noCryptoKeys() { _("SyncEngine.canDecrypt returns false if the engine fails to decrypt items on the server, e.g. due to a missing crypto key collection."); Service.identity.username = "foo"; @@ -1805,18 +1803,18 @@ add_test(function test_canDecrypt_noCryptoKeys() { "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); let engine = makeRotaryEngine(); try { do_check_false(engine.canDecrypt()); } finally { - cleanAndGo(server); + await cleanAndGo(server); } }); -add_test(function test_canDecrypt_true() { +add_task(async function test_canDecrypt_true() { _("SyncEngine.canDecrypt returns true if the engine can decrypt the items on the server."); Service.identity.username = "foo"; @@ -1831,19 +1829,19 @@ add_test(function test_canDecrypt_true() { "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); let engine = makeRotaryEngine(); try { do_check_true(engine.canDecrypt()); } finally { - cleanAndGo(server); + await cleanAndGo(server); } }); -add_test(function test_syncapplied_observer() { +add_task(async function test_syncapplied_observer() { Service.identity.username = "foo"; const NUMBER_OF_RECORDS = 10; @@ -1862,7 +1860,7 @@ add_test(function test_syncapplied_observer() { "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); let meta_global = Service.recordManager.set(engine.metaURL, new WBORecord(engine.metaURL)); @@ -1895,7 +1893,7 @@ add_test(function test_syncapplied_observer() { do_check_true(Service.scheduler.hasIncomingItems); } finally { - cleanAndGo(server); + await cleanAndGo(server); Service.scheduler.hasIncomingItems = false; Svc.Obs.remove("weave:engine:sync:applied", onApplied); } diff --git a/services/sync/tests/unit/test_syncscheduler.js b/services/sync/tests/unit/test_syncscheduler.js index e18b6cc4bd15..de3cc7841631 100644 --- a/services/sync/tests/unit/test_syncscheduler.js +++ b/services/sync/tests/unit/test_syncscheduler.js @@ -58,9 +58,7 @@ function sync_httpd_setup() { } async function setUp(server) { - await configureIdentity({username: "johndoe"}); - - Service.clusterURL = server.baseURI + "/"; + await configureIdentity({username: "johndoe"}, server); generateNewKeys(Service.collectionKeys); let serverKeys = Service.collectionKeys.asWBO("crypto", "keys"); @@ -692,13 +690,18 @@ add_identity_test(this, async function test_no_sync_node() { let server = sync_httpd_setup(); await setUp(server); - Service.serverURL = server.baseURI + "/"; + oldfc = Service._clusterManager._findCluster; + Service._clusterManager._findCluster = () => null; + Service.clusterURL = ""; + try { + Service.sync(); + do_check_eq(Status.sync, NO_SYNC_NODE_FOUND); + do_check_eq(scheduler.syncTimer.delay, NO_SYNC_NODE_INTERVAL); - Service.sync(); - do_check_eq(Status.sync, NO_SYNC_NODE_FOUND); - do_check_eq(scheduler.syncTimer.delay, NO_SYNC_NODE_INTERVAL); - - await cleanUpAndGo(server); + await cleanUpAndGo(server); + } finally { + Service._clusterManager._findCluster = oldfc; + } }); add_identity_test(this, async function test_sync_failed_partial_500s() { diff --git a/services/sync/tests/unit/test_tab_engine.js b/services/sync/tests/unit/test_tab_engine.js index 0492502306aa..03733247a3b6 100644 --- a/services/sync/tests/unit/test_tab_engine.js +++ b/services/sync/tests/unit/test_tab_engine.js @@ -49,7 +49,7 @@ add_test(function test_getOpenURLs() { run_next_test(); }); -add_test(function test_tab_engine_skips_incoming_local_record() { +add_task(async function test_tab_engine_skips_incoming_local_record() { _("Ensure incoming records that match local client ID are never applied."); let [engine, store] = getMocks(); let localID = engine.service.clientsEngine.localID; @@ -78,7 +78,7 @@ add_test(function test_tab_engine_skips_incoming_local_record() { "/1.1/foo/storage/tabs": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + let syncTesting = await SyncTestingInfrastructure(server); Service.identity.username = "foo"; let meta_global = Service.recordManager.set(engine.metaURL, @@ -88,17 +88,20 @@ add_test(function test_tab_engine_skips_incoming_local_record() { generateNewKeys(Service.collectionKeys); - let syncFinish = engine._syncFinish; - engine._syncFinish = function () { - equal(applied.length, 1, "Remote client record was applied"); - equal(applied[0].id, remoteID, "Remote client ID matches"); + let promiseFinished = new Promise(resolve => { + let syncFinish = engine._syncFinish; + engine._syncFinish = function () { + equal(applied.length, 1, "Remote client record was applied"); + equal(applied[0].id, remoteID, "Remote client ID matches"); - syncFinish.call(engine); - run_next_test(); - } + syncFinish.call(engine); + resolve(); + } + }); _("Start sync"); engine._sync(); + await promiseFinished; }); add_test(function test_reconcile() { diff --git a/services/sync/tests/unit/test_telemetry.js b/services/sync/tests/unit/test_telemetry.js index 53b15036155c..3d199977af45 100644 --- a/services/sync/tests/unit/test_telemetry.js +++ b/services/sync/tests/unit/test_telemetry.js @@ -101,7 +101,7 @@ add_task(async function test_processIncoming_error() { syncID: engine.syncID}}}}, bookmarks: {} }); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); let collection = server.user("foo").collection("bookmarks"); try { // Create a bogus record that when synced down will provoke a @@ -124,7 +124,7 @@ add_task(async function test_processIncoming_error() { } ok(!!error); ok(!!ping); - equal(ping.uid, "0".repeat(32)); + equal(ping.uid, "f".repeat(32)); // as setup by SyncTestingInfrastructure deepEqual(ping.failureReason, { name: "othererror", error: "error.engine.reason.record_download_fail" @@ -151,7 +151,7 @@ add_task(async function test_uploading() { syncID: engine.syncID}}}}, bookmarks: {} }); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); let parent = PlacesUtils.toolbarFolderId; let uri = Utils.makeURI("http://getfirefox.com/"); @@ -200,7 +200,7 @@ add_task(async function test_upload_failed() { "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + await SyncTestingInfrastructure(server); let engine = new RotaryEngine(Service); engine.lastSync = 123; // needs to be non-zero so that tracker is queried @@ -248,7 +248,7 @@ add_task(async function test_sync_partialUpload() { let server = sync_httpd_setup({ "/1.1/foo/storage/rotary": collection.handler() }); - let syncTesting = new SyncTestingInfrastructure(server); + await SyncTestingInfrastructure(server); generateNewKeys(Service.collectionKeys); let engine = new RotaryEngine(Service); @@ -331,7 +331,7 @@ add_task(async function test_generic_engine_fail() { syncID: engine.syncID}}}}, steam: {} }); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); let e = new Error("generic failure message") engine._errToThrow = e; @@ -358,7 +358,7 @@ add_task(async function test_engine_fail_ioerror() { syncID: engine.syncID}}}}, steam: {} }); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); // create an IOError to re-throw as part of Sync. try { // (Note that fakeservices.js has replaced Utils.jsonMove etc, but for @@ -398,7 +398,7 @@ add_task(async function test_initial_sync_engines() { conf[e] = {}; } let server = serverForUsers({"foo": "password"}, conf); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); try { let ping = await wait_for_ping(() => Service.sync(), true); @@ -431,7 +431,7 @@ add_task(async function test_nserror() { syncID: engine.syncID}}}}, steam: {} }); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); engine._errToThrow = Components.Exception("NS_ERROR_UNKNOWN_HOST", Cr.NS_ERROR_UNKNOWN_HOST); try { let ping = await sync_and_validate_telem(true); @@ -461,7 +461,6 @@ add_identity_test(this, async function test_discarding() { let server; try { - await configureIdentity({ username: "johndoe" }); let handlers = { "/1.1/johndoe/info/collections": helper.handler, "/1.1/johndoe/storage/crypto/keys": upd("crypto", new ServerWBO("keys").handler()), @@ -475,7 +474,7 @@ add_identity_test(this, async function test_discarding() { } server = httpd_setup(handlers); - Service.serverURL = server.baseURI; + await configureIdentity({ username: "johndoe" }, server); telem.submit = () => ok(false, "Submitted telemetry ping when we should not have"); for (let i = 0; i < 5; ++i) { @@ -506,7 +505,7 @@ add_task(async function test_no_foreign_engines_in_error_ping() { steam: {} }); engine._errToThrow = new Error("Oh no!"); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); try { let ping = await sync_and_validate_telem(true); equal(ping.status.service, SYNC_FAILED_PARTIAL); @@ -527,7 +526,7 @@ add_task(async function test_sql_error() { syncID: engine.syncID}}}}, steam: {} }); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); engine._sync = function() { // Just grab a DB connection and issue a bogus SQL statement synchronously. let db = PlacesUtils.history.QueryInterface(Ci.nsPIPlacesDatabase).DBConnection; @@ -553,7 +552,7 @@ add_task(async function test_no_foreign_engines_in_success_ping() { steam: {} }); - new SyncTestingInfrastructure(server.server); + await SyncTestingInfrastructure(server); try { let ping = await sync_and_validate_telem(); ok(ping.engines.every(e => e.name !== "bogus")); From 2160edf69f4d412f8e0de9e9db726b0aabcf11b6 Mon Sep 17 00:00:00 2001 From: Phil Ringnalda Date: Thu, 24 Nov 2016 19:30:48 -0800 Subject: [PATCH 38/53] Backed out changeset eb4be9ed211e (bug 1319650) for reftest and chrome bustage CLOSED TREE --- widget/gtk/WidgetStyleCache.cpp | 271 +++++++++++++------------------- widget/gtk/mozgtk/mozgtk.c | 1 - 2 files changed, 105 insertions(+), 167 deletions(-) diff --git a/widget/gtk/WidgetStyleCache.cpp b/widget/gtk/WidgetStyleCache.cpp index 11c60957e12b..b1c4d928569e 100644 --- a/widget/gtk/WidgetStyleCache.cpp +++ b/widget/gtk/WidgetStyleCache.cpp @@ -20,6 +20,10 @@ static_assert(GTK_STATE_FLAG_DIR_LTR == STATE_FLAG_DIR_LTR && static GtkWidget* sWidgetStorage[MOZ_GTK_WIDGET_NODE_COUNT]; static GtkStyleContext* sStyleStorage[MOZ_GTK_WIDGET_NODE_COUNT]; +static bool sStyleContextNeedsRestore; +#ifdef DEBUG +static GtkStyleContext* sCurrentStyleContext; +#endif static GtkStyleContext* GetWidgetRootStyle(WidgetNodeType aNodeType); static GtkStyleContext* @@ -638,16 +642,6 @@ GetWidget(WidgetNodeType aWidgetType) return widget; } -static void -AddStyleClassesFromStyle(GtkStyleContext* aDest, GtkStyleContext* aSrc) -{ - GList* classes = gtk_style_context_list_classes(aSrc); - for (GList* link = classes; link; link = link->next) { - gtk_style_context_add_class(aDest, static_cast(link->data)); - } - g_list_free(classes); -} - GtkStyleContext* CreateStyleForWidget(GtkWidget* aWidget, GtkStyleContext* aParentStyle) { @@ -679,7 +673,11 @@ CreateStyleForWidget(GtkWidget* aWidget, GtkStyleContext* aParentStyle) // gtk_widget_path_append_for_widget() from finding classes in GTK 3.20, // is not a problem. GtkStyleContext* widgetStyle = gtk_widget_get_style_context(aWidget); - AddStyleClassesFromStyle(context, widgetStyle); + GList* classes = gtk_style_context_list_classes(widgetStyle); + for (GList* link = classes; link; link = link->next) { + gtk_style_context_add_class(context, static_cast(link->data)); + } + g_list_free(classes); // Release any floating reference on aWidget. g_object_ref_sink(aWidget); @@ -791,58 +789,13 @@ CreateChildCSSNode(const char* aName, WidgetNodeType aParentNodeType) return CreateCSSNode(aName, GetCssNodeStyleInternal(aParentNodeType)); } -// Create a style context equivalent to a saved root style context of -// |aWidgetType| with |aStyleClass| as an additional class. This is used to -// produce a context equivalent to what GTK versions < 3.20 use for many -// internal parts of widgets. static GtkStyleContext* -CreateSubStyleWithClass(WidgetNodeType aWidgetType, const gchar* aStyleClass) +GetWidgetStyleWithClass(WidgetNodeType aWidgetType, const gchar* aStyleClass) { - static auto sGtkWidgetPathIterGetObjectName = - reinterpret_cast - (dlsym(RTLD_DEFAULT, "gtk_widget_path_iter_get_object_name")); - - GtkStyleContext* parentStyle = GetWidgetRootStyle(aWidgetType); - - // Create a new context that behaves like |parentStyle| would after - // gtk_style_context_save(parentStyle). - // - // Avoiding gtk_style_context_save() avoids the need to manage the - // restore, and a new context permits caching style resolution. - // - // gtk_style_context_save(context) changes the node hierarchy of |context| - // to add a new GtkCssNodeDeclaration that is a copy of its original node. - // The new node is a child of the original node, and so the new heirarchy is - // one level deeper. The new node receives the same classes as the - // original, but any changes to the classes on |context| will change only - // the new node. The new node inherits properties from the original node - // (which retains the original heirarchy and classes) and matches CSS rules - // with the new heirarchy and any changes to the classes. - // - // The change in hierarchy can produce some surprises in matching theme CSS - // rules (e.g. https://bugzilla.gnome.org/show_bug.cgi?id=761870#c2), but it - // is important here to produce the same behavior so that rules match the - // same widget parts in Gecko as they do in GTK. - // - // When using public GTK API to construct style contexts, a widget path is - // required. CSS rules are not matched against the style context heirarchy - // but according to the heirarchy in the widget path. The path that matches - // the same CSS rules as a saved context is like the path of |parentStyle| - // but with an extra copy of the head (last) object appended. Setting - // |parentStyle| as the parent context provides the same inheritance of - // properties from the widget root node. - const GtkWidgetPath* parentPath = gtk_style_context_get_path(parentStyle); - const gchar* name = sGtkWidgetPathIterGetObjectName ? - sGtkWidgetPathIterGetObjectName(parentPath, -1) : nullptr; - GType objectType = gtk_widget_path_get_object_type(parentPath); - - GtkStyleContext* style = CreateCSSNode(name, parentStyle, objectType); - - // Start with the same classes on the new node as were on |parentStyle|. - // GTK puts no regions or junction_sides on widget root nodes, and so there - // is no need to copy these. - AddStyleClassesFromStyle(style, parentStyle); - + GtkStyleContext* style = GetWidgetRootStyle(aWidgetType); + gtk_style_context_save(style); + MOZ_ASSERT(!sStyleContextNeedsRestore); + sStyleContextNeedsRestore = true; gtk_style_context_add_class(style, aStyleClass); return style; } @@ -911,42 +864,35 @@ GetCssNodeStyleInternal(WidgetNodeType aNodeType) break; case MOZ_GTK_GRIPPER: // TODO - create from CSS node - style = CreateSubStyleWithClass(MOZ_GTK_GRIPPER, - GTK_STYLE_CLASS_GRIP); - break; + return GetWidgetStyleWithClass(MOZ_GTK_GRIPPER, + GTK_STYLE_CLASS_GRIP); case MOZ_GTK_INFO_BAR: // TODO - create from CSS node - style = CreateSubStyleWithClass(MOZ_GTK_INFO_BAR, - GTK_STYLE_CLASS_INFO); - break; + return GetWidgetStyleWithClass(MOZ_GTK_INFO_BAR, + GTK_STYLE_CLASS_INFO); case MOZ_GTK_SPINBUTTON_ENTRY: // TODO - create from CSS node - style = CreateSubStyleWithClass(MOZ_GTK_SPINBUTTON, - GTK_STYLE_CLASS_ENTRY); - break; + return GetWidgetStyleWithClass(MOZ_GTK_SPINBUTTON, + GTK_STYLE_CLASS_ENTRY); case MOZ_GTK_SCROLLED_WINDOW: // TODO - create from CSS node - style = CreateSubStyleWithClass(MOZ_GTK_SCROLLED_WINDOW, - GTK_STYLE_CLASS_FRAME); - break; + return GetWidgetStyleWithClass(MOZ_GTK_SCROLLED_WINDOW, + GTK_STYLE_CLASS_FRAME); case MOZ_GTK_TEXT_VIEW: // TODO - create from CSS node - style = CreateSubStyleWithClass(MOZ_GTK_TEXT_VIEW, - GTK_STYLE_CLASS_VIEW); - break; + return GetWidgetStyleWithClass(MOZ_GTK_TEXT_VIEW, + GTK_STYLE_CLASS_VIEW); case MOZ_GTK_FRAME_BORDER: style = CreateChildCSSNode("border", MOZ_GTK_FRAME); break; case MOZ_GTK_TREEVIEW_VIEW: // TODO - create from CSS node - style = CreateSubStyleWithClass(MOZ_GTK_TREEVIEW, - GTK_STYLE_CLASS_VIEW); - break; + return GetWidgetStyleWithClass(MOZ_GTK_TREEVIEW, + GTK_STYLE_CLASS_VIEW); case MOZ_GTK_TREEVIEW_EXPANDER: // TODO - create from CSS node - style = CreateSubStyleWithClass(MOZ_GTK_TREEVIEW, - GTK_STYLE_CLASS_EXPANDER); - break; + return GetWidgetStyleWithClass(MOZ_GTK_TREEVIEW, + GTK_STYLE_CLASS_EXPANDER); case MOZ_GTK_SPLITTER_SEPARATOR_HORIZONTAL: style = CreateChildCSSNode("separator", MOZ_GTK_SPLITTER_HORIZONTAL); @@ -982,7 +928,7 @@ GetCssNodeStyleInternal(WidgetNodeType aNodeType) case MOZ_GTK_TAB_TOP: { // TODO - create from CSS node - style = CreateSubStyleWithClass(MOZ_GTK_NOTEBOOK, + style = GetWidgetStyleWithClass(MOZ_GTK_NOTEBOOK, GTK_STYLE_CLASS_TOP); gtk_style_context_add_region(style, GTK_STYLE_REGION_TAB, static_cast(0)); @@ -991,7 +937,7 @@ GetCssNodeStyleInternal(WidgetNodeType aNodeType) case MOZ_GTK_TAB_BOTTOM: { // TODO - create from CSS node - style = CreateSubStyleWithClass(MOZ_GTK_NOTEBOOK, + style = GetWidgetStyleWithClass(MOZ_GTK_NOTEBOOK, GTK_STYLE_CLASS_BOTTOM); gtk_style_context_add_region(style, GTK_STYLE_REGION_TAB, static_cast(0)); @@ -1019,111 +965,91 @@ GetCssNodeStyleInternal(WidgetNodeType aNodeType) static GtkStyleContext* GetWidgetStyleInternal(WidgetNodeType aNodeType) { - GtkStyleContext* style = sStyleStorage[aNodeType]; - if (style) - return style; - switch (aNodeType) { case MOZ_GTK_SCROLLBAR_TROUGH_HORIZONTAL: - style = CreateSubStyleWithClass(MOZ_GTK_SCROLLBAR_HORIZONTAL, - GTK_STYLE_CLASS_TROUGH); - break; + return GetWidgetStyleWithClass(MOZ_GTK_SCROLLBAR_HORIZONTAL, + GTK_STYLE_CLASS_TROUGH); case MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL: - style = CreateSubStyleWithClass(MOZ_GTK_SCROLLBAR_HORIZONTAL, - GTK_STYLE_CLASS_SLIDER); - break; + return GetWidgetStyleWithClass(MOZ_GTK_SCROLLBAR_HORIZONTAL, + GTK_STYLE_CLASS_SLIDER); case MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL: - style = CreateSubStyleWithClass(MOZ_GTK_SCROLLBAR_VERTICAL, - GTK_STYLE_CLASS_TROUGH); - break; + return GetWidgetStyleWithClass(MOZ_GTK_SCROLLBAR_VERTICAL, + GTK_STYLE_CLASS_TROUGH); case MOZ_GTK_SCROLLBAR_THUMB_VERTICAL: - style = CreateSubStyleWithClass(MOZ_GTK_SCROLLBAR_VERTICAL, - GTK_STYLE_CLASS_SLIDER); - break; + return GetWidgetStyleWithClass(MOZ_GTK_SCROLLBAR_VERTICAL, + GTK_STYLE_CLASS_SLIDER); case MOZ_GTK_RADIOBUTTON: - style = CreateSubStyleWithClass(MOZ_GTK_RADIOBUTTON_CONTAINER, - GTK_STYLE_CLASS_RADIO); - break; + return GetWidgetStyleWithClass(MOZ_GTK_RADIOBUTTON_CONTAINER, + GTK_STYLE_CLASS_RADIO); case MOZ_GTK_CHECKBUTTON: - style = CreateSubStyleWithClass(MOZ_GTK_CHECKBUTTON_CONTAINER, - GTK_STYLE_CLASS_CHECK); - break; + return GetWidgetStyleWithClass(MOZ_GTK_CHECKBUTTON_CONTAINER, + GTK_STYLE_CLASS_CHECK); case MOZ_GTK_RADIOMENUITEM_INDICATOR: - style = CreateSubStyleWithClass(MOZ_GTK_RADIOMENUITEM, - GTK_STYLE_CLASS_RADIO); - break; + return GetWidgetStyleWithClass(MOZ_GTK_RADIOMENUITEM, + GTK_STYLE_CLASS_RADIO); case MOZ_GTK_CHECKMENUITEM_INDICATOR: - style = CreateSubStyleWithClass(MOZ_GTK_CHECKMENUITEM, - GTK_STYLE_CLASS_CHECK); - break; + return GetWidgetStyleWithClass(MOZ_GTK_CHECKMENUITEM, + GTK_STYLE_CLASS_CHECK); case MOZ_GTK_PROGRESS_TROUGH: - style = CreateSubStyleWithClass(MOZ_GTK_PROGRESSBAR, - GTK_STYLE_CLASS_TROUGH); - break; + return GetWidgetStyleWithClass(MOZ_GTK_PROGRESSBAR, + GTK_STYLE_CLASS_TROUGH); case MOZ_GTK_GRIPPER: - style = CreateSubStyleWithClass(MOZ_GTK_GRIPPER, - GTK_STYLE_CLASS_GRIP); - break; + return GetWidgetStyleWithClass(MOZ_GTK_GRIPPER, + GTK_STYLE_CLASS_GRIP); case MOZ_GTK_INFO_BAR: - style = CreateSubStyleWithClass(MOZ_GTK_INFO_BAR, - GTK_STYLE_CLASS_INFO); - break; + return GetWidgetStyleWithClass(MOZ_GTK_INFO_BAR, + GTK_STYLE_CLASS_INFO); case MOZ_GTK_SPINBUTTON_ENTRY: - style = CreateSubStyleWithClass(MOZ_GTK_SPINBUTTON, - GTK_STYLE_CLASS_ENTRY); - break; + return GetWidgetStyleWithClass(MOZ_GTK_SPINBUTTON, + GTK_STYLE_CLASS_ENTRY); case MOZ_GTK_SCROLLED_WINDOW: - style = CreateSubStyleWithClass(MOZ_GTK_SCROLLED_WINDOW, - GTK_STYLE_CLASS_FRAME); - break; + return GetWidgetStyleWithClass(MOZ_GTK_SCROLLED_WINDOW, + GTK_STYLE_CLASS_FRAME); case MOZ_GTK_TEXT_VIEW: - style = CreateSubStyleWithClass(MOZ_GTK_TEXT_VIEW, - GTK_STYLE_CLASS_VIEW); - break; + return GetWidgetStyleWithClass(MOZ_GTK_TEXT_VIEW, + GTK_STYLE_CLASS_VIEW); case MOZ_GTK_FRAME_BORDER: return GetWidgetRootStyle(MOZ_GTK_FRAME); case MOZ_GTK_TREEVIEW_VIEW: - style = CreateSubStyleWithClass(MOZ_GTK_TREEVIEW, - GTK_STYLE_CLASS_VIEW); - break; + return GetWidgetStyleWithClass(MOZ_GTK_TREEVIEW, + GTK_STYLE_CLASS_VIEW); case MOZ_GTK_TREEVIEW_EXPANDER: - style = CreateSubStyleWithClass(MOZ_GTK_TREEVIEW, - GTK_STYLE_CLASS_EXPANDER); - break; + return GetWidgetStyleWithClass(MOZ_GTK_TREEVIEW, + GTK_STYLE_CLASS_EXPANDER); case MOZ_GTK_SPLITTER_SEPARATOR_HORIZONTAL: - style = CreateSubStyleWithClass(MOZ_GTK_SPLITTER_HORIZONTAL, - GTK_STYLE_CLASS_PANE_SEPARATOR); - break; + return GetWidgetStyleWithClass(MOZ_GTK_SPLITTER_HORIZONTAL, + GTK_STYLE_CLASS_PANE_SEPARATOR); case MOZ_GTK_SPLITTER_SEPARATOR_VERTICAL: - style = CreateSubStyleWithClass(MOZ_GTK_SPLITTER_VERTICAL, - GTK_STYLE_CLASS_PANE_SEPARATOR); - break; + return GetWidgetStyleWithClass(MOZ_GTK_SPLITTER_VERTICAL, + GTK_STYLE_CLASS_PANE_SEPARATOR); case MOZ_GTK_SCALE_TROUGH_HORIZONTAL: - style = CreateSubStyleWithClass(MOZ_GTK_SCALE_HORIZONTAL, - GTK_STYLE_CLASS_TROUGH); - break; + return GetWidgetStyleWithClass(MOZ_GTK_SCALE_HORIZONTAL, + GTK_STYLE_CLASS_TROUGH); case MOZ_GTK_SCALE_TROUGH_VERTICAL: - style = CreateSubStyleWithClass(MOZ_GTK_SCALE_VERTICAL, - GTK_STYLE_CLASS_TROUGH); - break; + return GetWidgetStyleWithClass(MOZ_GTK_SCALE_VERTICAL, + GTK_STYLE_CLASS_TROUGH); case MOZ_GTK_SCALE_THUMB_HORIZONTAL: - style = CreateSubStyleWithClass(MOZ_GTK_SCALE_HORIZONTAL, - GTK_STYLE_CLASS_SLIDER); - break; + return GetWidgetStyleWithClass(MOZ_GTK_SCALE_HORIZONTAL, + GTK_STYLE_CLASS_SLIDER); case MOZ_GTK_SCALE_THUMB_VERTICAL: - style = CreateSubStyleWithClass(MOZ_GTK_SCALE_VERTICAL, - GTK_STYLE_CLASS_SLIDER); - break; + return GetWidgetStyleWithClass(MOZ_GTK_SCALE_VERTICAL, + GTK_STYLE_CLASS_SLIDER); case MOZ_GTK_TAB_TOP: - style = CreateSubStyleWithClass(MOZ_GTK_NOTEBOOK, GTK_STYLE_CLASS_TOP); + { + GtkStyleContext* style = GetWidgetStyleWithClass(MOZ_GTK_NOTEBOOK, + GTK_STYLE_CLASS_TOP); gtk_style_context_add_region(style, GTK_STYLE_REGION_TAB, static_cast(0)); - break; + return style; + } case MOZ_GTK_TAB_BOTTOM: - style = CreateSubStyleWithClass(MOZ_GTK_NOTEBOOK, GTK_STYLE_CLASS_BOTTOM); + { + GtkStyleContext* style = GetWidgetStyleWithClass(MOZ_GTK_NOTEBOOK, + GTK_STYLE_CLASS_BOTTOM); gtk_style_context_add_region(style, GTK_STYLE_REGION_TAB, static_cast(0)); - break; + return style; + } case MOZ_GTK_NOTEBOOK: case MOZ_GTK_NOTEBOOK_HEADER: case MOZ_GTK_TABPANELS: @@ -1135,15 +1061,16 @@ GetWidgetStyleInternal(WidgetNodeType aNodeType) default: return GetWidgetRootStyle(aNodeType); } - - MOZ_ASSERT(style); - sStyleStorage[aNodeType] = style; - return style; } void ResetWidgetCache(void) { + MOZ_ASSERT(!sStyleContextNeedsRestore); +#ifdef DEBUG + MOZ_ASSERT(!sCurrentStyleContext); +#endif + for (int i = 0; i < MOZ_GTK_WIDGET_NODE_COUNT; i++) { if (sStyleStorage[i]) g_object_unref(sStyleStorage[i]); @@ -1162,12 +1089,17 @@ GtkStyleContext* ClaimStyleContext(WidgetNodeType aNodeType, GtkTextDirection aDirection, GtkStateFlags aStateFlags, StyleFlags aFlags) { + MOZ_ASSERT(!sStyleContextNeedsRestore); GtkStyleContext* style; if (gtk_check_version(3, 20, 0) != nullptr) { style = GetWidgetStyleInternal(aNodeType); } else { style = GetCssNodeStyleInternal(aNodeType); } +#ifdef DEBUG + MOZ_ASSERT(!sCurrentStyleContext); + sCurrentStyleContext = style; +#endif bool stateChanged = false; bool stateHasDirection = gtk_get_minor_version() >= 8; GtkStateFlags oldState = gtk_style_context_get_state(style); @@ -1207,10 +1139,9 @@ ClaimStyleContext(WidgetNodeType aNodeType, GtkTextDirection aDirection, // // https://bugzilla.mozilla.org/show_bug.cgi?id=1272194#c7 // - // Avoid calling invalidate on contexts that are not owned and constructed - // by widgets to avoid performing build_properties() (in 3.16 stylecontext.c) - // unnecessarily early. - if (stateChanged && sWidgetStorage[aNodeType]) { + // Avoid calling invalidate on saved contexts to avoid performing + // build_properties() (in 3.16 stylecontext.c) unnecessarily early. + if (stateChanged && !sStyleContextNeedsRestore) { gtk_style_context_invalidate(style); } return style; @@ -1219,4 +1150,12 @@ ClaimStyleContext(WidgetNodeType aNodeType, GtkTextDirection aDirection, void ReleaseStyleContext(GtkStyleContext* aStyleContext) { + if (sStyleContextNeedsRestore) { + gtk_style_context_restore(aStyleContext); + } + sStyleContextNeedsRestore = false; +#ifdef DEBUG + MOZ_ASSERT(sCurrentStyleContext == aStyleContext); + sCurrentStyleContext = nullptr; +#endif } diff --git a/widget/gtk/mozgtk/mozgtk.c b/widget/gtk/mozgtk/mozgtk.c index 76964122c941..e42446e43195 100644 --- a/widget/gtk/mozgtk/mozgtk.c +++ b/widget/gtk/mozgtk/mozgtk.c @@ -581,7 +581,6 @@ STUB(gtk_widget_path_append_type) STUB(gtk_widget_path_copy) STUB(gtk_widget_path_free) STUB(gtk_widget_path_iter_add_class) -STUB(gtk_widget_path_get_object_type) STUB(gtk_widget_path_new) STUB(gtk_widget_path_unref) STUB(gtk_widget_set_visual) From f000f87291c9b8d38317125319a0c109cee392be Mon Sep 17 00:00:00 2001 From: "Alfredo.Yang" Date: Fri, 25 Nov 2016 09:08:37 +0800 Subject: [PATCH 39/53] Bug 1317609 - update rust mp4 parser to support avc extra data. r=kinetik MozReview-Commit-ID: 7sWkDrXD8bs --HG-- extra : rebase_source : cbee895e95f2c0f2ad3c06b03b65ab3c3ad6d34d --- .../libstagefright/binding/include/mp4parse.h | 1 + .../binding/mp4parse/src/lib.rs | 614 +++++++++--------- .../binding/mp4parse/src/tests.rs | 34 +- .../binding/mp4parse/tests/public.rs | 4 +- .../binding/mp4parse_capi/src/lib.rs | 33 +- 5 files changed, 354 insertions(+), 332 deletions(-) diff --git a/media/libstagefright/binding/include/mp4parse.h b/media/libstagefright/binding/include/mp4parse.h index 153344a8cdc1..7efac0afcc33 100644 --- a/media/libstagefright/binding/include/mp4parse.h +++ b/media/libstagefright/binding/include/mp4parse.h @@ -69,6 +69,7 @@ typedef struct mp4parse_track_video_info { uint32_t display_height; uint16_t image_width; uint16_t image_height; + mp4parse_byte_data extra_data; } mp4parse_track_video_info; typedef struct mp4parse_fragment_info { diff --git a/media/libstagefright/binding/mp4parse/src/lib.rs b/media/libstagefright/binding/mp4parse/src/lib.rs index 28f30d4e78ba..4c8bbaf05ae8 100644 --- a/media/libstagefright/binding/mp4parse/src/lib.rs +++ b/media/libstagefright/binding/mp4parse/src/lib.rs @@ -205,12 +205,12 @@ pub enum SampleEntry { } #[allow(non_camel_case_types)] -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Default)] pub struct ES_Descriptor { pub audio_codec: CodecType, pub audio_sample_rate: Option, pub audio_channel_count: Option, - pub codec_specific_config: Vec, + pub codec_esds: Vec, } #[allow(non_camel_case_types)] @@ -459,13 +459,13 @@ impl<'a, T: Read> BMFFBox<'a, T> { /// parsers for the internal content, or to get the length to /// skip unknown or uninteresting boxes. fn read_box_header(src: &mut T) -> Result { - let size32 = try!(be_u32(src)); - let name = BoxType::from(try!(be_u32(src))); + let size32 = be_u32(src)?; + let name = BoxType::from(be_u32(src)?); let size = match size32 { // valid only for top-level box and indicates it's the last box in the file. usually mdat. 0 => return Err(Error::Unsupported("unknown sized box")), 1 => { - let size64 = try!(be_u64(src)); + let size64 = be_u64(src)?; if size64 < 16 { return Err(Error::InvalidData("malformed wide size")); } @@ -488,10 +488,10 @@ fn read_box_header(src: &mut T) -> Result { /// Parse the extra header fields for a full box. fn read_fullbox_extra(src: &mut T) -> Result<(u8, u32)> { - let version = try!(src.read_u8()); - let flags_a = try!(src.read_u8()); - let flags_b = try!(src.read_u8()); - let flags_c = try!(src.read_u8()); + let version = src.read_u8()?; + let flags_a = src.read_u8()?; + let flags_b = src.read_u8()?; + let flags_c = src.read_u8()?; Ok((version, (flags_a as u32) << 16 | (flags_b as u32) << 8 | (flags_c as u32))) } @@ -504,7 +504,7 @@ fn skip_box_content(src: &mut BMFFBox) -> Result<()> { log!("{:?} (skipped)", header); (header.size - header.offset) as usize }; - assert!(to_skip == src.bytes_left()); + assert_eq!(to_skip, src.bytes_left()); skip(src, to_skip) } @@ -538,7 +538,7 @@ pub fn read_mp4(f: &mut T, context: &mut MediaContext) -> Result<()> { // TODO(kinetik): Top-level parsing should handle zero-sized boxes // rather than throwing an error. let mut iter = BoxIter::new(f); - while let Some(mut b) = try!(iter.next_box()) { + while let Some(mut b) = iter.next_box()? { // box ordering: ftyp before any variable length box (inc. moov), // but may not be first box in file if file signatures etc. present // fragmented mp4 order: ftyp, moov, pairs of moof/mdat (1-multiple), mfra @@ -556,15 +556,15 @@ pub fn read_mp4(f: &mut T, context: &mut MediaContext) -> Result<()> { // "four printable characters from the ISO 8859-1 character set" match b.head.name { BoxType::FileTypeBox => { - let ftyp = try!(read_ftyp(&mut b)); + let ftyp = read_ftyp(&mut b)?; found_ftyp = true; log!("{:?}", ftyp); } BoxType::MovieBox => { - try!(read_moov(&mut b, context)); + read_moov(&mut b, context)?; found_moov = true; } - _ => try!(skip_box_content(&mut b)), + _ => skip_box_content(&mut b)?, }; check_parser_state!(b.content); if found_moov { @@ -587,7 +587,7 @@ pub fn read_mp4(f: &mut T, context: &mut MediaContext) -> Result<()> { } fn parse_mvhd(f: &mut BMFFBox) -> Result<(MovieHeaderBox, Option)> { - let mvhd = try!(read_mvhd(f)); + let mvhd = read_mvhd(f)?; if mvhd.timescale == 0 { return Err(Error::InvalidData("zero timescale in mdhd")); } @@ -597,29 +597,29 @@ fn parse_mvhd(f: &mut BMFFBox) -> Result<(MovieHeaderBox, Option(f: &mut BMFFBox, context: &mut MediaContext) -> Result<()> { let mut iter = f.box_iter(); - while let Some(mut b) = try!(iter.next_box()) { + while let Some(mut b) = iter.next_box()? { match b.head.name { BoxType::MovieHeaderBox => { - let (mvhd, timescale) = try!(parse_mvhd(&mut b)); + let (mvhd, timescale) = parse_mvhd(&mut b)?; context.timescale = timescale; log!("{:?}", mvhd); } BoxType::TrackBox => { let mut track = Track::new(context.tracks.len()); - try!(read_trak(&mut b, &mut track)); + read_trak(&mut b, &mut track)?; context.tracks.push(track); } BoxType::MovieExtendsBox => { - let mvex = try!(read_mvex(&mut b)); + let mvex = read_mvex(&mut b)?; log!("{:?}", mvex); context.mvex = Some(mvex); } BoxType::ProtectionSystemSpecificHeaderBox => { - let pssh = try!(read_pssh(&mut b)); + let pssh = read_pssh(&mut b)?; log!("{:?}", pssh); context.psshs.push(pssh); } - _ => try!(skip_box_content(&mut b)), + _ => skip_box_content(&mut b)?, }; check_parser_state!(b.content); } @@ -628,32 +628,32 @@ fn read_moov(f: &mut BMFFBox, context: &mut MediaContext) -> Result< fn read_pssh(src: &mut BMFFBox) -> Result { let mut box_content = Vec::with_capacity(src.head.size as usize); - try!(src.read_to_end(&mut box_content)); + src.read_to_end(&mut box_content)?; let (system_id, kid, data) = { let pssh = &mut Cursor::new(box_content.as_slice()); - let (version, _) = try!(read_fullbox_extra(pssh)); + let (version, _) = read_fullbox_extra(pssh)?; - let system_id = try!(read_buf(pssh, 16)); + let system_id = read_buf(pssh, 16)?; let mut kid: Vec = Vec::new(); if version > 0 { - let count = try!(be_i32(pssh)); + let count = be_i32(pssh)?; for _ in 0..count { - let item = try!(read_buf(pssh, 16)); + let item = read_buf(pssh, 16)?; kid.push(item); } } - let data_size = try!(be_i32(pssh)) as usize; - let data = try!(read_buf(pssh, data_size)); + let data_size = be_i32(pssh)? as usize; + let data = read_buf(pssh, data_size)?; (system_id, kid, data) }; let mut pssh_box = Vec::new(); - try!(write_be_u32(&mut pssh_box, src.head.size as u32)); + write_be_u32(&mut pssh_box, src.head.size as u32)?; pssh_box.append(&mut b"pssh".to_vec()); pssh_box.append(&mut box_content); @@ -668,13 +668,13 @@ fn read_pssh(src: &mut BMFFBox) -> Result(src: &mut BMFFBox) -> Result { let mut iter = src.box_iter(); let mut fragment_duration = None; - while let Some(mut b) = try!(iter.next_box()) { + while let Some(mut b) = iter.next_box()? { match b.head.name { BoxType::MovieExtendsHeaderBox => { - let duration = try!(read_mehd(&mut b)); + let duration = read_mehd(&mut b)?; fragment_duration = Some(duration); }, - _ => try!(skip_box_content(&mut b)), + _ => skip_box_content(&mut b)?, } } Ok(MovieExtendsBox { @@ -683,10 +683,10 @@ fn read_mvex(src: &mut BMFFBox) -> Result { } fn read_mehd(src: &mut BMFFBox) -> Result { - let (version, _) = try!(read_fullbox_extra(src)); + let (version, _) = read_fullbox_extra(src)?; let fragment_duration = match version { - 1 => try!(be_u64(src)), - 0 => try!(be_u32(src)) as u64, + 1 => be_u64(src)?, + 0 => be_u32(src)? as u64, _ => return Err(Error::InvalidData("unhandled mehd version")), }; Ok(MediaScaledTime(fragment_duration)) @@ -694,17 +694,17 @@ fn read_mehd(src: &mut BMFFBox) -> Result { fn read_trak(f: &mut BMFFBox, track: &mut Track) -> Result<()> { let mut iter = f.box_iter(); - while let Some(mut b) = try!(iter.next_box()) { + while let Some(mut b) = iter.next_box()? { match b.head.name { BoxType::TrackHeaderBox => { - let tkhd = try!(read_tkhd(&mut b)); + let tkhd = read_tkhd(&mut b)?; track.track_id = Some(tkhd.track_id); track.tkhd = Some(tkhd.clone()); log!("{:?}", tkhd); } - BoxType::EditBox => try!(read_edts(&mut b, track)), - BoxType::MediaBox => try!(read_mdia(&mut b, track)), - _ => try!(skip_box_content(&mut b)), + BoxType::EditBox => read_edts(&mut b, track)?, + BoxType::MediaBox => read_mdia(&mut b, track)?, + _ => skip_box_content(&mut b)?, }; check_parser_state!(b.content); } @@ -713,10 +713,10 @@ fn read_trak(f: &mut BMFFBox, track: &mut Track) -> Result<()> { fn read_edts(f: &mut BMFFBox, track: &mut Track) -> Result<()> { let mut iter = f.box_iter(); - while let Some(mut b) = try!(iter.next_box()) { + while let Some(mut b) = iter.next_box()? { match b.head.name { BoxType::EditListBox => { - let elst = try!(read_elst(&mut b)); + let elst = read_elst(&mut b)?; let mut empty_duration = 0; let mut idx = 0; if elst.edits.len() > 2 { @@ -737,7 +737,7 @@ fn read_edts(f: &mut BMFFBox, track: &mut Track) -> Result<()> { track.id)); log!("{:?}", elst); } - _ => try!(skip_box_content(&mut b)), + _ => skip_box_content(&mut b)?, }; check_parser_state!(b.content); } @@ -745,7 +745,7 @@ fn read_edts(f: &mut BMFFBox, track: &mut Track) -> Result<()> { } fn parse_mdhd(f: &mut BMFFBox, track: &mut Track) -> Result<(MediaHeaderBox, Option, Option)> { - let mdhd = try!(read_mdhd(f)); + let mdhd = read_mdhd(f)?; let duration = match mdhd.duration { std::u64::MAX => None, duration => Some(TrackScaledTime(duration, track.id)), @@ -759,16 +759,16 @@ fn parse_mdhd(f: &mut BMFFBox, track: &mut Track) -> Result<(MediaHe fn read_mdia(f: &mut BMFFBox, track: &mut Track) -> Result<()> { let mut iter = f.box_iter(); - while let Some(mut b) = try!(iter.next_box()) { + while let Some(mut b) = iter.next_box()? { match b.head.name { BoxType::MediaHeaderBox => { - let (mdhd, duration, timescale) = try!(parse_mdhd(&mut b, track)); + let (mdhd, duration, timescale) = parse_mdhd(&mut b, track)?; track.duration = duration; track.timescale = timescale; log!("{:?}", mdhd); } BoxType::HandlerBox => { - let hdlr = try!(read_hdlr(&mut b)); + let hdlr = read_hdlr(&mut b)?; match hdlr.handler_type { 0x76696465 /* 'vide' */ => track.track_type = TrackType::Video, 0x736f756e /* 'soun' */ => track.track_type = TrackType::Audio, @@ -776,8 +776,8 @@ fn read_mdia(f: &mut BMFFBox, track: &mut Track) -> Result<()> { } log!("{:?}", hdlr); } - BoxType::MediaInformationBox => try!(read_minf(&mut b, track)), - _ => try!(skip_box_content(&mut b)), + BoxType::MediaInformationBox => read_minf(&mut b, track)?, + _ => skip_box_content(&mut b)?, }; check_parser_state!(b.content); } @@ -786,10 +786,10 @@ fn read_mdia(f: &mut BMFFBox, track: &mut Track) -> Result<()> { fn read_minf(f: &mut BMFFBox, track: &mut Track) -> Result<()> { let mut iter = f.box_iter(); - while let Some(mut b) = try!(iter.next_box()) { + while let Some(mut b) = iter.next_box()? { match b.head.name { - BoxType::SampleTableBox => try!(read_stbl(&mut b, track)), - _ => try!(skip_box_content(&mut b)), + BoxType::SampleTableBox => read_stbl(&mut b, track)?, + _ => skip_box_content(&mut b)?, }; check_parser_state!(b.content); } @@ -798,40 +798,40 @@ fn read_minf(f: &mut BMFFBox, track: &mut Track) -> Result<()> { fn read_stbl(f: &mut BMFFBox, track: &mut Track) -> Result<()> { let mut iter = f.box_iter(); - while let Some(mut b) = try!(iter.next_box()) { + while let Some(mut b) = iter.next_box()? { match b.head.name { BoxType::SampleDescriptionBox => { - let stsd = try!(read_stsd(&mut b, track)); + let stsd = read_stsd(&mut b, track)?; log!("{:?}", stsd); } BoxType::TimeToSampleBox => { - let stts = try!(read_stts(&mut b)); + let stts = read_stts(&mut b)?; track.empty_sample_boxes.empty_stts = stts.samples.is_empty(); log!("{:?}", stts); } BoxType::SampleToChunkBox => { - let stsc = try!(read_stsc(&mut b)); + let stsc = read_stsc(&mut b)?; track.empty_sample_boxes.empty_stsc = stsc.samples.is_empty(); log!("{:?}", stsc); } BoxType::SampleSizeBox => { - let stsz = try!(read_stsz(&mut b)); + let stsz = read_stsz(&mut b)?; log!("{:?}", stsz); } BoxType::ChunkOffsetBox => { - let stco = try!(read_stco(&mut b)); + let stco = read_stco(&mut b)?; track.empty_sample_boxes.empty_stco = stco.offsets.is_empty(); log!("{:?}", stco); } BoxType::ChunkLargeOffsetBox => { - let co64 = try!(read_co64(&mut b)); + let co64 = read_co64(&mut b)?; log!("{:?}", co64); } BoxType::SyncSampleBox => { - let stss = try!(read_stss(&mut b)); + let stss = read_stss(&mut b)?; log!("{:?}", stss); } - _ => try!(skip_box_content(&mut b)), + _ => skip_box_content(&mut b)?, }; check_parser_state!(b.content); } @@ -840,8 +840,8 @@ fn read_stbl(f: &mut BMFFBox, track: &mut Track) -> Result<()> { /// Parse an ftyp box. fn read_ftyp(src: &mut BMFFBox) -> Result { - let major = try!(be_u32(src)); - let minor = try!(be_u32(src)); + let major = be_u32(src)?; + let minor = be_u32(src)?; let bytes_left = src.bytes_left(); if bytes_left % 4 != 0 { return Err(Error::InvalidData("invalid ftyp size")); @@ -850,7 +850,7 @@ fn read_ftyp(src: &mut BMFFBox) -> Result { let brand_count = bytes_left / 4; let mut brands = Vec::new(); for _ in 0..brand_count { - brands.push(try!(be_u32(src))); + brands.push(be_u32(src)?); } Ok(FileTypeBox { major_brand: major, @@ -861,23 +861,23 @@ fn read_ftyp(src: &mut BMFFBox) -> Result { /// Parse an mvhd box. fn read_mvhd(src: &mut BMFFBox) -> Result { - let (version, _) = try!(read_fullbox_extra(src)); + let (version, _) = read_fullbox_extra(src)?; match version { // 64 bit creation and modification times. 1 => { - try!(skip(src, 16)); + skip(src, 16)?; } // 32 bit creation and modification times. 0 => { - try!(skip(src, 8)); + skip(src, 8)?; } _ => return Err(Error::InvalidData("unhandled mvhd version")), } - let timescale = try!(be_u32(src)); + let timescale = be_u32(src)?; let duration = match version { - 1 => try!(be_u64(src)), + 1 => be_u64(src)?, 0 => { - let d = try!(be_u32(src)); + let d = be_u32(src)?; if d == std::u32::MAX { std::u64::MAX } else { @@ -887,7 +887,7 @@ fn read_mvhd(src: &mut BMFFBox) -> Result { _ => return Err(Error::InvalidData("unhandled mvhd version")), }; // Skip remaining fields. - try!(skip(src, 80)); + skip(src, 80)?; Ok(MovieHeaderBox { timescale: timescale, duration: duration, @@ -896,30 +896,30 @@ fn read_mvhd(src: &mut BMFFBox) -> Result { /// Parse a tkhd box. fn read_tkhd(src: &mut BMFFBox) -> Result { - let (version, flags) = try!(read_fullbox_extra(src)); + let (version, flags) = read_fullbox_extra(src)?; let disabled = flags & 0x1u32 == 0 || flags & 0x2u32 == 0; match version { // 64 bit creation and modification times. 1 => { - try!(skip(src, 16)); + skip(src, 16)?; } // 32 bit creation and modification times. 0 => { - try!(skip(src, 8)); + skip(src, 8)?; } _ => return Err(Error::InvalidData("unhandled tkhd version")), } - let track_id = try!(be_u32(src)); - try!(skip(src, 4)); + let track_id = be_u32(src)?; + skip(src, 4)?; let duration = match version { - 1 => try!(be_u64(src)), - 0 => try!(be_u32(src)) as u64, + 1 => be_u64(src)?, + 0 => be_u32(src)? as u64, _ => return Err(Error::InvalidData("unhandled tkhd version")), }; // Skip uninteresting fields. - try!(skip(src, 52)); - let width = try!(be_u32(src)); - let height = try!(be_u32(src)); + skip(src, 52)?; + let width = be_u32(src)?; + let height = be_u32(src)?; Ok(TrackHeaderBox { track_id: track_id, disabled: disabled, @@ -931,8 +931,8 @@ fn read_tkhd(src: &mut BMFFBox) -> Result { /// Parse a elst box. fn read_elst(src: &mut BMFFBox) -> Result { - let (version, _) = try!(read_fullbox_extra(src)); - let edit_count = try!(be_u32(src)); + let (version, _) = read_fullbox_extra(src)?; + let edit_count = be_u32(src)?; if edit_count == 0 { return Err(Error::InvalidData("invalid edit count")); } @@ -941,16 +941,16 @@ fn read_elst(src: &mut BMFFBox) -> Result { let (segment_duration, media_time) = match version { 1 => { // 64 bit segment duration and media times. - (try!(be_u64(src)), try!(be_i64(src))) + (be_u64(src)?, be_i64(src)?) } 0 => { // 32 bit segment duration and media times. - (try!(be_u32(src)) as u64, try!(be_i32(src)) as i64) + (be_u32(src)? as u64, be_i32(src)? as i64) } _ => return Err(Error::InvalidData("unhandled elst version")), }; - let media_rate_integer = try!(be_i16(src)); - let media_rate_fraction = try!(be_i16(src)); + let media_rate_integer = be_i16(src)?; + let media_rate_fraction = be_i16(src)?; edits.push(Edit { segment_duration: segment_duration, media_time: media_time, @@ -966,26 +966,26 @@ fn read_elst(src: &mut BMFFBox) -> Result { /// Parse a mdhd box. fn read_mdhd(src: &mut BMFFBox) -> Result { - let (version, _) = try!(read_fullbox_extra(src)); + let (version, _) = read_fullbox_extra(src)?; let (timescale, duration) = match version { 1 => { // Skip 64-bit creation and modification times. - try!(skip(src, 16)); + skip(src, 16)?; // 64 bit duration. - (try!(be_u32(src)), try!(be_u64(src))) + (be_u32(src)?, be_u64(src)?) } 0 => { // Skip 32-bit creation and modification times. - try!(skip(src, 8)); + skip(src, 8)?; // 32 bit duration. - let timescale = try!(be_u32(src)); + let timescale = be_u32(src)?; let duration = { // Since we convert the 32-bit duration to 64-bit by // upcasting, we need to preserve the special all-1s // ("unknown") case by hand. - let d = try!(be_u32(src)); + let d = be_u32(src)?; if d == std::u32::MAX { std::u64::MAX } else { @@ -998,7 +998,7 @@ fn read_mdhd(src: &mut BMFFBox) -> Result { }; // Skip uninteresting fields. - try!(skip(src, 4)); + skip(src, 4)?; Ok(MediaHeaderBox { timescale: timescale, @@ -1008,15 +1008,15 @@ fn read_mdhd(src: &mut BMFFBox) -> Result { /// Parse a stco box. fn read_stco(src: &mut BMFFBox) -> Result { - let (_, _) = try!(read_fullbox_extra(src)); - let offset_count = try!(be_u32(src)); + let (_, _) = read_fullbox_extra(src)?; + let offset_count = be_u32(src)?; let mut offsets = Vec::new(); for _ in 0..offset_count { - offsets.push(try!(be_u32(src)) as u64); + offsets.push(be_u32(src)? as u64); } // Padding could be added in some contents. - try!(skip_box_remain(src)); + skip_box_remain(src)?; Ok(ChunkOffsetBox { offsets: offsets, @@ -1025,15 +1025,15 @@ fn read_stco(src: &mut BMFFBox) -> Result { /// Parse a co64 box. fn read_co64(src: &mut BMFFBox) -> Result { - let (_, _) = try!(read_fullbox_extra(src)); - let offset_count = try!(be_u32(src)); + let (_, _) = read_fullbox_extra(src)?; + let offset_count = be_u32(src)?; let mut offsets = Vec::new(); for _ in 0..offset_count { - offsets.push(try!(be_u64(src))); + offsets.push(be_u64(src)?); } // Padding could be added in some contents. - try!(skip_box_remain(src)); + skip_box_remain(src)?; Ok(ChunkOffsetBox { offsets: offsets, @@ -1042,15 +1042,15 @@ fn read_co64(src: &mut BMFFBox) -> Result { /// Parse a stss box. fn read_stss(src: &mut BMFFBox) -> Result { - let (_, _) = try!(read_fullbox_extra(src)); - let sample_count = try!(be_u32(src)); + let (_, _) = read_fullbox_extra(src)?; + let sample_count = be_u32(src)?; let mut samples = Vec::new(); for _ in 0..sample_count { - samples.push(try!(be_u32(src))); + samples.push(be_u32(src)?); } // Padding could be added in some contents. - try!(skip_box_remain(src)); + skip_box_remain(src)?; Ok(SyncSampleBox { samples: samples, @@ -1059,13 +1059,13 @@ fn read_stss(src: &mut BMFFBox) -> Result { /// Parse a stsc box. fn read_stsc(src: &mut BMFFBox) -> Result { - let (_, _) = try!(read_fullbox_extra(src)); - let sample_count = try!(be_u32(src)); + let (_, _) = read_fullbox_extra(src)?; + let sample_count = be_u32(src)?; let mut samples = Vec::new(); for _ in 0..sample_count { - let first_chunk = try!(be_u32(src)); - let samples_per_chunk = try!(be_u32(src)); - let sample_description_index = try!(be_u32(src)); + let first_chunk = be_u32(src)?; + let samples_per_chunk = be_u32(src)?; + let sample_description_index = be_u32(src)?; samples.push(SampleToChunk { first_chunk: first_chunk, samples_per_chunk: samples_per_chunk, @@ -1074,7 +1074,7 @@ fn read_stsc(src: &mut BMFFBox) -> Result { } // Padding could be added in some contents. - try!(skip_box_remain(src)); + skip_box_remain(src)?; Ok(SampleToChunkBox { samples: samples, @@ -1083,18 +1083,18 @@ fn read_stsc(src: &mut BMFFBox) -> Result { /// Parse a stsz box. fn read_stsz(src: &mut BMFFBox) -> Result { - let (_, _) = try!(read_fullbox_extra(src)); - let sample_size = try!(be_u32(src)); - let sample_count = try!(be_u32(src)); + let (_, _) = read_fullbox_extra(src)?; + let sample_size = be_u32(src)?; + let sample_count = be_u32(src)?; let mut sample_sizes = Vec::new(); if sample_size == 0 { for _ in 0..sample_count { - sample_sizes.push(try!(be_u32(src))); + sample_sizes.push(be_u32(src)?); } } // Padding could be added in some contents. - try!(skip_box_remain(src)); + skip_box_remain(src)?; Ok(SampleSizeBox { sample_size: sample_size, @@ -1104,12 +1104,12 @@ fn read_stsz(src: &mut BMFFBox) -> Result { /// Parse a stts box. fn read_stts(src: &mut BMFFBox) -> Result { - let (_, _) = try!(read_fullbox_extra(src)); - let sample_count = try!(be_u32(src)); + let (_, _) = read_fullbox_extra(src)?; + let sample_count = be_u32(src)?; let mut samples = Vec::new(); for _ in 0..sample_count { - let sample_count = try!(be_u32(src)); - let sample_delta = try!(be_u32(src)); + let sample_count = be_u32(src)?; + let sample_delta = be_u32(src)?; samples.push(Sample { sample_count: sample_count, sample_delta: sample_delta, @@ -1117,7 +1117,7 @@ fn read_stts(src: &mut BMFFBox) -> Result { } // Padding could be added in some contents. - try!(skip_box_remain(src)); + skip_box_remain(src)?; Ok(TimeToSampleBox { samples: samples, @@ -1126,24 +1126,24 @@ fn read_stts(src: &mut BMFFBox) -> Result { /// Parse a VPx Config Box. fn read_vpcc(src: &mut BMFFBox) -> Result { - let (version, _) = try!(read_fullbox_extra(src)); + let (version, _) = read_fullbox_extra(src)?; if version != 0 { return Err(Error::Unsupported("unknown vpcC version")); } - let profile = try!(src.read_u8()); - let level = try!(src.read_u8()); + let profile = src.read_u8()?; + let level = src.read_u8()?; let (bit_depth, color_space) = { - let byte = try!(src.read_u8()); + let byte = src.read_u8()?; ((byte >> 4) & 0x0f, byte & 0x0f) }; let (chroma_subsampling, transfer_function, video_full_range) = { - let byte = try!(src.read_u8()); + let byte = src.read_u8()?; ((byte >> 4) & 0x0f, (byte >> 1) & 0x07, (byte & 1) == 1) }; - let codec_init_size = try!(be_u16(src)); - let codec_init = try!(read_buf(src, codec_init_size as usize)); + let codec_init_size = be_u16(src)?; + let codec_init = read_buf(src, codec_init_size as usize)?; // TODO(rillian): validate field value ranges. Ok(VPxConfigBox { @@ -1159,148 +1159,160 @@ fn read_vpcc(src: &mut BMFFBox) -> Result { } fn read_flac_metadata(src: &mut BMFFBox) -> Result { - let temp = try!(src.read_u8()); + let temp = src.read_u8()?; let block_type = temp & 0x7f; - let length = try!(be_u24(src)); + let length = be_u24(src)?; if length as usize > src.bytes_left() { return Err(Error::InvalidData( "FLACMetadataBlock larger than parent box")); } - let data = try!(read_buf(src, length as usize)); + let data = read_buf(src, length as usize)?; Ok(FLACMetadataBlock { block_type: block_type, data: data, }) } -fn read_esds(src: &mut BMFFBox) -> Result { +fn find_descriptor(data: &[u8], esds: &mut ES_Descriptor) -> Result<()> { // Tags for elementary stream description const ESDESCR_TAG: u8 = 0x03; const DECODER_CONFIG_TAG: u8 = 0x04; const DECODER_SPECIFIC_TAG: u8 = 0x05; + let mut remains = data; + + while !remains.is_empty() { + let des = &mut Cursor::new(remains); + let tag = des.read_u8()?; + + let extend_or_len = des.read_u8()?; + // extension tag start from 0x80. + let end = if extend_or_len >= 0x80 { + // Extension found, skip remaining extension. + skip(des, 2)?; + des.read_u8()? as u64 + des.position() + } else { + extend_or_len as u64 + des.position() + }; + + if end as usize > remains.len() { + return Err(Error::InvalidData("Invalid descriptor.")); + } + + let descriptor = &remains[des.position() as usize .. end as usize]; + + match tag { + ESDESCR_TAG => { + read_es_descriptor(descriptor, esds)?; + }, + DECODER_CONFIG_TAG => { + read_dc_descriptor(descriptor, esds)?; + }, + DECODER_SPECIFIC_TAG => { + read_ds_descriptor(descriptor, esds)?; + }, + _ => { + log!("Unsupported descriptor, tag {}", tag); + }, + } + + remains = &remains[end as usize .. remains.len()]; + } + + Ok(()) +} + +fn read_ds_descriptor(data: &[u8], esds: &mut ES_Descriptor) -> Result<()> { let frequency_table = vec![(0x1, 96000), (0x1, 88200), (0x2, 64000), (0x3, 48000), (0x4, 44100), (0x5, 32000), (0x6, 24000), (0x7, 22050), (0x8, 16000), (0x9, 12000), (0xa, 11025), (0xb, 8000), (0xc, 7350)]; - let (_, _) = try!(read_fullbox_extra(src)); + let des = &mut Cursor::new(data); - let esds_size = src.head.size - src.head.offset - 4; - if esds_size > BUF_SIZE_LIMIT { - return Err(Error::InvalidData("esds box exceeds BUF_SIZE_LIMIT")); + let audio_specific_config = be_u16(des)?; + + let sample_index = (audio_specific_config & 0x07FF) >> 7; + + let channel_counts = (audio_specific_config & 0x007F) >> 3; + + let sample_frequency = + frequency_table.iter().find(|item| item.0 == sample_index).map(|x| x.1); + + esds.audio_sample_rate = sample_frequency; + esds.audio_channel_count = Some(channel_counts); + + Ok(()) +} + +fn read_dc_descriptor(data: &[u8], esds: &mut ES_Descriptor) -> Result<()> { + let des = &mut Cursor::new(data); + let object_profile = des.read_u8()?; + + // Skip uninteresting fields. + skip(des, 12)?; + + if data.len() > des.position() as usize { + find_descriptor(&data[des.position() as usize .. data.len()], esds)?; } - let esds_array = try!(read_buf(src, esds_size as usize)); - // Parsing DecoderConfig descriptor to get the object_profile_indicator - // for correct codec type, audio sample rate and channel counts. - let (object_profile_indicator, sample_frequency, channels) = { - let mut object_profile: u8 = 0; - let mut sample_frequency = None; - let mut channels = None; - - // clone a esds cursor for parsing. - let esds = &mut Cursor::new(&esds_array); - let next_tag = try!(esds.read_u8()); - - if next_tag != ESDESCR_TAG { - return Err(Error::Unsupported("fail to parse ES descriptor")); - } - - let esds_extend = try!(esds.read_u8()); - // extension tag start from 0x80. - let esds_end = if esds_extend >= 0x80 { - // skip remaining extension. - try!(skip(esds, 2)); - esds.position() + try!(esds.read_u8()) as u64 - } else { - esds.position() + esds_extend as u64 - }; - try!(skip(esds, 2)); - - let esds_flags = try!(esds.read_u8()); - - // Stream dependency flag, first bit from left most. - if esds_flags & 0x80 > 0 { - // Skip uninteresting fields. - try!(skip(esds, 2)); - } - - // Url flag, second bit from left most. - if esds_flags & 0x40 > 0 { - // Skip uninteresting fields. - let skip_es_len: usize = try!(esds.read_u8()) as usize + 2; - try!(skip(esds, skip_es_len)); - } - - // find DecoderConfig descriptor (tag = DECODER_CONFIG_TAG) - if esds_end > esds.position() { - let next_tag = try!(esds.read_u8()); - if next_tag == DECODER_CONFIG_TAG { - let dcds_extend = try!(esds.read_u8()); - // extension tag start from 0x80. - if dcds_extend >= 0x80 { - // skip remains extension and length. - try!(skip(esds, 3)); - } - - object_profile = try!(esds.read_u8()); - - // Skip uninteresting fields. - try!(skip(esds, 12)); - } - } - - - // find DecoderSpecific descriptor (tag = DECODER_SPECIFIC_TAG) - if esds_end > esds.position() { - let next_tag = try!(esds.read_u8()); - if next_tag == DECODER_SPECIFIC_TAG { - let dsds_extend = try!(esds.read_u8()); - // extension tag start from 0x80. - if dsds_extend >= 0x80 { - // skip remains extension and length. - try!(skip(esds, 3)); - } - - let audio_specific_config = try!(be_u16(esds)); - - let sample_index = (audio_specific_config & 0x07FF) >> 7; - - let channel_counts = (audio_specific_config & 0x007F) >> 3; - - sample_frequency = - frequency_table.iter().find(|item| item.0 == sample_index).map(|x| x.1); - - channels = Some(channel_counts); - } - } - - (object_profile, sample_frequency, channels) - }; - - let codec = match object_profile_indicator { + esds.audio_codec = match object_profile { 0x40 | 0x41 => CodecType::AAC, 0x6B => CodecType::MP3, _ => CodecType::Unknown, }; - if codec == CodecType::Unknown { - return Err(Error::Unsupported("unknown audio codec")); + Ok(()) +} + +fn read_es_descriptor(data: &[u8], esds: &mut ES_Descriptor) -> Result<()> { + let des = &mut Cursor::new(data); + + skip(des, 2)?; + + let esds_flags = des.read_u8()?; + + // Stream dependency flag, first bit from left most. + if esds_flags & 0x80 > 0 { + // Skip uninteresting fields. + skip(des, 2)?; } - Ok(ES_Descriptor { - audio_codec: codec, - audio_sample_rate: sample_frequency, - audio_channel_count: channels, - codec_specific_config: esds_array, - }) + // Url flag, second bit from left most. + if esds_flags & 0x40 > 0 { + // Skip uninteresting fields. + let skip_es_len: usize = des.read_u8()? as usize + 2; + skip(des, skip_es_len)?; + } + + if data.len() > des.position() as usize { + find_descriptor(&data[des.position() as usize .. data.len()], esds)?; + } + + Ok(()) +} + +fn read_esds(src: &mut BMFFBox) -> Result { + let (_, _) = read_fullbox_extra(src)?; + + let esds_size = src.head.size - src.head.offset - 4; + if esds_size > BUF_SIZE_LIMIT { + return Err(Error::InvalidData("esds box exceeds BUF_SIZE_LIMIT")); + } + let esds_array = read_buf(src, esds_size as usize)?; + + let mut es_data = ES_Descriptor::default(); + find_descriptor(&esds_array, &mut es_data)?; + + es_data.codec_esds = esds_array; + + Ok(es_data) } /// Parse `FLACSpecificBox`. fn read_dfla(src: &mut BMFFBox) -> Result { - let (version, flags) = try!(read_fullbox_extra(src)); + let (version, flags) = read_fullbox_extra(src)?; if version != 0 { return Err(Error::Unsupported("unknown dfLa (FLAC) version")); } @@ -1309,7 +1321,7 @@ fn read_dfla(src: &mut BMFFBox) -> Result { } let mut blocks = Vec::new(); while src.bytes_left() > 0 { - let block = try!(read_flac_metadata(src)); + let block = read_flac_metadata(src)?; blocks.push(block); } // The box must have at least one meta block, and the first block @@ -1332,23 +1344,23 @@ fn read_dfla(src: &mut BMFFBox) -> Result { /// Parse `OpusSpecificBox`. fn read_dops(src: &mut BMFFBox) -> Result { - let version = try!(src.read_u8()); + let version = src.read_u8()?; if version != 0 { return Err(Error::Unsupported("unknown dOps (Opus) version")); } - let output_channel_count = try!(src.read_u8()); - let pre_skip = try!(be_u16(src)); - let input_sample_rate = try!(be_u32(src)); - let output_gain = try!(be_i16(src)); - let channel_mapping_family = try!(src.read_u8()); + let output_channel_count = src.read_u8()?; + let pre_skip = be_u16(src)?; + let input_sample_rate = be_u32(src)?; + let output_gain = be_i16(src)?; + let channel_mapping_family = src.read_u8()?; let channel_mapping_table = if channel_mapping_family == 0 { None } else { - let stream_count = try!(src.read_u8()); - let coupled_count = try!(src.read_u8()); - let channel_mapping = try!(read_buf(src, output_channel_count as usize)); + let stream_count = src.read_u8()?; + let coupled_count = src.read_u8()?; + let channel_mapping = read_buf(src, output_channel_count as usize)?; Some(ChannelMappingTable { stream_count: stream_count, @@ -1388,17 +1400,17 @@ pub fn serialize_opus_header(opus: // it is 1. While decoders generally accept zero as well, write // out the version of the header we're supporting rather than // whatever we parsed out of mp4. - try!(dst.write_u8(1)); - try!(dst.write_u8(opus.output_channel_count)); - try!(dst.write_u16::(opus.pre_skip)); - try!(dst.write_u32::(opus.input_sample_rate)); - try!(dst.write_i16::(opus.output_gain)); - try!(dst.write_u8(opus.channel_mapping_family)); + dst.write_u8(1)?; + dst.write_u8(opus.output_channel_count)?; + dst.write_u16::(opus.pre_skip)?; + dst.write_u32::(opus.input_sample_rate)?; + dst.write_i16::(opus.output_gain)?; + dst.write_u8(opus.channel_mapping_family)?; match opus.channel_mapping_table { None => {} Some(ref table) => { - try!(dst.write_u8(table.stream_count)); - try!(dst.write_u8(table.coupled_count)); + dst.write_u8(table.stream_count)?; + dst.write_u8(table.coupled_count)?; match dst.write(&table.channel_mapping) { Err(e) => return Err(Error::from(e)), Ok(bytes) => { @@ -1414,18 +1426,18 @@ pub fn serialize_opus_header(opus: /// Parse a hdlr box. fn read_hdlr(src: &mut BMFFBox) -> Result { - let (_, _) = try!(read_fullbox_extra(src)); + let (_, _) = read_fullbox_extra(src)?; // Skip uninteresting fields. - try!(skip(src, 4)); + skip(src, 4)?; - let handler_type = try!(be_u32(src)); + let handler_type = be_u32(src)?; // Skip uninteresting fields. - try!(skip(src, 12)); + skip(src, 12)?; let bytes_left = src.bytes_left(); - let _name = try!(read_null_terminated_string(src, bytes_left)); + let _name = read_null_terminated_string(src, bytes_left)?; Ok(HandlerBox { handler_type: handler_type, @@ -1444,28 +1456,28 @@ fn read_video_sample_entry(src: &mut BMFFBox, track: &mut Track) -> }; // Skip uninteresting fields. - try!(skip(src, 6)); + skip(src, 6)?; - let data_reference_index = try!(be_u16(src)); + let data_reference_index = be_u16(src)?; // Skip uninteresting fields. - try!(skip(src, 16)); + skip(src, 16)?; - let width = try!(be_u16(src)); - let height = try!(be_u16(src)); + let width = be_u16(src)?; + let height = be_u16(src)?; // Skip uninteresting fields. - try!(skip(src, 14)); + skip(src, 14)?; - let _compressorname = try!(read_fixed_length_pascal_string(src, 32)); + let _compressorname = read_fixed_length_pascal_string(src, 32)?; // Skip uninteresting fields. - try!(skip(src, 4)); + skip(src, 4)?; // Skip clap/pasp/etc. for now. let mut codec_specific = None; let mut iter = src.box_iter(); - while let Some(mut b) = try!(iter.next_box()) { + while let Some(mut b) = iter.next_box()? { match b.head.name { BoxType::AVCConfigurationBox => { if (name != BoxType::AVCSampleEntry && @@ -1478,7 +1490,7 @@ fn read_video_sample_entry(src: &mut BMFFBox, track: &mut Track) -> if avcc_size > BUF_SIZE_LIMIT { return Err(Error::InvalidData("avcC box exceeds BUF_SIZE_LIMIT")); } - let avcc = try!(read_buf(&mut b.content, avcc_size as usize)); + let avcc = read_buf(&mut b.content, avcc_size as usize)?; // TODO(kinetik): Parse avcC box? For now we just stash the data. codec_specific = Some(VideoCodecSpecific::AVCConfig(avcc)); } @@ -1488,10 +1500,10 @@ fn read_video_sample_entry(src: &mut BMFFBox, track: &mut Track) -> codec_specific.is_some() { return Err(Error::InvalidData("malformed video sample entry")); } - let vpcc = try!(read_vpcc(&mut b)); + let vpcc = read_vpcc(&mut b)?; codec_specific = Some(VideoCodecSpecific::VPxConfig(vpcc)); } - _ => try!(skip_box_content(&mut b)), + _ => skip_box_content(&mut b)?, } check_parser_state!(b.content); } @@ -1509,13 +1521,13 @@ fn read_video_sample_entry(src: &mut BMFFBox, track: &mut Track) -> fn read_qt_wave_atom(src: &mut BMFFBox) -> Result { let mut codec_specific = None; let mut iter = src.box_iter(); - while let Some(mut b) = try!(iter.next_box()) { + while let Some(mut b) = iter.next_box()? { match b.head.name { BoxType::ESDBox => { - let esds = try!(read_esds(&mut b)); + let esds = read_esds(&mut b)?; codec_specific = Some(esds); }, - _ => try!(skip_box_content(&mut b)), + _ => skip_box_content(&mut b)?, } } @@ -1535,33 +1547,33 @@ fn read_audio_sample_entry(src: &mut BMFFBox, track: &mut Track) -> }; // Skip uninteresting fields. - try!(skip(src, 6)); + skip(src, 6)?; - let data_reference_index = try!(be_u16(src)); + let data_reference_index = be_u16(src)?; // XXX(kinetik): This is "reserved" in BMFF, but some old QT MOV variant // uses it, need to work out if we have to support it. Without checking // here and reading extra fields after samplerate (or bailing with an // error), the parser loses sync completely. - let version = try!(be_u16(src)); + let version = be_u16(src)?; // Skip uninteresting fields. - try!(skip(src, 6)); + skip(src, 6)?; - let channelcount = try!(be_u16(src)); - let samplesize = try!(be_u16(src)); + let channelcount = be_u16(src)?; + let samplesize = be_u16(src)?; // Skip uninteresting fields. - try!(skip(src, 4)); + skip(src, 4)?; - let samplerate = try!(be_u32(src)); + let samplerate = be_u32(src)?; match version { 0 => (), 1 => { // Quicktime sound sample description version 1. // Skip uninteresting fields. - try!(skip(src, 16)); + skip(src, 16)?; }, _ => return Err(Error::Unsupported("unsupported non-isom audio sample entry")), } @@ -1569,7 +1581,7 @@ fn read_audio_sample_entry(src: &mut BMFFBox, track: &mut Track) -> // Skip chan/etc. for now. let mut codec_specific = None; let mut iter = src.box_iter(); - while let Some(mut b) = try!(iter.next_box()) { + while let Some(mut b) = iter.next_box()? { match b.head.name { BoxType::ESDBox => { if (name != BoxType::MP4AudioSampleEntry && @@ -1578,7 +1590,7 @@ fn read_audio_sample_entry(src: &mut BMFFBox, track: &mut Track) -> return Err(Error::InvalidData("malformed audio sample entry")); } - let esds = try!(read_esds(&mut b)); + let esds = read_esds(&mut b)?; track.codec_type = esds.audio_codec; codec_specific = Some(AudioCodecSpecific::ES_Descriptor(esds)); } @@ -1587,7 +1599,7 @@ fn read_audio_sample_entry(src: &mut BMFFBox, track: &mut Track) -> codec_specific.is_some() { return Err(Error::InvalidData("malformed audio sample entry")); } - let dfla = try!(read_dfla(&mut b)); + let dfla = read_dfla(&mut b)?; track.codec_type = CodecType::FLAC; codec_specific = Some(AudioCodecSpecific::FLACSpecificBox(dfla)); } @@ -1596,16 +1608,16 @@ fn read_audio_sample_entry(src: &mut BMFFBox, track: &mut Track) -> codec_specific.is_some() { return Err(Error::InvalidData("malformed audio sample entry")); } - let dops = try!(read_dops(&mut b)); + let dops = read_dops(&mut b)?; track.codec_type = CodecType::Opus; codec_specific = Some(AudioCodecSpecific::OpusSpecificBox(dops)); } BoxType::QTWaveAtom => { - let qt_esds = try!(read_qt_wave_atom(&mut b)); + let qt_esds = read_qt_wave_atom(&mut b)?; track.codec_type = qt_esds.audio_codec; codec_specific = Some(AudioCodecSpecific::ES_Descriptor(qt_esds)); } - _ => try!(skip_box_content(&mut b)), + _ => skip_box_content(&mut b)?, } check_parser_state!(b.content); } @@ -1623,15 +1635,15 @@ fn read_audio_sample_entry(src: &mut BMFFBox, track: &mut Track) -> /// Parse a stsd box. fn read_stsd(src: &mut BMFFBox, track: &mut Track) -> Result { - let (_, _) = try!(read_fullbox_extra(src)); + let (_, _) = read_fullbox_extra(src)?; - let description_count = try!(be_u32(src)); + let description_count = be_u32(src)?; let mut descriptions = Vec::new(); { // TODO(kinetik): check if/when more than one desc per track? do we need to support? let mut iter = src.box_iter(); - while let Some(mut b) = try!(iter.next_box()) { + while let Some(mut b) = iter.next_box()? { let description = match track.track_type { TrackType::Video => read_video_sample_entry(&mut b, track), TrackType::Audio => read_audio_sample_entry(&mut b, track), @@ -1644,7 +1656,7 @@ fn read_stsd(src: &mut BMFFBox, track: &mut Track) -> Result return Err(e), @@ -1663,7 +1675,7 @@ fn read_stsd(src: &mut BMFFBox, track: &mut Track) -> Result(src: &mut T, mut bytes: usize) -> Result<()> { let mut buf = vec![0; BUF_SIZE]; while bytes > 0 { let buf_size = cmp::min(bytes, BUF_SIZE); - let len = try!(src.take(buf_size as u64).read(&mut buf)); + let len = src.take(buf_size as u64).read(&mut buf)?; if len == 0 { return Err(Error::UnexpectedEOF); } @@ -1688,7 +1700,7 @@ fn skip(src: &mut T, mut bytes: usize) -> Result<()> { /// Read size bytes into a Vector or return error. fn read_buf(src: &mut T, size: usize) -> Result> { let mut buf = vec![0; size]; - let r = try!(src.read(&mut buf)); + let r = src.read(&mut buf)?; if r != size { return Err(Error::InvalidData("failed buffer read")); } @@ -1703,7 +1715,7 @@ fn read_buf(src: &mut T, size: usize) -> Result> { fn read_null_terminated_string(src: &mut T, mut size: usize) -> Result { let mut buf = Vec::new(); while size > 0 { - let c = try!(src.read_u8()); + let c = src.read_u8()?; if c == 0 { break; } @@ -1715,8 +1727,8 @@ fn read_null_terminated_string(src: &mut T, mut size: usize) -> #[allow(dead_code)] fn read_pascal_string(src: &mut T) -> Result { - let len = try!(src.read_u8()); - let buf = try!(read_buf(src, len as usize)); + let len = src.read_u8()?; + let buf = read_buf(src, len as usize)?; String::from_utf8(buf).map_err(From::from) } @@ -1724,9 +1736,9 @@ fn read_pascal_string(src: &mut T) -> Result { // contains padding if the string doesn't fill the buffer. fn read_fixed_length_pascal_string(src: &mut T, size: usize) -> Result { assert!(size > 0); - let len = cmp::min(try!(src.read_u8()) as usize, size - 1); - let buf = try!(read_buf(src, len)); - try!(skip(src, size - 1 - buf.len())); + let len = cmp::min(src.read_u8()? as usize, size - 1); + let buf = read_buf(src, len)?; + skip(src, size - 1 - buf.len())?; String::from_utf8(buf).map_err(From::from) } diff --git a/media/libstagefright/binding/mp4parse/src/tests.rs b/media/libstagefright/binding/mp4parse/src/tests.rs index 7063b37906bc..a3fa6b2fee47 100644 --- a/media/libstagefright/binding/mp4parse/src/tests.rs +++ b/media/libstagefright/binding/mp4parse/src/tests.rs @@ -148,8 +148,8 @@ fn read_truncated_ftyp() { let mut context = MediaContext::new(); match read_mp4(&mut stream, &mut context) { Err(Error::UnexpectedEOF) => (), - Ok(_) => assert!(false, "expected an error result"), - _ => assert!(false, "expected a different error result"), + Ok(_) => panic!("expected an error result"), + _ => panic!("expected a different error result"), } } @@ -593,8 +593,8 @@ fn serialize_opus_header() { }; let mut v = Vec::::new(); super::serialize_opus_header(&opus, &mut v).unwrap(); - assert!(v.len() == 19); - assert!(v == vec![ + assert_eq!(v.len(), 19); + assert_eq!(v, vec![ 0x4f, 0x70, 0x75, 0x73, 0x48,0x65, 0x61, 0x64, 0x01, 0x01, 0x56, 0x01, 0xc0, 0x5d, 0x00, 0x00, @@ -615,8 +615,8 @@ fn serialize_opus_header() { }; let mut v = Vec::::new(); super::serialize_opus_header(&opus, &mut v).unwrap(); - assert!(v.len() == 27); - assert!(v == vec![ + assert_eq!(v.len(), 27); + assert_eq!(v, vec![ 0x4f, 0x70, 0x75, 0x73, 0x48,0x65, 0x61, 0x64, 0x01, 0x06, 0x98, 0x00, 0x80, 0xbb, 0x00, 0x00, @@ -645,8 +645,8 @@ fn avcc_limit() { let mut track = super::Track::new(0); match super::read_video_sample_entry(&mut stream, &mut track) { Err(Error::InvalidData(s)) => assert_eq!(s, "avcC box exceeds BUF_SIZE_LIMIT"), - Ok(_) => assert!(false, "expected an error result"), - _ => assert!(false, "expected a different error result"), + Ok(_) => panic!("expected an error result"), + _ => panic!("expected a different error result"), } } @@ -671,8 +671,8 @@ fn esds_limit() { let mut track = super::Track::new(0); match super::read_audio_sample_entry(&mut stream, &mut track) { Err(Error::InvalidData(s)) => assert_eq!(s, "esds box exceeds BUF_SIZE_LIMIT"), - Ok(_) => assert!(false, "expected an error result"), - _ => assert!(false, "expected a different error result"), + Ok(_) => panic!("expected an error result"), + _ => panic!("expected a different error result"), } } @@ -697,8 +697,8 @@ fn esds_limit_2() { let mut track = super::Track::new(0); match super::read_audio_sample_entry(&mut stream, &mut track) { Err(Error::UnexpectedEOF) => (), - Ok(_) => assert!(false, "expected an error result"), - _ => assert!(false, "expected a different error result"), + Ok(_) => panic!("expected an error result"), + _ => panic!("expected a different error result"), } } @@ -713,8 +713,8 @@ fn read_elst_zero_entries() { let mut stream = iter.next_box().unwrap().unwrap(); match super::read_elst(&mut stream) { Err(Error::InvalidData(s)) => assert_eq!(s, "invalid edit count"), - Ok(_) => assert!(false, "expected an error result"), - _ => assert!(false, "expected a different error result"), + Ok(_) => panic!("expected an error result"), + _ => panic!("expected a different error result"), } } @@ -741,8 +741,8 @@ fn read_edts_bogus() { let mut track = super::Track::new(0); match super::read_edts(&mut stream, &mut track) { Err(Error::InvalidData(s)) => assert_eq!(s, "expected additional edit"), - Ok(_) => assert!(false, "expected an error result"), - _ => assert!(false, "expected a different error result"), + Ok(_) => panic!("expected an error result"), + _ => panic!("expected a different error result"), } } @@ -827,7 +827,7 @@ fn skip_padding_in_stsd() { fn read_qt_wave_atom() { let esds = make_fullbox(BoxSize::Auto, b"esds", 0, |s| { s.B8(0x03) // elementary stream descriptor tag - .B8(0x0b) // esds length + .B8(0x12) // esds length .append_repeated(0, 2) .B8(0x00) // flags .B8(0x04) // decoder config descriptor tag diff --git a/media/libstagefright/binding/mp4parse/tests/public.rs b/media/libstagefright/binding/mp4parse/tests/public.rs index a17dd64ddfb6..7b89c7760633 100644 --- a/media/libstagefright/binding/mp4parse/tests/public.rs +++ b/media/libstagefright/binding/mp4parse/tests/public.rs @@ -78,8 +78,8 @@ fn public_api() { mp4::AudioCodecSpecific::FLACSpecificBox(flac) => { // STREAMINFO block must be present and first. assert!(flac.blocks.len() > 0); - assert!(flac.blocks[0].block_type == 0); - assert!(flac.blocks[0].data.len() == 34); + assert_eq!(flac.blocks[0].block_type, 0); + assert_eq!(flac.blocks[0].data.len(), 34); "FLAC" } mp4::AudioCodecSpecific::OpusSpecificBox(opus) => { diff --git a/media/libstagefright/binding/mp4parse_capi/src/lib.rs b/media/libstagefright/binding/mp4parse_capi/src/lib.rs index e37afe26046a..8d10e840a801 100644 --- a/media/libstagefright/binding/mp4parse_capi/src/lib.rs +++ b/media/libstagefright/binding/mp4parse_capi/src/lib.rs @@ -141,7 +141,7 @@ pub struct mp4parse_track_audio_info { // TODO(kinetik): // int32_t profile; // int32_t extended_profile; // check types - codec_specific_config: mp4parse_byte_data, + pub codec_specific_config: mp4parse_byte_data, } #[repr(C)] @@ -150,9 +150,7 @@ pub struct mp4parse_track_video_info { pub display_height: u32, pub image_width: u16, pub image_height: u16, - // TODO(kinetik): - // extra_data - // codec_specific_config + pub extra_data: mp4parse_byte_data, } #[repr(C)] @@ -336,7 +334,7 @@ fn media_time_to_us(time: MediaScaledTime, scale: MediaTimeScale) -> Option } fn track_time_to_us(time: TrackScaledTime, scale: TrackTimeScale) -> Option { - assert!(time.1 == scale.1); + assert_eq!(time.1, scale.1); let microseconds_per_second = 1000000; rational_scale(time.0, scale.0, microseconds_per_second) } @@ -460,11 +458,11 @@ pub unsafe extern fn mp4parse_get_track_audio_info(parser: *mut mp4parse_parser, match audio.codec_specific { AudioCodecSpecific::ES_Descriptor(ref v) => { - if v.codec_specific_config.len() > std::u32::MAX as usize { + if v.codec_esds.len() > std::u32::MAX as usize { return MP4PARSE_ERROR_INVALID; } - (*info).codec_specific_config.length = v.codec_specific_config.len() as u32; - (*info).codec_specific_config.data = v.codec_specific_config.as_ptr(); + (*info).codec_specific_config.length = v.codec_esds.len() as u32; + (*info).codec_specific_config.data = v.codec_esds.as_ptr(); if let Some(rate) = v.audio_sample_rate { (*info).sample_rate = rate; } @@ -547,6 +545,13 @@ pub unsafe extern fn mp4parse_get_track_video_info(parser: *mut mp4parse_parser, (*info).image_width = video.width; (*info).image_height = video.height; + match video.codec_specific { + VideoCodecSpecific::AVCConfig(ref avc) => { + (*info).extra_data.set_data(avc); + }, + _ => {}, + } + MP4PARSE_OK } @@ -686,9 +691,9 @@ fn get_track_count_null_parser() { unsafe { let mut count: u32 = 0; let rv = mp4parse_get_track_count(std::ptr::null(), std::ptr::null_mut()); - assert!(rv == MP4PARSE_ERROR_BADARG); + assert_eq!(rv, MP4PARSE_ERROR_BADARG); let rv = mp4parse_get_track_count(std::ptr::null(), &mut count); - assert!(rv == MP4PARSE_ERROR_BADARG); + assert_eq!(rv, MP4PARSE_ERROR_BADARG); } } @@ -737,6 +742,7 @@ fn arg_validation() { display_height: 0, image_width: 0, image_height: 0, + extra_data: mp4parse_byte_data::default(), }; assert_eq!(MP4PARSE_ERROR_BADARG, mp4parse_get_track_video_info(std::ptr::null_mut(), 0, &mut dummy_video)); @@ -781,6 +787,7 @@ fn arg_validation_with_parser() { display_height: 0, image_width: 0, image_height: 0, + extra_data: mp4parse_byte_data::default(), }; assert_eq!(MP4PARSE_ERROR_BADARG, mp4parse_get_track_video_info(parser, 0, &mut dummy_video)); @@ -807,7 +814,7 @@ fn get_track_count_poisoned_parser() { let mut count: u32 = 0; let rv = mp4parse_get_track_count(parser, &mut count); - assert!(rv == MP4PARSE_ERROR_BADARG); + assert_eq!(rv, MP4PARSE_ERROR_BADARG); } } @@ -852,6 +859,7 @@ fn arg_validation_with_data() { display_height: 0, image_width: 0, image_height: 0, + extra_data: mp4parse_byte_data::default(), }; assert_eq!(MP4PARSE_OK, mp4parse_get_track_video_info(parser, 0, &mut video)); assert_eq!(video.display_width, 320); @@ -883,7 +891,8 @@ fn arg_validation_with_data() { let mut video = mp4parse_track_video_info { display_width: 0, display_height: 0, image_width: 0, - image_height: 0 }; + image_height: 0, + extra_data: mp4parse_byte_data::default(),}; assert_eq!(MP4PARSE_ERROR_BADARG, mp4parse_get_track_video_info(parser, 3, &mut video)); assert_eq!(video.display_width, 0); assert_eq!(video.display_height, 0); From 371c0e771173d4f1e499deb0b37133449f6b625d Mon Sep 17 00:00:00 2001 From: "Alfredo.Yang" Date: Thu, 24 Nov 2016 16:36:08 +0800 Subject: [PATCH 40/53] Bug 1317609 - support avc extra data. r=kinetik MozReview-Commit-ID: Kza7utcIpFP --HG-- extra : rebase_source : 80ce1ed379ff764e4a72fba3d2efdaf682f71f7e --- media/libstagefright/binding/DecoderData.cpp | 3 +++ media/libstagefright/binding/MP4Metadata.cpp | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/media/libstagefright/binding/DecoderData.cpp b/media/libstagefright/binding/DecoderData.cpp index aaf2fb32c598..97a5c493778e 100644 --- a/media/libstagefright/binding/DecoderData.cpp +++ b/media/libstagefright/binding/DecoderData.cpp @@ -204,6 +204,9 @@ MP4VideoInfo::Update(const mp4parse_track_info* track, mDisplay.height = video->display_height; mImage.width = video->image_width; mImage.height = video->image_height; + if (video->extra_data.data) { + mExtraData->AppendElements(video->extra_data.data, video->extra_data.length); + } } #endif diff --git a/media/libstagefright/binding/MP4Metadata.cpp b/media/libstagefright/binding/MP4Metadata.cpp index 93a673010dae..0aa272298a01 100644 --- a/media/libstagefright/binding/MP4Metadata.cpp +++ b/media/libstagefright/binding/MP4Metadata.cpp @@ -309,6 +309,10 @@ MP4Metadata::GetTrackInfo(mozilla::TrackInfo::TrackType aType, VideoInfo *videoRust = infoRust->GetAsVideoInfo(), *video = info->GetAsVideoInfo(); MOZ_DIAGNOSTIC_ASSERT(videoRust->mDisplay == video->mDisplay); MOZ_DIAGNOSTIC_ASSERT(videoRust->mImage == video->mImage); + MOZ_DIAGNOSTIC_ASSERT(*videoRust->mExtraData == *video->mExtraData); + // mCodecSpecificConfig is for video/mp4-es, not video/avc. Since video/mp4-es + // is supported on b2g only, it could be removed from TrackInfo. + MOZ_DIAGNOSTIC_ASSERT(*videoRust->mCodecSpecificConfig == *video->mCodecSpecificConfig); break; } default: From 8bd35acdfee8f27a5eb7c6ece88c8ec16808a357 Mon Sep 17 00:00:00 2001 From: Phil Ringnalda Date: Thu, 24 Nov 2016 22:32:59 -0800 Subject: [PATCH 41/53] Backed out changeset fe57f5f7b49d (bug 1319596) for frequent failures in browser_tab_restore.js --- .../client/responsive.html/browser/tunnel.js | 3 +- .../responsive.html/test/browser/browser.ini | 1 - .../test/browser/browser_tab_restore.js | 30 ------------------- 3 files changed, 1 insertion(+), 33 deletions(-) delete mode 100644 devtools/client/responsive.html/test/browser/browser_tab_restore.js diff --git a/devtools/client/responsive.html/browser/tunnel.js b/devtools/client/responsive.html/browser/tunnel.js index f06c716f70ed..8e82d9d27236 100644 --- a/devtools/client/responsive.html/browser/tunnel.js +++ b/devtools/client/responsive.html/browser/tunnel.js @@ -312,8 +312,7 @@ function copyPermanentKey(outer, inner) { // what SessionStore uses to identify each browser. let outerMM = outer[FRAME_LOADER].messageManager; let onHistoryEntry = message => { - let data = message.data.data; - let history = data.history || data.historychange; + let history = message.data.data.history; if (!history || !history.entries) { // Wait for a message that contains history data return; diff --git a/devtools/client/responsive.html/test/browser/browser.ini b/devtools/client/responsive.html/test/browser/browser.ini index 7c8c6d8d420d..d8f4696aa458 100644 --- a/devtools/client/responsive.html/test/browser/browser.ini +++ b/devtools/client/responsive.html/test/browser/browser.ini @@ -34,7 +34,6 @@ support-files = [browser_resize_cmd.js] [browser_screenshot_button.js] [browser_tab_close.js] -[browser_tab_restore.js] [browser_tab_remoteness_change.js] [browser_toolbox_computed_view.js] [browser_toolbox_rule_view.js] diff --git a/devtools/client/responsive.html/test/browser/browser_tab_restore.js b/devtools/client/responsive.html/test/browser/browser_tab_restore.js deleted file mode 100644 index 3214fee364b5..000000000000 --- a/devtools/client/responsive.html/test/browser/browser_tab_restore.js +++ /dev/null @@ -1,30 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -"use strict"; - -// Verify RDM tab reopens to content (with RDM closed) when restoring the tab. - -const TEST_URL = "http://example.com/"; - -const ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore); -const { TabStateFlusher } = Cu.import("resource:///modules/sessionstore/TabStateFlusher.jsm", {}); - -add_task(function* () { - // Open tab, start RDM, close tab - let tab = yield addTab(TEST_URL); - // Ensure tab state is flushed to session store before closing (so it can be restored) - yield TabStateFlusher.flush(tab.linkedBrowser); - let { ui } = yield openRDM(tab); - yield removeTab(tab); - is(ui.destroyed, true, "RDM closed"); - - // Restore tab - tab = ss.undoCloseTab(window, 0); - yield once(tab, "SSTabRestored"); - - // Check location - is(tab.linkedBrowser.documentURI.spec, TEST_URL, "Restored tab location to test page"); - - yield removeTab(tab); -}); From 4b0c2fb7809c0d6db03fbd3d7946569da297fc03 Mon Sep 17 00:00:00 2001 From: Nevin Chen Date: Thu, 24 Nov 2016 10:54:49 +0800 Subject: [PATCH 42/53] Bug 1240560 - Extract goToHomeScreen() method to AcitvityUtils r=sebastian MozReview-Commit-ID: 5w4ywPhDtAy --HG-- extra : rebase_source : 048a3b5c6c0fff93ff9e92ce25d738c3de7afbdd --- .../mozilla/gecko/promotion/HomeScreenPrompt.java | 14 ++------------ .../java/org/mozilla/gecko/util/ActivityUtils.java | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/mobile/android/base/java/org/mozilla/gecko/promotion/HomeScreenPrompt.java b/mobile/android/base/java/org/mozilla/gecko/promotion/HomeScreenPrompt.java index 87e2228ba48a..a6a95b391c05 100644 --- a/mobile/android/base/java/org/mozilla/gecko/promotion/HomeScreenPrompt.java +++ b/mobile/android/base/java/org/mozilla/gecko/promotion/HomeScreenPrompt.java @@ -30,6 +30,7 @@ import org.mozilla.gecko.icons.IconCallback; import org.mozilla.gecko.icons.IconResponse; import org.mozilla.gecko.icons.Icons; import org.mozilla.gecko.Experiments; +import org.mozilla.gecko.util.ActivityUtils; import org.mozilla.gecko.util.ThreadUtils; /** @@ -123,23 +124,12 @@ public class HomeScreenPrompt extends Locales.LocaleAwareActivity implements Ico Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.BUTTON, TELEMETRY_EXTRA); - goToHomeScreen(); + ActivityUtils.goToHomeScreen(HomeScreenPrompt.this); } }); } - /** - * Finish this activity and launch the default home screen activity. - */ - private void goToHomeScreen() { - Intent intent = new Intent(Intent.ACTION_MAIN); - intent.addCategory(Intent.CATEGORY_HOME); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - startActivity(intent); - - finish(); - } private void loadShortcutIcon() { Icons.with(this) diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ActivityUtils.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ActivityUtils.java index 0a99d16bf2ad..4e0338a50f31 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ActivityUtils.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ActivityUtils.java @@ -6,6 +6,7 @@ package org.mozilla.gecko.util; import android.app.Activity; +import android.content.Intent; import android.view.View; import android.view.Window; import android.view.WindowManager; @@ -56,4 +57,17 @@ public class ActivityUtils { final int flags = window.getAttributes().flags; return ((flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0); } + + /** + * Finish this activity and launch the default home screen activity. + */ + public static void goToHomeScreen(Activity activity) { + Intent intent = new Intent(Intent.ACTION_MAIN); + + intent.addCategory(Intent.CATEGORY_HOME); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + activity.startActivity(intent); + + activity.finish(); + } } From 7d8bc9ace3e8ffb4c53b3f9e823e7a8723f16c6c Mon Sep 17 00:00:00 2001 From: Nevin Chen Date: Thu, 24 Nov 2016 10:57:19 +0800 Subject: [PATCH 43/53] Bug 1240560 - After shortcut is created, show the mobile desktop. r=sebastian MozReview-Commit-ID: 21YzmJfNC6E --HG-- extra : rebase_source : 130a84c9c01b57b730863a99b8507fb36bc93626 --- mobile/android/base/java/org/mozilla/gecko/GeckoApp.java | 3 +++ .../java/org/mozilla/gecko/promotion/HomeScreenPrompt.java | 2 ++ .../src/main/java/org/mozilla/gecko/util/ActivityUtils.java | 1 - 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java index fd88f72226e3..afab3dff6663 100644 --- a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java +++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java @@ -1931,6 +1931,9 @@ public abstract class GeckoApp // Remember interaction final UrlAnnotations urlAnnotations = BrowserDB.from(getApplicationContext()).getUrlAnnotations(); urlAnnotations.insertHomeScreenShortcut(getContentResolver(), aURI, true); + + // After shortcut is created, show the mobile desktop. + ActivityUtils.goToHomeScreen(this); } private Bitmap getLauncherIcon(Bitmap aSource, int size) { diff --git a/mobile/android/base/java/org/mozilla/gecko/promotion/HomeScreenPrompt.java b/mobile/android/base/java/org/mozilla/gecko/promotion/HomeScreenPrompt.java index a6a95b391c05..0f2df8a2c368 100644 --- a/mobile/android/base/java/org/mozilla/gecko/promotion/HomeScreenPrompt.java +++ b/mobile/android/base/java/org/mozilla/gecko/promotion/HomeScreenPrompt.java @@ -125,6 +125,8 @@ public class HomeScreenPrompt extends Locales.LocaleAwareActivity implements Ico Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.BUTTON, TELEMETRY_EXTRA); ActivityUtils.goToHomeScreen(HomeScreenPrompt.this); + + finish(); } }); } diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ActivityUtils.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ActivityUtils.java index 4e0338a50f31..2f15e78683f5 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ActivityUtils.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ActivityUtils.java @@ -68,6 +68,5 @@ public class ActivityUtils { intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); activity.startActivity(intent); - activity.finish(); } } From 2cfbaefbebfe26d9153ea34643d9339361650ffe Mon Sep 17 00:00:00 2001 From: Nevin Chen Date: Tue, 15 Nov 2016 09:47:12 +0800 Subject: [PATCH 44/53] Bug 1314563 - Add info for Java to know when the url is in the exception list and show the correct icon r=sebastian MozReview-Commit-ID: FG6a7mRCzZY --HG-- extra : rebase_source : 998a0d60436f84df4554d62f48d985f9a03ffea0 --- .../base/java/org/mozilla/gecko/SiteIdentity.java | 9 +++++++++ .../org/mozilla/gecko/toolbar/ToolbarDisplayLayout.java | 6 ++++++ mobile/android/chrome/content/browser.js | 5 +++-- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/mobile/android/base/java/org/mozilla/gecko/SiteIdentity.java b/mobile/android/base/java/org/mozilla/gecko/SiteIdentity.java index e39d25dd8703..6deb7a4c5b49 100644 --- a/mobile/android/base/java/org/mozilla/gecko/SiteIdentity.java +++ b/mobile/android/base/java/org/mozilla/gecko/SiteIdentity.java @@ -16,6 +16,7 @@ public class SiteIdentity { private MixedMode mMixedModeActive; private MixedMode mMixedModeDisplay; private TrackingMode mTrackingMode; + private boolean mSecurityException; private String mHost; private String mOwner; private String mSupplemental; @@ -129,6 +130,7 @@ public class SiteIdentity { public void resetIdentity() { mSecurityMode = SecurityMode.UNKNOWN; + mSecurityException = false; mOrigin = null; mHost = null; mOwner = null; @@ -143,6 +145,7 @@ public class SiteIdentity { mMixedModeActive = MixedMode.UNKNOWN; mMixedModeDisplay = MixedMode.UNKNOWN; mTrackingMode = TrackingMode.UNKNOWN; + mSecurityException = false; } void update(JSONObject identityData) { @@ -187,6 +190,8 @@ public class SiteIdentity { mCountry = identityData.optString("country", null); mVerifier = identityData.optString("verifier", null); mSecure = identityData.optBoolean("secure", false); + mSecurityException = identityData.optBoolean("securityException", false); + } catch (Exception e) { resetIdentity(); } @@ -243,6 +248,10 @@ public class SiteIdentity { return mMixedModeDisplay; } + public boolean isSecurityException() { + return mSecurityException; + } + public TrackingMode getTrackingMode() { return mTrackingMode; } diff --git a/mobile/android/base/java/org/mozilla/gecko/toolbar/ToolbarDisplayLayout.java b/mobile/android/base/java/org/mozilla/gecko/toolbar/ToolbarDisplayLayout.java index df38a7da73d9..0d070f117253 100644 --- a/mobile/android/base/java/org/mozilla/gecko/toolbar/ToolbarDisplayLayout.java +++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/ToolbarDisplayLayout.java @@ -359,16 +359,20 @@ public class ToolbarDisplayLayout extends ThemedLinearLayout { final MixedMode activeMixedMode; final MixedMode displayMixedMode; final TrackingMode trackingMode; + final boolean securityException; + if (siteIdentity == null) { securityMode = SecurityMode.UNKNOWN; activeMixedMode = MixedMode.UNKNOWN; displayMixedMode = MixedMode.UNKNOWN; trackingMode = TrackingMode.UNKNOWN; + securityException = false; } else { securityMode = siteIdentity.getSecurityMode(); activeMixedMode = siteIdentity.getMixedModeActive(); displayMixedMode = siteIdentity.getMixedModeDisplay(); trackingMode = siteIdentity.getTrackingMode(); + securityException = siteIdentity.isSecurityException(); } // This is a bit tricky, but we have one icon and three potential indicators. @@ -387,6 +391,8 @@ public class ToolbarDisplayLayout extends ThemedLinearLayout { if (AboutPages.isTitlelessAboutPage(tab.getURL())) { // We always want to just show a search icon on about:home imageLevel = LEVEL_SEARCH_ICON; + } else if (securityException) { + imageLevel = LEVEL_WARNING_MINOR; } else if (trackingMode == TrackingMode.TRACKING_CONTENT_LOADED) { imageLevel = LEVEL_SHIELD_DISABLED; } else if (trackingMode == TrackingMode.TRACKING_CONTENT_BLOCKED) { diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js index 0be3b4b90636..26062e5c7fb3 100644 --- a/mobile/android/chrome/content/browser.js +++ b/mobile/android/chrome/content/browser.js @@ -5918,9 +5918,10 @@ var IdentityHandler = { if (this._lastLocation.hostname && this._overrideService.hasMatchingOverride(this._lastLocation.hostname, (this._lastLocation.port || 443), - iData.cert, {}, {})) + iData.cert, {}, {})) { result.verifier = Strings.browser.GetStringFromName("identity.identified.verified_by_you"); - + result.securityException = true; + } return result; }, From f306b4ac22eb37d2cdafa1eca0456e6c32bab1cf Mon Sep 17 00:00:00 2001 From: Nevin Chen Date: Mon, 21 Nov 2016 16:32:10 +0800 Subject: [PATCH 45/53] Bug 1314563 - Change state icon and message when url icon is clicked r=sebastian MozReview-Commit-ID: 5KDVFVse9Tu --HG-- extra : rebase_source : 808bc0f70841224163b9ee1b66f3fdd96ef125f6 --- .../java/org/mozilla/gecko/toolbar/SiteIdentityPopup.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mobile/android/base/java/org/mozilla/gecko/toolbar/SiteIdentityPopup.java b/mobile/android/base/java/org/mozilla/gecko/toolbar/SiteIdentityPopup.java index cfcb0cb93dc6..105b2db61909 100644 --- a/mobile/android/base/java/org/mozilla/gecko/toolbar/SiteIdentityPopup.java +++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/SiteIdentityPopup.java @@ -363,6 +363,14 @@ public class SiteIdentityPopup extends AnchoredPopup implements GeckoEventListen mSecurityState.setText(R.string.identity_connection_insecure); mSecurityState.setTextColor(ContextCompat.getColor(mContext, R.color.placeholder_active_grey)); + + } else if (siteIdentity.isSecurityException()) { + + mIcon.setImageResource(R.drawable.lock_inactive); + setSecurityStateIcon(R.drawable.warning_major, 1); + mSecurityState.setText(R.string.identity_connection_insecure); + mSecurityState.setTextColor(ContextCompat.getColor(mContext, R.color.placeholder_active_grey)); + } else { // Connection is secure. mIcon.setImageResource(R.drawable.lock_secure); From abdee013ae99d4be7459b68030f6ef73496d7164 Mon Sep 17 00:00:00 2001 From: bechen Date: Thu, 24 Nov 2016 15:30:52 +0800 Subject: [PATCH 46/53] Bug 1319486 - Remove the old relation when adding cue to a new TextTrack. r=rillian MozReview-Commit-ID: GScxPQWMUTR --HG-- extra : rebase_source : 2aeb67215202860b7a62a6669d79aaaf99e6d53a --- dom/media/TextTrack.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dom/media/TextTrack.cpp b/dom/media/TextTrack.cpp index 2516bf47b154..0adff192028a 100644 --- a/dom/media/TextTrack.cpp +++ b/dom/media/TextTrack.cpp @@ -136,6 +136,11 @@ TextTrack::GetId(nsAString& aId) const void TextTrack::AddCue(TextTrackCue& aCue) { + TextTrack* oldTextTrack = aCue.GetTrack(); + if (oldTextTrack) { + ErrorResult dummy; + oldTextTrack->RemoveCue(aCue, dummy); + } mCueList->AddCue(aCue); aCue.SetTrack(this); if (mTextTrackList) { From c627faaa2ba209a8f6051d0604b368fc0a7c626c Mon Sep 17 00:00:00 2001 From: James Cheng Date: Wed, 23 Nov 2016 15:12:50 +0800 Subject: [PATCH 47/53] Bug 1319673 - Make it compile error when instantiate a Variant with duplicate type. r=Tomcat,Waldo MozReview-Commit-ID: IKoLU2FjtzA --HG-- extra : rebase_source : dcf3ff852af5a985c6c77dcfb1e2a901e92fb869 --- mfbt/Variant.h | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/mfbt/Variant.h b/mfbt/Variant.h index 27d79de37209..41bb00209218 100644 --- a/mfbt/Variant.h +++ b/mfbt/Variant.h @@ -24,6 +24,34 @@ class Variant; namespace detail { +template +struct FirstTypeIsInRest; + +template +struct FirstTypeIsInRest : FalseType {}; + +template +struct FirstTypeIsInRest +{ + static constexpr bool value = + IsSame::value || + FirstTypeIsInRest::value; +}; + +template +struct TypesAreDistinct; + +template <> +struct TypesAreDistinct<> : TrueType { }; + +template +struct TypesAreDistinct +{ + static constexpr bool value = + !FirstTypeIsInRest::value && + TypesAreDistinct::value; +}; + // MaxSizeOf computes the maximum sizeof(T) for each T in Ts. template @@ -428,6 +456,7 @@ struct AsVariantTemporary template class MOZ_INHERIT_TYPE_ANNOTATIONS_FROM_TEMPLATE_ARGS Variant { + static_assert(detail::TypesAreDistinct::value, "Variant with duplicate types is not supported"); using Tag = typename detail::VariantTag::Type; using Impl = detail::VariantImplementation; using RawData = AlignedStorage::size>; From 8f4f3df42a6e8302c3948c13b758dd961119e628 Mon Sep 17 00:00:00 2001 From: John Lin Date: Mon, 21 Nov 2016 15:36:06 +0800 Subject: [PATCH 48/53] Bug 1313991 - Rewrite input buffer polling logic. r=esawin - poll all buffers when started or flushed. - retry only for timed out. - remove unnecessary polling MozReview-Commit-ID: DU9vvjJkwDH --HG-- extra : rebase_source : 54d734585e198413b2f1afbdad9b073b4e14a153 --- .../gecko/media/JellyBeanAsyncCodec.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/mobile/android/base/java/org/mozilla/gecko/media/JellyBeanAsyncCodec.java b/mobile/android/base/java/org/mozilla/gecko/media/JellyBeanAsyncCodec.java index b5f529b19fe8..2f243719b32f 100644 --- a/mobile/android/base/java/org/mozilla/gecko/media/JellyBeanAsyncCodec.java +++ b/mobile/android/base/java/org/mozilla/gecko/media/JellyBeanAsyncCodec.java @@ -214,8 +214,9 @@ final class JellyBeanAsyncCodec implements AsyncCodec { int result = mCodec.dequeueInputBuffer(DEQUEUE_TIMEOUT_US); if (result >= 0) { mCallbackSender.notifyInputBuffer(result); - schedulePollingIfNotCanceled(BufferPoller.MSG_POLL_INPUT_BUFFERS); - } else if (result != MediaCodec.INFO_TRY_AGAIN_LATER) { + } else if (result == MediaCodec.INFO_TRY_AGAIN_LATER) { + mBufferPoller.schedulePollingIfNotCanceled(BufferPoller.MSG_POLL_INPUT_BUFFERS); + } else { mCallbackSender.notifyError(result); } } @@ -229,9 +230,6 @@ final class JellyBeanAsyncCodec implements AsyncCodec { mOutputEnded = true; } mCallbackSender.notifyOutputBuffer(result, info); - if (!hasMessages(MSG_POLL_INPUT_BUFFERS)) { - schedulePollingIfNotCanceled(MSG_POLL_INPUT_BUFFERS); - } } else if (result == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) { mOutputBuffers = mCodec.getOutputBuffers(); } else if (result == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { @@ -326,8 +324,10 @@ final class JellyBeanAsyncCodec implements AsyncCodec { mInputEnded = false; mOutputEnded = false; mInputBuffers = mCodec.getInputBuffers(); + for (int i = 0; i < mInputBuffers.length; i++) { + mBufferPoller.schedulePolling(BufferPoller.MSG_POLL_INPUT_BUFFERS); + } mOutputBuffers = mCodec.getOutputBuffers(); - mBufferPoller.schedulePolling(BufferPoller.MSG_POLL_INPUT_BUFFERS); } @Override @@ -344,8 +344,8 @@ final class JellyBeanAsyncCodec implements AsyncCodec { return; } - mBufferPoller.schedulePolling(BufferPoller.MSG_POLL_INPUT_BUFFERS); mBufferPoller.schedulePolling(BufferPoller.MSG_POLL_OUTPUT_BUFFERS); + mBufferPoller.schedulePolling(BufferPoller.MSG_POLL_INPUT_BUFFERS); } @Override @@ -399,7 +399,9 @@ final class JellyBeanAsyncCodec implements AsyncCodec { mOutputEnded = false; cancelPendingTasks(); mCodec.flush(); - mBufferPoller.schedulePolling(BufferPoller.MSG_POLL_INPUT_BUFFERS); + for (int i = 0; i < mInputBuffers.length; i++) { + mBufferPoller.schedulePolling(BufferPoller.MSG_POLL_INPUT_BUFFERS); + } } private void cancelPendingTasks() { From aed5b288368f7cbaf4e220c01633d5c2c9a2cb7b Mon Sep 17 00:00:00 2001 From: Jarda Snajdr Date: Thu, 24 Nov 2016 16:12:25 +0100 Subject: [PATCH 49/53] Bug 1320110 - WebConsoleClient API calls should return promises r=ochameau MozReview-Commit-ID: 1mmGGUgIwqA --HG-- extra : rebase_source : 37a1024dbae384461008634ef6a3d3fb62f1a66b --- .../test/browser_console_netlogging.js | 5 +- .../test/browser_webconsole_netlogging.js | 20 ++-- devtools/client/webconsole/test/head.js | 15 --- devtools/shared/webconsole/client.js | 99 ++++++++++++++----- .../shared/webconsole/test/test_jsterm.html | 12 +-- 5 files changed, 88 insertions(+), 63 deletions(-) diff --git a/devtools/client/webconsole/test/browser_console_netlogging.js b/devtools/client/webconsole/test/browser_console_netlogging.js index a6f7bec48b52..a3ca2d033428 100644 --- a/devtools/client/webconsole/test/browser_console_netlogging.js +++ b/devtools/client/webconsole/test/browser_console_netlogging.js @@ -23,9 +23,8 @@ add_task(function* () { ok(request, "Page load was logged"); let client = hud.ui.webConsoleClient; - let args = [request.actor]; - const postData = yield getPacket(client, "getRequestPostData", args); - const responseContent = yield getPacket(client, "getResponseContent", args); + const postData = yield client.getRequestPostData(request.actor); + const responseContent = yield client.getResponseContent(request.actor); is(request.request.url, TEST_NETWORK_REQUEST_URI, "Logged network entry is page load"); diff --git a/devtools/client/webconsole/test/browser_webconsole_netlogging.js b/devtools/client/webconsole/test/browser_webconsole_netlogging.js index 63730c9b4ecc..f22ea52003b8 100644 --- a/devtools/client/webconsole/test/browser_webconsole_netlogging.js +++ b/devtools/client/webconsole/test/browser_webconsole_netlogging.js @@ -39,9 +39,8 @@ add_task(function* testPageLoad() { ok(request, "Page load was logged"); let client = hud.ui.webConsoleClient; - let args = [request.actor]; - const postData = yield getPacket(client, "getRequestPostData", args); - const responseContent = yield getPacket(client, "getResponseContent", args); + const postData = yield client.getRequestPostData(request.actor); + const responseContent = yield client.getResponseContent(request.actor); is(request.request.url, TEST_NETWORK_REQUEST_URI, "Logged network entry is page load"); @@ -65,9 +64,8 @@ add_task(function* testXhrGet() { ok(request, "testXhrGet() was logged"); let client = hud.ui.webConsoleClient; - let args = [request.actor]; - const postData = yield getPacket(client, "getRequestPostData", args); - const responseContent = yield getPacket(client, "getResponseContent", args); + const postData = yield client.getRequestPostData(request.actor); + const responseContent = yield client.getResponseContent(request.actor); is(request.request.method, "GET", "Method is correct"); ok(!postData.postData.text, "No request body was sent"); @@ -89,9 +87,8 @@ add_task(function* testXhrPost() { ok(request, "testXhrPost() was logged"); let client = hud.ui.webConsoleClient; - let args = [request.actor]; - const postData = yield getPacket(client, "getRequestPostData", args); - const responseContent = yield getPacket(client, "getResponseContent", args); + const postData = yield client.getRequestPostData(request.actor); + const responseContent = yield client.getResponseContent(request.actor); is(request.request.method, "POST", "Method is correct"); is(postData.postData.text, "Hello world!", "Request body was logged"); @@ -120,9 +117,8 @@ add_task(function* testFormSubmission() { ok(request, "testFormSubmission() was logged"); let client = hud.ui.webConsoleClient; - let args = [request.actor]; - const postData = yield getPacket(client, "getRequestPostData", args); - const responseContent = yield getPacket(client, "getResponseContent", args); + const postData = yield client.getRequestPostData(request.actor); + const responseContent = yield client.getResponseContent(request.actor); is(request.request.method, "POST", "Method is correct"); isnot(postData.postData.text diff --git a/devtools/client/webconsole/test/head.js b/devtools/client/webconsole/test/head.js index 519cb78b05b4..0131c4707200 100644 --- a/devtools/client/webconsole/test/head.js +++ b/devtools/client/webconsole/test/head.js @@ -1790,21 +1790,6 @@ function getSourceActor(sources, URL) { return item && item.value; } -/** - * Make a request against an actor and resolve with the packet. - * @param object client - * The client to use when making the request. - * @param function requestType - * The client request function to run. - * @param array args - * The arguments to pass into the function. - */ -function getPacket(client, requestType, args) { - return new Promise(resolve => { - client[requestType](...args, packet => resolve(packet)); - }); -} - /** * Verify that clicking on a link from a popup notification message tries to * open the expected URL. diff --git a/devtools/shared/webconsole/client.js b/devtools/shared/webconsole/client.js index 4cc5deedf35e..a9bf0d700040 100644 --- a/devtools/shared/webconsole/client.js +++ b/devtools/shared/webconsole/client.js @@ -182,6 +182,8 @@ WebConsoleClient.prototype = { * this.CACHED_MESSAGES for known types. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ getCachedMessages: function (types, onResponse) { let packet = { @@ -189,7 +191,7 @@ WebConsoleClient.prototype = { type: "getCachedMessages", messageTypes: types, }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -199,13 +201,15 @@ WebConsoleClient.prototype = { * The WebConsoleObjectActor ID to send the request to. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ inspectObjectProperties: function (actor, onResponse) { let packet = { to: actor, type: "inspectProperties", }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -244,6 +248,8 @@ WebConsoleClient.prototype = { * exists. This is used by helper functions that can * reference the currently selected node in the Inspector, * like $0. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ evaluateJS: function (string, onResponse, options = {}) { let packet = { @@ -256,7 +262,7 @@ WebConsoleClient.prototype = { selectedNodeActor: options.selectedNodeActor, selectedObjectActor: options.selectedObjectActor, }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -266,8 +272,7 @@ WebConsoleClient.prototype = { evaluateJSAsync: function (string, onResponse, options = {}) { // Pre-37 servers don't support async evaluation. if (!this.traits.evaluateJSAsync) { - this.evaluateJS(string, onResponse, options); - return; + return this.evaluateJS(string, onResponse, options); } let packet = { @@ -281,12 +286,23 @@ WebConsoleClient.prototype = { selectedObjectActor: options.selectedObjectActor, }; - this._client.request(packet, response => { - // Null check this in case the client has been detached while waiting - // for a response. - if (this.pendingEvaluationResults) { - this.pendingEvaluationResults.set(response.resultID, onResponse); - } + return new Promise((resolve, reject) => { + this._client.request(packet, response => { + // Null check this in case the client has been detached while waiting + // for a response. + if (this.pendingEvaluationResults) { + this.pendingEvaluationResults.set(response.resultID, resp => { + if (onResponse) { + onResponse(resp); + } + if (resp.error) { + reject(resp); + } else { + resolve(resp); + } + }); + } + }); }); }, @@ -326,6 +342,8 @@ WebConsoleClient.prototype = { * The function invoked when the response is received. * @param string frameActor * The id of the frame actor that made the call. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ autocomplete: function (string, cursor, onResponse, frameActor) { let packet = { @@ -335,18 +353,21 @@ WebConsoleClient.prototype = { cursor: cursor, frameActor: frameActor, }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** * Clear the cache of messages (page errors and console API calls). + * + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ clearMessagesCache: function () { let packet = { to: this._actor, type: "clearMessagesCache", }; - this._client.request(packet); + return this._client.request(packet); }, /** @@ -356,6 +377,8 @@ WebConsoleClient.prototype = { * An array with the preferences you want to retrieve. * @param function [onResponse] * Optional function to invoke when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ getPreferences: function (preferences, onResponse) { let packet = { @@ -363,7 +386,7 @@ WebConsoleClient.prototype = { type: "getPreferences", preferences: preferences, }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -373,6 +396,8 @@ WebConsoleClient.prototype = { * An object with the preferences you want to change. * @param function [onResponse] * Optional function to invoke when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ setPreferences: function (preferences, onResponse) { let packet = { @@ -380,7 +405,7 @@ WebConsoleClient.prototype = { type: "setPreferences", preferences: preferences, }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -390,13 +415,15 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ getRequestHeaders: function (actor, onResponse) { let packet = { to: actor, type: "getRequestHeaders", }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -406,13 +433,15 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ getRequestCookies: function (actor, onResponse) { let packet = { to: actor, type: "getRequestCookies", }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -422,13 +451,15 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ getRequestPostData: function (actor, onResponse) { let packet = { to: actor, type: "getRequestPostData", }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -438,13 +469,15 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ getResponseHeaders: function (actor, onResponse) { let packet = { to: actor, type: "getResponseHeaders", }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -454,13 +487,15 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ getResponseCookies: function (actor, onResponse) { let packet = { to: actor, type: "getResponseCookies", }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -470,13 +505,15 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ getResponseContent: function (actor, onResponse) { let packet = { to: actor, type: "getResponseContent", }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -486,13 +523,15 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ getEventTimings: function (actor, onResponse) { let packet = { to: actor, type: "getEventTimings", }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -502,13 +541,15 @@ WebConsoleClient.prototype = { * The NetworkEventActor ID. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ getSecurityInfo: function (actor, onResponse) { let packet = { to: actor, type: "getSecurityInfo", }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -518,6 +559,8 @@ WebConsoleClient.prototype = { * The details of the HTTP request. * @param function onResponse * The function invoked when the response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ sendHTTPRequest: function (data, onResponse) { let packet = { @@ -525,7 +568,7 @@ WebConsoleClient.prototype = { type: "sendHTTPRequest", request: data }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -537,6 +580,8 @@ WebConsoleClient.prototype = { * known listeners. * @param function onResponse * Function to invoke when the server response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ startListeners: function (listeners, onResponse) { let packet = { @@ -544,7 +589,7 @@ WebConsoleClient.prototype = { type: "startListeners", listeners: listeners, }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** @@ -556,6 +601,8 @@ WebConsoleClient.prototype = { * known listeners. * @param function onResponse * Function to invoke when the server response is received. + * @return request + * Request object that implements both Promise and EventEmitter interfaces */ stopListeners: function (listeners, onResponse) { let packet = { @@ -563,7 +610,7 @@ WebConsoleClient.prototype = { type: "stopListeners", listeners: listeners, }; - this._client.request(packet, onResponse); + return this._client.request(packet, onResponse); }, /** diff --git a/devtools/shared/webconsole/test/test_jsterm.html b/devtools/shared/webconsole/test/test_jsterm.html index b6eefad4b6e4..5a4d7ae2eb93 100644 --- a/devtools/shared/webconsole/test/test_jsterm.html +++ b/devtools/shared/webconsole/test/test_jsterm.html @@ -24,13 +24,11 @@ let {MAX_AUTOCOMPLETE_ATTEMPTS,MAX_AUTOCOMPLETIONS} = require("devtools/shared/w // evaluateJS and once with evaluateJSAsync. let evaluatingSync = true; function evaluateJS(input, options = {}) { - return new Promise((resolve, reject) => { - if (evaluatingSync) { - gState.client.evaluateJS(input, resolve, options); - } else { - gState.client.evaluateJSAsync(input, resolve, options); - } - }); + if (evaluatingSync) { + return gState.client.evaluateJS(input, null, options); + } else { + return gState.client.evaluateJSAsync(input, null, options); + } } function startTest() From 034e9612107fb1b8e2bfdc9f10882d3b0166caec Mon Sep 17 00:00:00 2001 From: Henrik Skupin Date: Fri, 25 Nov 2016 10:41:17 +0100 Subject: [PATCH 50/53] Bug 1318644 - Auto-detect application type if binary has been specified. r=automatedtester MozReview-Commit-ID: 15etyogBI54 --HG-- extra : rebase_source : a359b2a3dd4411be89e0de42ddd6e86be8e9b26e --- .../client/marionette_driver/geckoinstance.py | 25 ++++++++++- .../client/marionette_driver/marionette.py | 45 +++++-------------- testing/marionette/client/requirements.txt | 1 + .../harness/marionette/runner/base.py | 43 +++++++++++------- .../tests/unit/test_geckoinstance.py | 27 +++++++++++ .../marionette/tests/unit/unit-tests.ini | 1 + 6 files changed, 88 insertions(+), 54 deletions(-) create mode 100644 testing/marionette/harness/marionette/tests/unit/test_geckoinstance.py diff --git a/testing/marionette/client/marionette_driver/geckoinstance.py b/testing/marionette/client/marionette_driver/geckoinstance.py index 804488eb429e..d0aa85ec8da6 100644 --- a/testing/marionette/client/marionette_driver/geckoinstance.py +++ b/testing/marionette/client/marionette_driver/geckoinstance.py @@ -9,6 +9,8 @@ import time from copy import deepcopy +import mozversion + from mozprofile import Profile from mozrunner import Runner, FennecEmulatorRunner @@ -47,7 +49,7 @@ class GeckoInstance(object): "dom.ipc.cpows.forbid-unsafe-from-browser": False, } - def __init__(self, host, port, bin, profile=None, addons=None, + def __init__(self, host=None, port=None, bin=None, profile=None, addons=None, app_args=None, symbols_path=None, gecko_log=None, prefs=None, workspace=None, verbose=0): self.runner_class = Runner @@ -133,6 +135,20 @@ class GeckoInstance(object): profile_name) self.profile = Profile.clone(**profile_args) + @classmethod + def create(cls, app=None, *args, **kwargs): + try: + if not app: + app_id = mozversion.get_version(binary=kwargs.get('bin'))['application_id'] + app = app_ids[app_id] + + instance_class = apps[app] + except KeyError: + msg = 'Application "{0}" unknown (should be one of {1})' + raise NotImplementedError(msg.format(app, apps.keys())) + + return instance_class(*args, **kwargs) + def start(self): self._update_profile() self.runner = self.runner_class(**self._get_runner_args()) @@ -318,6 +334,11 @@ class NullOutput(object): apps = { - 'fxdesktop': DesktopInstance, 'fennec': FennecInstance, + 'fxdesktop': DesktopInstance, +} + +app_ids = { + '{aa3c5121-dab2-40e2-81ca-7ea25febc110}': 'fennec', + '{ec8030f7-c20a-464f-9b0e-13a3a9e97384}': 'fxdesktop', } diff --git a/testing/marionette/client/marionette_driver/marionette.py b/testing/marionette/client/marionette_driver/marionette.py index 0a88cde1245a..73eff5709a26 100644 --- a/testing/marionette/client/marionette_driver/marionette.py +++ b/testing/marionette/client/marionette_driver/marionette.py @@ -2,7 +2,6 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -import ConfigParser import base64 import datetime import json @@ -15,14 +14,13 @@ import warnings from contextlib import contextmanager -from decorators import do_process_check -from keys import Keys - import errors -import geckoinstance import transport -from timeout import Timeouts +from .decorators import do_process_check +from .geckoinstance import GeckoInstance +from .keys import Keys +from .timeout import Timeouts WEBELEMENT_KEY = "ELEMENT" W3C_WEBELEMENT_KEY = "element-6066-11e4-a52e-4f735466cecf" @@ -584,40 +582,17 @@ class Marionette(object): startup_timeout = startup_timeout or self.DEFAULT_STARTUP_TIMEOUT if self.bin: - self.instance = self._create_instance(app, instance_args) + if not Marionette.is_port_available(self.port, host=self.host): + ex_msg = "{0}:{1} is unavailable.".format(self.host, self.port) + raise errors.MarionetteException(message=ex_msg) + + self.instance = GeckoInstance.create( + app, host=self.host, port=self.port, bin=self.bin, **instance_args) self.instance.start() self.raise_for_port(timeout=startup_timeout) self.timeout = Timeouts(self) - def _create_instance(self, app, instance_args): - if not Marionette.is_port_available(self.port, host=self.host): - ex_msg = "{0}:{1} is unavailable.".format(self.host, self.port) - raise errors.MarionetteException(message=ex_msg) - if app: - # select instance class for the given app - try: - instance_class = geckoinstance.apps[app] - except KeyError: - msg = 'Application "{0}" unknown (should be one of {1})' - raise NotImplementedError( - msg.format(app, geckoinstance.apps.keys())) - else: - try: - if not isinstance(self.bin, basestring): - raise TypeError("bin must be a string if app is not specified") - config = ConfigParser.RawConfigParser() - config.read(os.path.join(os.path.dirname(self.bin), - 'application.ini')) - app = config.get('App', 'Name') - instance_class = geckoinstance.apps[app.lower()] - except (ConfigParser.NoOptionError, - ConfigParser.NoSectionError, - KeyError): - instance_class = geckoinstance.GeckoInstance - return instance_class(host=self.host, port=self.port, bin=self.bin, - **instance_args) - @property def profile_path(self): if self.instance and self.instance.profile: diff --git a/testing/marionette/client/requirements.txt b/testing/marionette/client/requirements.txt index 63fea713ca7f..a06a719acf23 100644 --- a/testing/marionette/client/requirements.txt +++ b/testing/marionette/client/requirements.txt @@ -1 +1,2 @@ mozrunner >= 6.13 +mozversion >= 1.1 diff --git a/testing/marionette/harness/marionette/runner/base.py b/testing/marionette/harness/marionette/runner/base.py index 3ece3e1691b1..890e38fa7f50 100644 --- a/testing/marionette/harness/marionette/runner/base.py +++ b/testing/marionette/harness/marionette/runner/base.py @@ -2,12 +2,7 @@ # 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/. -from argparse import ArgumentParser - -from copy import deepcopy import json -import mozinfo -import moznetwork import os import random import re @@ -17,15 +12,20 @@ import time import traceback import unittest import warnings -import mozprofile +from argparse import ArgumentParser +from copy import deepcopy + +import mozinfo +import moznetwork +import mozprofile +import mozversion from manifestparser import TestManifest from manifestparser.filters import tags from marionette_driver.marionette import Marionette from moztest.adapters.unit import StructuredTestRunner, StructuredTestResult from moztest.results import TestResultCollection, TestResult, relevant_line -import mozversion import httpd @@ -506,6 +506,13 @@ class BaseMarionetteTestRunner(object): socket_timeout=BaseMarionetteArguments.socket_timeout_default, startup_timeout=None, addons=None, workspace=None, verbose=0, e10s=True, emulator=False, **kwargs): + + self._appinfo = None + self._appName = None + self._capabilities = None + self._filename_pattern = None + self._version_info = {} + self.extra_kwargs = kwargs self.test_kwargs = deepcopy(kwargs) self.address = address @@ -522,9 +529,6 @@ class BaseMarionetteTestRunner(object): self.repeat = repeat self.symbols_path = symbols_path self.socket_timeout = socket_timeout - self._capabilities = None - self._appinfo = None - self._appName = None self.shuffle = shuffle self.shuffle_seed = shuffle_seed self.server_root = server_root @@ -543,7 +547,6 @@ class BaseMarionetteTestRunner(object): self.workspace_path = workspace or os.getcwd() self.verbose = verbose self.e10s = e10s - self._filename_pattern = None def gather_debug(test, status): rv = {} @@ -676,6 +679,17 @@ class BaseMarionetteTestRunner(object): self.tests = [] self.cleanup() + @property + def version_info(self): + if not self._version_info: + try: + # TODO: Get version_info in Fennec case + self._version_info = mozversion.get_version(binary=self.bin) + except Exception: + self.logger.warning("Failed to retrieve version information for {}".format( + self.bin)) + return self._version_info + def reset_test_stats(self): self.passed = 0 self.failed = 0 @@ -825,15 +839,10 @@ class BaseMarionetteTestRunner(object): except Exception: self.logger.warning('Could not get device info.') - # TODO: Get version_info in Fennec case - version_info = None - if self.bin: - version_info = mozversion.get_version(binary=self.bin) - self.logger.info("running with e10s: {}".format(self.e10s)) self.logger.suite_start(self.tests, - version_info=version_info, + version_info=self.version_info, device_info=device_info) self._log_skipped_tests() diff --git a/testing/marionette/harness/marionette/tests/unit/test_geckoinstance.py b/testing/marionette/harness/marionette/tests/unit/test_geckoinstance.py new file mode 100644 index 000000000000..148c7a4bf644 --- /dev/null +++ b/testing/marionette/harness/marionette/tests/unit/test_geckoinstance.py @@ -0,0 +1,27 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +from marionette.marionette_test import MarionetteTestCase +from marionette_driver.geckoinstance import apps, GeckoInstance + + +class TestGeckoInstance(MarionetteTestCase): + + def test_create(self): + """Test that the correct gecko instance is determined.""" + for app in apps: + # If app has been specified we directly return the appropriate instance class + self.assertEqual(type(GeckoInstance.create(app=app, bin="n/a")), + apps[app]) + + # When using mozversion to detect the instance class, it should never return the + # base GeckoInstance class. + self.assertNotEqual(GeckoInstance.create(bin=self.marionette.bin), + GeckoInstance) + + # Unknown applications and binaries should fail + self.assertRaises(NotImplementedError, GeckoInstance.create, + app="n/a", binary=self.marionette.bin) + self.assertRaises(IOError, GeckoInstance.create, + bin="n/a") diff --git a/testing/marionette/harness/marionette/tests/unit/unit-tests.ini b/testing/marionette/harness/marionette/tests/unit/unit-tests.ini index f57aa9d2e30c..f329b45baeac 100644 --- a/testing/marionette/harness/marionette/tests/unit/unit-tests.ini +++ b/testing/marionette/harness/marionette/tests/unit/unit-tests.ini @@ -1,4 +1,5 @@ [test_marionette.py] +[test_geckoinstance.py] [test_data_driven.py] [test_session.py] [test_capabilities.py] From 2b6d8eb79d9ee8ed3ceeddb0e6afd101cc1d1505 Mon Sep 17 00:00:00 2001 From: ffxbld Date: Fri, 25 Nov 2016 06:37:58 -0800 Subject: [PATCH 51/53] No bug, Automated HSTS preload list update from host bld-linux64-spot-576 - a=hsts-update --- security/manager/ssl/nsSTSPreloadList.errors | 146 +- security/manager/ssl/nsSTSPreloadList.inc | 26768 +++++++++-------- 2 files changed, 13459 insertions(+), 13455 deletions(-) diff --git a/security/manager/ssl/nsSTSPreloadList.errors b/security/manager/ssl/nsSTSPreloadList.errors index 2753d12910c8..79b5e9412efb 100644 --- a/security/manager/ssl/nsSTSPreloadList.errors +++ b/security/manager/ssl/nsSTSPreloadList.errors @@ -16,7 +16,6 @@ 1password.com: did not receive HSTS header 1whw.co.uk: could not connect to host 206rc.net: max-age too low: 2592000 -20hs.cn: did not receive HSTS header 24hourpaint.com: did not receive HSTS header 25daysof.io: could not connect to host 2859cc.com: could not connect to host @@ -27,6 +26,7 @@ 360gradus.com: did not receive HSTS header 365.or.jp: did not receive HSTS header 3chit.cf: could not connect to host +404.sh: could not connect to host 420dongstorm.com: could not connect to host 42ms.org: could not connect to host 4455software.com: did not receive HSTS header @@ -116,7 +116,6 @@ agrios.de: did not receive HSTS header agro-id.gov.ua: could not connect to host ahabingo.com: did not receive HSTS header ahri.ovh: could not connect to host -aidanmontare.net: could not connect to host aidanwoods.com: did not receive HSTS header airbnb.com: did not receive HSTS header aircomms.com: did not receive HSTS header @@ -141,9 +140,9 @@ alarmsystemreviews.com: did not receive HSTS header albertopimienta.com: did not receive HSTS header alcazaar.com: could not connect to host alecvannoten.be: did not receive HSTS header +alenan.org: could not connect to host alessandro.pw: did not receive HSTS header alethearose.com: did not receive HSTS header -alexandra-schulze.de: could not connect to host alexandre.sh: did not receive HSTS header alexhaydock.co.uk: [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] alexisabarca.com: did not receive HSTS header @@ -163,6 +162,7 @@ alpha.irccloud.com: could not connect to host 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 amaforums.org: could not connect to host @@ -193,6 +193,7 @@ andymartin.cc: did not receive HSTS header anfsanchezo.co: could not connect to host anfsanchezo.me: could not connect to host anghami.com: did not receive HSTS header +anime.my: could not connect to host animeday.ml: could not connect to host animesfusion.com.br: could not connect to host animesharp.com: could not connect to host @@ -241,6 +242,7 @@ 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 armory.consulting: could not connect to host armory.supplies: could not connect to host @@ -257,12 +259,13 @@ asc16.com: could not connect to host asdpress.cn: could not connect to host aserver.co: could not connect to host asmui.ga: could not connect to host -asrob.eu: did not receive HSTS header +asrob.eu: could not connect to host ass.org.au: did not receive HSTS header assdecoeur.org: could not connect to host asset-alive.com: did not receive HSTS header asset-alive.net: did not receive HSTS header astrolpost.com: could not connect to host +astromelody.com: could not connect to host atavio.at: could not connect to host atavio.ch: could not connect to host atavio.de: did not receive HSTS header @@ -273,9 +276,11 @@ 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 +attilagyorffy.com: could not connect to host attimidesigns.com: did not receive HSTS header au.search.yahoo.com: max-age too low: 172800 aubiosales.com: did not receive HSTS header +aufmerksamkeitsstudie.com: could not connect to host aujapan.ru: could not connect to host aurainfosec.com.au: could not connect to host ausnah.me: could not connect to host @@ -287,7 +292,6 @@ auto-serwis.zgorzelec.pl: did not receive HSTS header auto4trade.nl: could not connect to host autojuhos.sk: did not receive HSTS header autokovrik-diskont.ru: did not receive HSTS header -automacity.com: could not connect to host autotsum.com: could not connect to host autumnwindsagility.com: could not connect to host auverbox.ovh: did not receive HSTS header @@ -296,6 +300,7 @@ av.de: did not receive HSTS header avec-ou-sans-ordonnance.fr: could not connect to host avinet.com: max-age too low: 0 awg-mode.de: did not receive HSTS header +awxg.com: could not connect to host axado.com.br: did not receive HSTS header axeny.com: did not receive HSTS header az.search.yahoo.com: did not receive HSTS header @@ -321,6 +326,7 @@ barely.sexy: did not receive HSTS header bashcode.ninja: could not connect to host basicsolutionsus.com: did not receive HSTS header bassh.net: did not receive HSTS header +baum.ga: did not receive HSTS header baumstark.ca: did not receive HSTS header bazarstupava.sk: did not receive HSTS header bcbsmagentprofile.com: could not connect to host @@ -329,7 +335,6 @@ bckp.de: could not connect to host bcm.com.au: max-age too low: 0 bcnx.de: max-age too low: 0 bcsytv.com: could not connect to host -bdikaros-network.net: could not connect to host be.search.yahoo.com: did not receive HSTS header beach-inspector.com: did not receive HSTS header beachi.es: could not connect to host @@ -356,9 +361,11 @@ bermytraq.bm: [Exception... "Component returned failure code: 0x80004005 (NS_ERR 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 betplanning.it: did not receive HSTS header bets.de: did not receive HSTS header +bettercrypto.org: could not connect to host bettween.com: could not connect to host betz.ro: did not receive HSTS header beulahtabernacle.com: could not connect to host @@ -434,7 +441,7 @@ bodybuilding-legends.com: could not connect to host bodyweightsolution.com: did not receive HSTS header boensou.com: did not receive HSTS header bogosity.se: could not connect to host -bohan.life: could not connect to host +bohan.life: did not receive HSTS header boltdata.io: did not receive HSTS header bonapp.restaurant: could not connect to host bonfi.net: did not receive HSTS header @@ -486,7 +493,6 @@ buhler.pro: did not receive HSTS header buildsaver.co.za: did not receive HSTS header built.by: did not receive HSTS header bulletpoint.cz: did not receive HSTS header -bulmafox.com: could not connect to host bumarkamoda.com: could not connect to host bunaken.asia: could not connect to host burian-server.cz: could not connect to host @@ -514,7 +520,6 @@ 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 -cadmail.nl: could not connect to host cadusilva.com: did not receive HSTS header cafe-scientifique.org.ec: could not connect to host caim.cz: did not receive HSTS header @@ -522,13 +527,11 @@ cajapopcorn.com: did not receive HSTS header cake.care: could not connect to host calgaryconstructionjobs.com: could not connect to host calix.com: max-age too low: 0 -call.me: did not receive HSTS header calltrackingreports.com: could not connect to host calvin.me: max-age too low: 2592000 calvinallen.net: could not connect to host calyxinstitute.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] camolist.com: could not connect to host -campbellsoftware.co.uk: could not connect to host canadiangamblingchoice.com: did not receive HSTS header cancelmyprofile.com: did not receive HSTS header candicontrols.com: did not receive HSTS header @@ -614,13 +617,12 @@ chris-web.info: could not connect to host chriskyrouac.com: could not connect to host christiaandruif.nl: could not connect to host christianbro.gq: could not connect to host -christophheich.me: could not connect to host +christophheich.me: did not receive HSTS header chrisupjohn.com: could not connect to host chrome-devtools-frontend.appspot.com: did not receive HSTS header (error ignored - included regardless) chrome.google.com: did not receive HSTS header (error ignored - included regardless) chroniclesofgeorge.com: did not receive HSTS header chua.cf: could not connect to host -chxdf.net: did not receive HSTS header cidr.ml: could not connect to host cigarblogs.net: could not connect to host cigi.site: could not connect to host @@ -695,7 +697,6 @@ compalytics.com: could not connect to host comparejewelleryprices.co.uk: could not connect to host completionist.audio: could not connect to host computeremergency.com.au: did not receive HSTS header -computersystems.guru: could not connect to host concord-group.co.jp: did not receive HSTS header condesaelectronics.com: max-age too low: 0 confirm365.com: could not connect to host @@ -721,8 +722,8 @@ 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 +corzntin.fr: could not connect to host count.sh: could not connect to host -couragefound.org: 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 @@ -741,7 +742,6 @@ crazyhotseeds.com: did not receive HSTS header creativephysics.ml: could not connect to host creativeplayuk.com: did not receive HSTS header crendontech.com: could not connect to host -crestasantos.com: could not connect to host crestoncottage.com: could not connect to host criena.net: could not connect to host critical.today: could not connect to host @@ -755,7 +755,6 @@ crtvmgmt.com: could not connect to host crudysql.com: could not connect to host cruzr.xyz: could not connect to host crypt.guru: could not connect to host -cryptearth.de: could not connect to host cryptify.eu: did not receive HSTS header cryptobells.com: could not connect to host cryptobin.org: could not connect to host @@ -763,7 +762,6 @@ cryptojar.io: did not receive HSTS header cryptoki.fr: max-age too low: 7776000 cryptopush.com: did not receive HSTS header crysadm.com: max-age too low: 1 -crystalchandelierservices.com: could not connect to host crystalclassics.co.uk: did not receive HSTS header csapak.com: max-age too low: 0 csawctf.poly.edu: could not connect to host @@ -779,6 +777,7 @@ 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 +cupi.co: did not receive HSTS header cupidmentor.com: did not receive HSTS header curroapp.com: could not connect to host custe.rs: could not connect to host @@ -788,10 +787,10 @@ 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 +cysec.biz: could not connect to host dad256.tk: could not connect to host dah5.com: did not receive HSTS header dailystormerpodcasts.com: did not receive HSTS header -daimadi.com: could not connect to host dakrib.net: could not connect to host dalingk.co: could not connect to host dango.in: did not receive HSTS header @@ -799,7 +798,6 @@ daniel-steuer.de: did not receive HSTS header danieldk.eu: did not receive HSTS header danielworthy.com: did not receive HSTS header danijobs.com: could not connect to host -dannyrohde.de: could not connect to host danpiel.net: could not connect to host danrl.de: did not receive HSTS header daolerp.xyz: could not connect to host @@ -811,6 +809,7 @@ darkengine.io: could not connect to host darkhole.cn: could not connect to host darknebula.space: could not connect to host darkpony.ru: could not connect to host +darrenellis.xyz: did not receive HSTS header dashburst.com: did not receive HSTS header dashnimorad.com: did not receive HSTS header data-abundance.com: could not connect to host @@ -874,7 +873,6 @@ deux.solutions: could not connect to host deuxsol.com: could not connect to host deuxsolutions.com: could not connect to host devcu.net: did not receive HSTS header -devdesco.com: could not connect to host devh.de: did not receive HSTS header devincrow.me: could not connect to host devinfo.net: did not receive HSTS header @@ -890,13 +888,13 @@ digitaldaddy.net: could not connect to host digitalriver.tk: could not connect to host digitalskillswap.com: could not connect to host dinamoelektrik.com: max-age too low: 0 +dinkum.online: could not connect to host dirk-weise.de: could not connect to host discoveringdocker.com: did not receive HSTS header discovery.lookout.com: did not receive HSTS header dislocated.de: did not receive HSTS header dissimulo.me: could not connect to host dittvertshus.no: could not connect to host -diycc.org: could not connect to host dizihocasi.com: did not receive HSTS header dizorg.net: could not connect to host dj4et.de: did not receive HSTS header @@ -914,12 +912,10 @@ doeswindowssuckforeveryoneorjustme.com: could not connect to host dogbox.se: did not receive HSTS header dohosting.ru: could not connect to host dokan.online: could not connect to host -doku-gilde.de: could not connect to host dollarstore24.com: could not connect to host dollywiki.co.uk: could not connect to host dolphin-cloud.com: could not connect to host dolphincorp.co.uk: could not connect to host -domadillo.com: could not connect to host domaris.de: did not receive HSTS header dominique-mueller.de: did not receive HSTS header donttrustrobots.nl: could not connect to host @@ -961,6 +957,7 @@ duch.cloud: could not connect to host duesee.org: could not connect to host duria.de: max-age too low: 3600 dwhd.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] +dworzak.ch: could not connect to host dycontrol.de: could not connect to host dylanscott.com.au: did not receive HSTS header dymersion.com: did not receive HSTS header @@ -996,6 +993,7 @@ edp-collaborative.com: max-age too low: 2500 eduvance.in: 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 ego-world.org: could not connect to host @@ -1007,6 +1005,8 @@ ekostecki.de: did not receive HSTS header el-soul.com: did not receive HSTS header elaintehtaat.fi: did not receive HSTS header elanguest.pl: could not connect to host +elbetech.net: could not connect to host +eldinhadzic.com: could not connect to host electricianforum.co.uk: could not connect to host electromc.com: could not connect to host elemprendedor.com.ve: could not connect to host @@ -1032,10 +1032,6 @@ enargia.jp: max-age too low: 0 encode.space: did not receive HSTS header encoder.pw: could not connect to host encrypted.google.com: did not receive HSTS header (error ignored - included regardless) -endohaus.ca: could not connect to host -endohaus.com: could not connect to host -endohaus.eu: could not connect to host -endohaus.us: could not connect to host endzeit-architekten.com: did not receive HSTS header engelwerbung.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] englishforums.com: could not connect to host @@ -1063,6 +1059,7 @@ erawanarifnugroho.com: did not receive HSTS header eressea.xyz: did not receive HSTS header ericbond.net: could not connect to host ericyl.com: did not receive HSTS header +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 @@ -1075,6 +1072,7 @@ esclear.de: did not receive HSTS header escotour.com: did not receive HSTS header esec.rs: did not receive HSTS header espra.com: could not connect to host +esquonic.com: could not connect to host essexcosmeticdentists.co.uk: did not receive HSTS header essexghosthunters.co.uk: did not receive HSTS header estilosapeca.com: could not connect to host @@ -1091,7 +1089,7 @@ euph.eu: could not connect to host euren.se: could not connect to host euroshop24.net: could not connect to host evantage.org: could not connect to host -evdenevenakliyatankara.pw: could not connect to host +evdenevenakliyatankara.pw: did not receive HSTS header everybooks.com: max-age too low: 60 everylab.org: could not connect to host evi.be: did not receive HSTS header @@ -1138,6 +1136,7 @@ fasset.jp: could not connect to host fastopen.ml: could not connect to host fatgeekflix.net: could not connect to host fatherhood.gov: did not receive HSTS header +fatlossguide.xyz: could not connect to host fatox.de: could not connect to host fatwin.pw: could not connect to host fayolle.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] @@ -1244,6 +1243,7 @@ frontmin.com: did not receive HSTS header frost-ci.xyz: could not connect to host fruitusers.com: could not connect to host frusky.net: could not connect to host +fsf.moe: 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 @@ -1259,6 +1259,7 @@ futureyouhealth.com: did not receive HSTS header fx-rk.com: did not receive HSTS header fysiohaenraets.nl: did not receive HSTS header fzn.io: could not connect to host +g01.in.ua: could not connect to host g2a.co: did not receive HSTS header g2g.com: did not receive HSTS header g4w.co: did not receive HSTS header (error ignored - included regardless) @@ -1289,7 +1290,7 @@ gatilagata.com.br: did not receive HSTS header gdpventure.com: max-age too low: 0 gedankenbude.info: did not receive HSTS header geekbundle.org: did not receive HSTS header -geekcast.co.uk: could not connect to host +geekcast.co.uk: did not receive HSTS header geli-graphics.com: did not receive HSTS header gem-indonesia.net: could not connect to host genuu.com: could not connect to host @@ -1358,6 +1359,7 @@ gogold-g.com: could not connect to host gold24.in: did not receive HSTS header goldendata.io: could not connect to host goldminer.ga: could not connect to host +goldpros.com: did not receive HSTS header golocal-media.de: did not receive HSTS header gonzalosanchez.mx: did not receive HSTS header goodenough.nz: did not receive HSTS header @@ -1365,7 +1367,6 @@ goodwin43.ru: did not receive HSTS header google: could not connect to host (error ignored - included regardless) googlemail.com: did not receive HSTS header (error ignored - included regardless) googleplex.com: did not receive HSTS header (error ignored - included regardless) -goolok.com: did not receive HSTS header gorilla-gym.site: could not connect to host goto.google.com: did not receive HSTS header (error ignored - included regardless) gottcode.org: did not receive HSTS header @@ -1380,6 +1381,8 @@ graph.no: did not receive HSTS header gravity-net.de: could not connect to host graycell.net: could not connect to host grazetech.com: could not connect to host +greboid.co.uk: could not connect to host +greboid.com: could not connect to host greenhillantiques.co.uk: did not receive HSTS header greenvines.com.tw: did not receive HSTS header gregorytlee.me: did not receive HSTS header @@ -1434,6 +1437,7 @@ hakugin.org: could not connect to host halo.red: could not connect to host hancc.net: did not receive HSTS header hanfu.la: could not connect to host +hang333.pw: could not connect to host hannover-banditen.de: did not receive HSTS header hao2taiwan.com: max-age too low: 0 haozi.me: could not connect to host @@ -1476,6 +1480,7 @@ helpmebuild.com: did not receive HSTS header hemdal.se: could not connect to host hencagon.com: could not connect to host henriknoerr.com: could not connect to host +hepteract.us: did not receive HSTS header hermes-net.de: did not receive HSTS header herpaderp.net: did not receive HSTS header herzbotschaft.de: did not receive HSTS header @@ -1509,7 +1514,6 @@ 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 -hostedbgp.net: 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 @@ -1529,11 +1533,11 @@ http418.xyz: could not connect to host httpstatuscode418.xyz: could not connect to host hu.search.yahoo.com: did not receive HSTS header huarongdao.com: did not receive HSTS header -hugofs.com: could not connect to host hugosleep.com.au: did not receive HSTS header humblefinances.com: could not connect to host humeurs.net: could not connect to host humpteedumptee.in: did not receive HSTS header +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 hydra.ws: could not connect to host hyper69.com: did not receive HSTS header @@ -1700,6 +1704,7 @@ jamesbywater.me.uk: could not connect to host jamesconroyfinn.com: did not receive HSTS header jamesdoell.com: could not connect to host jamesdoylephoto.com: did not receive HSTS header +jamesf.xyz: could not connect to host jamesmorrison.me: did not receive HSTS header jamourtney.com: could not connect to host jan27.org: did not receive HSTS header @@ -1730,7 +1735,6 @@ 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 -jdh8.org: could not connect to host jeff393.com: could not connect to host jefftickle.com: could not connect to host jenjoit.de: could not connect to host @@ -1758,7 +1762,6 @@ jinbo123.com: did not receive HSTS header jkb.pics: could not connect to host jkbuster.com: could not connect to host jmdekker.it: could not connect to host -jmk.hu: did not receive HSTS header joakimalgroy.com: could not connect to host jobmedic.com: did not receive HSTS header joedavison.me: could not connect to host @@ -1789,7 +1792,6 @@ jualautoclave.com: did not receive HSTS header jualssh.com: could not connect to host juliamweber.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] julian-kipka.de: did not receive HSTS header -julibear.com: could not connect to host jumbox.xyz: could not connect to host junaos.xyz: did not receive HSTS header junge-selbsthilfe.info: could not connect to host @@ -1802,7 +1804,6 @@ 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 -jznet.org: 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 @@ -1815,6 +1816,7 @@ kamikano.com: 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 +kasilag.me: did not receive HSTS header katiaetdavid.fr: could not connect to host katproxy.online: could not connect to host katproxy.site: could not connect to host @@ -1842,7 +1844,6 @@ kgxtech.com: max-age too low: 2592000 kickass.al: could not connect to host kid-dachau.de: did not receive HSTS header kiel-media.de: did not receive HSTS header -kilianvalkhof.com: did not receive HSTS header kimpost.org: could not connect to host kinderwagen-test24.de: could not connect to host kingmanhall.org: could not connect to host @@ -1850,10 +1851,10 @@ kinnon.enterprises: could not connect to host kinogb.net: max-age too low: 0 kionetworks.com: did not receive HSTS header kipira.com: could not connect to host -kirbear.com: could not connect to host kirkforcongress.com: could not connect to host kirkforsenate.com: did not receive HSTS header 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 @@ -1891,7 +1892,6 @@ kr.search.yahoo.com: did not receive HSTS header kraynik.com: could not connect to host kredite.sale: could not connect to host kriegt.es: could not connect to host -krislamoureux.com: 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 @@ -1962,7 +1962,6 @@ leopold.email: could not connect to host leopoldina.net: did not receive HSTS header leopotamgroup.com: could not connect to host leovanna.co.uk: [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] -leppis-it.de: could not connect to host lerasenglish.com: did not receive HSTS header lerner.moscow: did not receive HSTS header les-corsaires.net: could not connect to host @@ -1996,7 +1995,6 @@ lifestylehunter.co.uk: did not receive HSTS header lifetimemoneymachine.com: did not receive HSTS header lightarmory.com: could not connect to host lightpaste.com: could not connect to host -likeaross.com: could not connect to host lillpopp.eu: max-age too low: 10 lilpwny.com: could not connect to host limalama.eu: max-age too low: 1 @@ -2005,7 +2003,7 @@ limpido.it: could not connect to host lindberg.io: did not receive HSTS header lingros-test.tk: could not connect to host linguaquote.com: did not receive HSTS header -linkenheil.org: could not connect to host +linkages.org: could not connect to host linmi.cc: did not receive HSTS header linorman1997.me: could not connect to host linuxeyecandy.com: could not connect to host @@ -2022,6 +2020,7 @@ loafbox.com: 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) +login.gov: could not connect to host loginseite.com: could not connect to host loli.bz: could not connect to host lolicore.ch: could not connect to host @@ -2075,7 +2074,6 @@ luxwatch.com: could not connect to host lv.search.yahoo.com: did not receive HSTS header lzkill.com: could not connect to host m-ali.xyz: did not receive HSTS header -m-plan.com: did not receive HSTS header m.gparent.org: could not connect to host m.nu: did not receive HSTS header m3-gmbh.de: did not receive HSTS header @@ -2085,6 +2083,7 @@ maartenvandekamp.nl: did not receive HSTS header macbolo.com: could not connect to host macchaberrycream.com: could not connect to host macchedil.com: did not receive HSTS header +macgeneral.de: did not receive HSTS header madars.org: did not receive HSTS header maddin.ga: could not connect to host madebymagnitude.com: did not receive HSTS header @@ -2211,11 +2210,10 @@ mijn-email.org: could not connect to host mikaelemilsson.net: did not receive HSTS header mikeburns.com: could not connect to host mikeg.de: did not receive HSTS header -mikek.work: did not receive HSTS header mikeology.org: could not connect to host mikonmaa.fi: could not connect to host miku.be: could not connect to host -miku.hatsune.my: could not connect to host +miku.hatsune.my: max-age too low: 5184000 milesgeek.com: did not receive HSTS header mindoktor.se: did not receive HSTS header minecraftserverz.com: could not connect to host @@ -2264,6 +2262,7 @@ moparscape.org: did not receive HSTS header mor.gl: could not connect to host morbitzer.de: did not receive HSTS header morethanadream.lv: could not connect to host +morganino.eu: could not connect to host moriz.net: could not connect to host morningcalculation.com: could not connect to host morotech.com.br: max-age too low: 2592000 @@ -2329,7 +2328,6 @@ mystudy.me: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR myvirtualserver.com: max-age too low: 2592000 myzone.com: did not receive HSTS header mziulu.me: could not connect to host -n-soft.info: could not connect to host n0psled.nl: could not connect to host n2x.in: could not connect to host n4l.pw: could not connect to host @@ -2358,8 +2356,6 @@ 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 -ndtblog.com: could not connect to host -ndtmarket.place: could not connect to host near.st: did not receive HSTS header neel.ch: could not connect to host neftaly.com: did not receive HSTS header @@ -2407,7 +2403,7 @@ nicestresser.fr: could not connect to host nicky.io: did not receive HSTS header nicolasbettag.me: could not connect to host niconiconi.xyz: could not connect to host -niconode.com: could not connect to host +niconode.com: did not receive HSTS header nien.chat: could not connect to host nightx.uk: 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] @@ -2424,7 +2420,6 @@ nmctest.net: could not connect to host nnya.cat: did not receive HSTS header no17sifangjie.cc: could not connect to host nocallaghan.com: could not connect to host -nocit.dk: could not connect to host nocs.cn: did not receive HSTS header noctinus.tk: could not connect to host nodari.com.ar: did not receive HSTS header @@ -2482,7 +2477,7 @@ nutsandboltsmedia.com: did not receive HSTS header nwgh.org: max-age too low: 86400 nyantec.com: did not receive HSTS header nysepho.pw: could not connect to host -nystart.no: did not receive HSTS header +nystart.no: could not connect to host nz.search.yahoo.com: max-age too low: 172800 nzb.cat: max-age too low: 7776000 o0o.one: did not receive HSTS header @@ -2493,7 +2488,7 @@ occentus.net: did not receive HSTS header ochaken.cf: could not connect to host octothorpe.club: could not connect to host odifi.com: could not connect to host -odin.xxx: could not connect to host +odin.xxx: did not receive HSTS header oe8.bet: could not connect to host ofcourselanguages.com: could not connect to host offshore-firma.org: could not connect to host @@ -2619,7 +2614,6 @@ paste.linode.com: could not connect to host pastebin.linode.com: could not connect to host pastenib.com: could not connect to host paster.li: did not receive HSTS header -pastie.se: did not receive HSTS header patientinsight.net: could not connect to host patrz.eu: could not connect to host patt.us: did not receive HSTS header @@ -2633,6 +2627,8 @@ payroll.ch: did not receive HSTS header pbapp.net: did not receive HSTS header pbprint.ru: max-age too low: 0 pc-nf.de: could not connect to host +pcfeuerwehr.de: did not receive HSTS header +pcfun.net: did not receive HSTS header pchax.net: did not receive HSTS header peissen.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] pekkapikkarainen.fi: could not connect to host @@ -2673,7 +2669,7 @@ pippen.io: could not connect to host pir9.com: max-age too low: 2592000 piratedb.com: could not connect to host piratedot.com: could not connect to host -piratelist.online: did not receive HSTS header +piratelist.online: could not connect to host piratenlogin.de: could not connect to host pirati.cz: max-age too low: 604800 pirlitu.com: did not receive HSTS header @@ -2709,6 +2705,7 @@ poleartschool.com: could not connect to host polimat.org: could not connect to host politically-incorrect.xyz: could not connect to host politologos.org: could not connect to host +polymathematician.com: could not connect to host polypho.nyc: could not connect to host pompompoes.com: could not connect to host pontokay.com.br: did not receive HSTS header @@ -2721,6 +2718,7 @@ 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 @@ -2744,12 +2742,13 @@ privacyrup.net: could not connect to host prnt.li: did not receive HSTS header pro-zone.com: could not connect to host prodpad.com: did not receive HSTS header -production.vn: did not receive HSTS header +production.vn: could not connect to host professionalboundaries.com: did not receive HSTS header profi-durchgangsmelder.de: did not receive HSTS header profundr.com: could not connect to host progg.no: could not connect to host prohostonline.fi: could not connect to host +proj.org.cn: could not connect to host promecon-gmbh.de: did not receive HSTS header prontolight.com: did not receive HSTS header prosocialmachines.com: could not connect to host @@ -2760,7 +2759,6 @@ 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.date: could not connect to host prxio.site: could not connect to host prytkov.com: did not receive HSTS header psw.academy: did not receive HSTS header @@ -2782,6 +2780,7 @@ pypi-mirrors.org: could not connect to host pypi-status.org: could not connect to host pyplo.org: did not receive HSTS header pypt.lt: did not receive HSTS header +pzme.me: did not receive HSTS header q2.si: did not receive HSTS header qingxuan.info: max-age too low: 864000 qinxi1992.com: did not receive HSTS header @@ -2796,7 +2795,6 @@ quantumcourse.org: did not receive HSTS header queercoders.com: did not receive HSTS header quemmeliga.com: could not connect to host questsandrewards.com: could not connect to host -quotehex.com: did not receive HSTS header quranserver.net: could not connect to host qvi.st: did not receive HSTS header qwaser.fr: could not connect to host @@ -2814,7 +2812,7 @@ randomcage.com: did not receive HSTS header rankthespot.com: did not receive HSTS header rapidresearch.me: could not connect to host rapidthunder.io: could not connect to host -rasing.me: did not receive HSTS header +rasing.me: could not connect to host ratajczak.fr: could not connect to host raulfraile.net: could not connect to host rawet.se: did not receive HSTS header @@ -2848,12 +2846,12 @@ relisten.nl: did not receive HSTS header remitatm.com: could not connect to host remodela.com.ve: could not connect to host renem.net: did not receive HSTS header -renideo.fr: did not receive HSTS header renlong.org: could not connect to host renrenss.com: did not receive HSTS header rent-a-coder.de: did not receive HSTS header rentcarassist.com: could not connect to host renteater.com: could not connect to host +repaxan.com: could not connect to host replacemychina.com: did not receive HSTS header reprolife.co.uk: max-age too low: 0 res-rheingau.de: did not receive HSTS header @@ -2890,11 +2888,9 @@ 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 -robandjanine.com: could not connect to host robertglastra.com: could not connect to host robigalia.org: did not receive HSTS header robin.info: could not connect to host -robspc.repair: could not connect to host robtex.org: did not receive HSTS header rochman.id: could not connect to host rocksberg.net: did not receive HSTS header @@ -2977,10 +2973,8 @@ saveaward.gov: could not connect to host saveyour.biz: did not receive HSTS header sawamura-rental.com: did not receive HSTS header sb-group.dk: did not receive HSTS header -sbiewald.de: could not connect to host sby.de: did not receive HSTS header sc4le.com: could not connect to host -scannabi.com: could not connect to host schmitz.link: could not connect to host schnell-gold.com: could not connect to host schoop.me: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] @@ -3001,7 +2995,6 @@ scriptict.nl: could not connect to host sdmoscow.ru: could not connect to host sdrobs.com: did not receive HSTS header sdsl-speedtest.de: could not connect to host -sealbaker.com: 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 @@ -3047,6 +3040,7 @@ servercode.ca: did not receive HSTS header serverdensity.io: did not receive HSTS header servergno.me: did not receive HSTS header seryo.moe: could not connect to host +sesha.co.za: could not connect to host setphaserstostun.org: could not connect to host setuid.de: could not connect to host setuid.io: did not receive HSTS header @@ -3156,7 +3150,7 @@ 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: could not connect to host +socomponents.co.uk: did not receive HSTS header sodiao.cc: could not connect to host sogeek.me: did not receive HSTS header solidfuelappliancespares.co.uk: did not receive HSTS header @@ -3168,12 +3162,14 @@ somethingnew.xyz: did not receive HSTS header songzhuolun.com: did not receive HSTS header sonic.sk: max-age too low: 0 sonicrainboom.rocks: did not receive HSTS header +sorenstudios.com: could not connect to host sotar.us: [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] sotor.de: did not receive HSTS header soulboy.io: did not receive HSTS header soulema.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] soulfulglamour.uk: could not connect to host sourcelair.com: did not receive HSTS header +sourceway.de: could not connect to host southside-crew.club: could not connect to host southworcestershiregpservices.co.uk: could not connect to host souyar.de: could not connect to host @@ -3212,7 +3208,7 @@ sproutconnections.com: did not receive HSTS header sprybear.com: did not receive HSTS header square.gs: could not connect to host squatldf.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no] -sqzryang.com: max-age too low: 604800 +sqzryang.com: did not receive HSTS header srevilak.net: did not receive HSTS header srna.sk: could not connect to host srrr.ca: could not connect to host @@ -3275,6 +3271,7 @@ subbing.work: could not connect to host subdimension.org: did not receive HSTS header subrosa.io: could not connect to host subtitle.rip: could not connect to host +succ.in: could not connect to host sudo.li: did not receive HSTS header suite73.org: could not connect to host suitocracy.com: did not receive HSTS header @@ -3315,7 +3312,7 @@ szaszm.tk: max-age too low: 0 t.facebook.com: did not receive HSTS header taabe.xyz: did not receive HSTS header tablet.facebook.com: did not receive HSTS header -tacomafia.net: did not receive HSTS header +tacomafia.net: could not connect to host tadigitalstore.com: could not connect to host tafoma.com: did not receive HSTS header tageau.com: could not connect to host @@ -3416,7 +3413,6 @@ theurbanyoga.com: did not receive HSTS header thevintagenews.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] thezonders.com: did not receive HSTS header thierfreund.de: could not connect to host -thingies.site: could not connect to host thinkcoding.de: could not connect to host thinlyveiledcontempt.com: could not connect to host thirdpartytrade.com: did not receive HSTS header @@ -3459,13 +3455,13 @@ 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 +tokage.me: could not connect to host tokyopopline.com: did not receive HSTS header tollmanz.com: did not receive HSTS header tomberek.info: 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 -tomharris.tech: could not connect to host 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] @@ -3536,7 +3532,6 @@ tyrelius.com: did not receive HSTS header tyroproducts.eu: did not receive HSTS header tzappa.net: could not connect to host u-blox.com: did not receive HSTS header -u03.fr: could not connect to host ua.search.yahoo.com: did not receive HSTS header ubicloud.de: could not connect to host ublox.com: did not receive HSTS header @@ -3592,6 +3587,7 @@ usercare.com: did not receive HSTS header userify.com: did not receive HSTS header ustr.gov: max-age too low: 86400 utumno.ch: could not connect to host +uvarov.pw: could not connect to host uy.search.yahoo.com: did not receive HSTS header uz.search.yahoo.com: did not receive HSTS header uzmandroid.com: could not connect to host @@ -3618,7 +3614,7 @@ vcdove.com: did not receive HSTS header vcr.re: could not connect to host veblen.com: could not connect to host vechkasov.ru: did not receive HSTS header -vemokin.net: did not receive HSTS header +vemokin.net: could not connect to host venixplays-stream.ml: could not connect to host verifikatorindonesia.com: could not connect to host vermontcareergateway.org: could not connect to host @@ -3635,12 +3631,14 @@ videomuz.com: did not receive HSTS header vidz.ga: could not connect to host vieaw.com: could not connect to host viktorsvantesson.net: did not receive HSTS header +villenvinkit.com: could not connect to host vincentkooijman.at: did not receive HSTS header vincentkooijman.nl: did not receive HSTS header vintageheartcoffee.com: did not receive HSTS header vio.no: did not receive HSTS header viperdns.com: could not connect to host vipmusic.ga: could not connect to host +vipnettikasinoklubi.com: could not connect to host visitbroadstairs.com: could not connect to host vissanum.com: did not receive HSTS header vistarait.com: did not receive HSTS header @@ -3748,7 +3746,6 @@ whyworldhot.com: could not connect to host wienholding.at: max-age too low: 0 wieninternational.at: could not connect to host wiire.me: could not connect to host -wikileaks.com: could not connect to host wilf1rst.com: could not connect to host william.si: did not receive HSTS header willosagiede.com: did not receive HSTS header @@ -3905,7 +3902,6 @@ 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 -yutabon.com: could not connect to host yux.io: did not receive HSTS header yzal.io: could not connect to host z33.ch: did not receive HSTS header @@ -3935,7 +3931,7 @@ 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 -zhaojin97.cn: max-age too low: 604800 +zhaojin97.cn: did not receive HSTS header zhendingresources.com: max-age too low: 0 zigcore.com.br: could not connect to host zirtue.io: could not connect to host diff --git a/security/manager/ssl/nsSTSPreloadList.inc b/security/manager/ssl/nsSTSPreloadList.inc index 54e00f5776bb..5c4630684755 100644 --- a/security/manager/ssl/nsSTSPreloadList.inc +++ b/security/manager/ssl/nsSTSPreloadList.inc @@ -8,7 +8,7 @@ /*****************************************************************************/ #include -const PRTime gPreloadListExpirationTime = INT64_C(1490883721216000); +const PRTime gPreloadListExpirationTime = INT64_C(1490970907144000); static const char kSTSHostTable[] = { /* "007-preisvergleich.de", true */ '0', '0', '7', '-', 'p', 'r', 'e', 'i', 's', 'v', 'e', 'r', 'g', 'l', 'e', 'i', 'c', 'h', '.', 'd', 'e', '\0', @@ -85,8 +85,8 @@ static const char kSTSHostTable[] = { /* "1js.de", true */ '1', 'j', 's', '.', 'd', 'e', '\0', /* "1k8b.com", true */ '1', 'k', '8', 'b', '.', 'c', 'o', 'm', '\0', /* "1km.ro", true */ '1', 'k', 'm', '.', 'r', 'o', '\0', - /* "1on1on1.de", true */ '1', 'o', 'n', '1', 'o', 'n', '1', '.', 'd', 'e', '\0', - /* "1on1on1.tv", true */ '1', 'o', 'n', '1', 'o', 'n', '1', '.', 't', 'v', '\0', + /* "1on1on1.de", false */ '1', 'o', 'n', '1', 'o', 'n', '1', '.', 'd', 'e', '\0', + /* "1on1on1.tv", false */ '1', 'o', 'n', '1', 'o', 'n', '1', '.', 't', 'v', '\0', /* "1pw.ca", true */ '1', 'p', 'w', '.', 'c', 'a', '\0', /* "1px.tv", true */ '1', 'p', 'x', '.', 't', 'v', '\0', /* "1q365a.com", true */ '1', 'q', '3', '6', '5', 'a', '.', 'c', 'o', 'm', '\0', @@ -101,6 +101,7 @@ static const char kSTSHostTable[] = { /* "2-cpu.de", true */ '2', '-', 'c', 'p', 'u', '.', 'd', 'e', '\0', /* "2.wtf", true */ '2', '.', 'w', 't', 'f', '\0', /* "2048game.co.uk", true */ '2', '0', '4', '8', 'g', 'a', 'm', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0', + /* "20hs.cn", true */ '2', '0', 'h', 's', '.', 'c', 'n', '\0', /* "21.co.uk", true */ '2', '1', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "247healthshop.com", true */ '2', '4', '7', 'h', 'e', 'a', 'l', 't', 'h', 's', 'h', 'o', 'p', '.', 'c', 'o', 'm', '\0', /* "247loan.com", true */ '2', '4', '7', 'l', 'o', 'a', 'n', '.', 'c', 'o', 'm', '\0', @@ -155,7 +156,6 @@ static const char kSTSHostTable[] = { /* "4-1-where.com", true */ '4', '-', '1', '-', 'w', 'h', 'e', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "4-it.de", true */ '4', '-', 'i', 't', '.', 'd', 'e', '\0', /* "403.ch", true */ '4', '0', '3', '.', 'c', 'h', '\0', - /* "404.sh", true */ '4', '0', '4', '.', 's', 'h', '\0', /* "404404.info", true */ '4', '0', '4', '4', '0', '4', '.', 'i', 'n', 'f', 'o', '\0', /* "4096bit.de", true */ '4', '0', '9', '6', 'b', 'i', 't', '.', 'd', 'e', '\0', /* "41-where.com", true */ '4', '1', '-', 'w', 'h', 'e', 'r', 'e', '.', 'c', 'o', 'm', '\0', @@ -319,9 +319,9 @@ static const char kSTSHostTable[] = { /* "adamricheimer.com", true */ 'a', 'd', 'a', 'm', 'r', 'i', 'c', 'h', 'e', 'i', 'm', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "adams.dk", true */ 'a', 'd', 'a', 'm', 's', '.', 'd', 'k', '\0', /* "adamstas.com", true */ 'a', 'd', 'a', 'm', 's', 't', 'a', 's', '.', 'c', 'o', 'm', '\0', - /* "adapt-elektronik.com", true */ 'a', 'd', 'a', 'p', 't', '-', 'e', 'l', 'e', 'k', 't', 'r', 'o', 'n', 'i', 'k', '.', 'c', 'o', 'm', '\0', - /* "adapt.de", true */ 'a', 'd', 'a', 'p', 't', '.', 'd', 'e', '\0', - /* "adapti.de", true */ 'a', 'd', 'a', 'p', 't', 'i', '.', 'd', 'e', '\0', + /* "adapt-elektronik.com", false */ 'a', 'd', 'a', 'p', 't', '-', 'e', 'l', 'e', 'k', 't', 'r', 'o', 'n', 'i', 'k', '.', 'c', 'o', 'm', '\0', + /* "adapt.de", false */ 'a', 'd', 'a', 'p', 't', '.', 'd', 'e', '\0', + /* "adapti.de", false */ 'a', 'd', 'a', 'p', 't', 'i', '.', 'd', 'e', '\0', /* "adaptivemechanics.edu.au", true */ 'a', 'd', 'a', 'p', 't', 'i', 'v', 'e', 'm', 'e', 'c', 'h', 'a', 'n', 'i', 'c', 's', '.', 'e', 'd', 'u', '.', 'a', 'u', '\0', /* "adastra.re", true */ 'a', 'd', 'a', 's', 't', 'r', 'a', '.', 'r', 'e', '\0', /* "adayinthelifeof.nl", true */ 'a', 'd', 'a', 'y', 'i', 'n', 't', 'h', 'e', 'l', 'i', 'f', 'e', 'o', 'f', '.', 'n', 'l', '\0', @@ -369,7 +369,7 @@ static const char kSTSHostTable[] = { /* "adventure-inn.com", true */ 'a', 'd', 'v', 'e', 'n', 't', 'u', 'r', 'e', '-', 'i', 'n', 'n', '.', 'c', 'o', 'm', '\0', /* "adventureally.com", true */ 'a', 'd', 'v', 'e', 'n', 't', 'u', 'r', 'e', 'a', 'l', 'l', 'y', '.', 'c', 'o', 'm', '\0', /* "adventureforest.de", false */ 'a', 'd', 'v', 'e', 'n', 't', 'u', 'r', 'e', 'f', 'o', 'r', 'e', 's', 't', '.', 'd', 'e', '\0', - /* "adventures.de", true */ 'a', 'd', 'v', 'e', 'n', 't', 'u', 'r', 'e', 's', '.', 'd', 'e', '\0', + /* "adventures.de", false */ 'a', 'd', 'v', 'e', 'n', 't', 'u', 'r', 'e', 's', '.', 'd', 'e', '\0', /* "advocatenalkmaar.org", true */ 'a', 'd', 'v', 'o', 'c', 'a', 't', 'e', 'n', 'a', 'l', 'k', 'm', 'a', 'a', 'r', '.', 'o', 'r', 'g', '\0', /* "adxperience.com", true */ 'a', 'd', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', '.', 'c', 'o', 'm', '\0', /* "adzuna.ca", true */ 'a', 'd', 'z', 'u', 'n', 'a', '.', 'c', 'a', '\0', @@ -428,6 +428,7 @@ static const char kSTSHostTable[] = { /* "ahxxm.com", true */ 'a', 'h', 'x', 'x', 'm', '.', 'c', 'o', 'm', '\0', /* "ai-english.jp", true */ 'a', 'i', '-', 'e', 'n', 'g', 'l', 'i', 's', 'h', '.', 'j', 'p', '\0', /* "aia.de", true */ 'a', 'i', 'a', '.', 'd', 'e', '\0', + /* "aidanmontare.net", true */ 'a', 'i', 'd', 'a', 'n', 'm', 'o', 'n', 't', 'a', 'r', 'e', '.', 'n', 'e', 't', '\0', /* "aids.gov", true */ 'a', 'i', 'd', 's', '.', 'g', 'o', 'v', '\0', /* "aie.de", true */ 'a', 'i', 'e', '.', 'd', 'e', '\0', /* "aiesecarad.ro", true */ 'a', 'i', 'e', 's', 'e', 'c', 'a', 'r', 'a', 'd', '.', 'r', 'o', '\0', @@ -493,12 +494,12 @@ static const char kSTSHostTable[] = { /* "alecrust.com", true */ 'a', 'l', 'e', 'c', 'r', 'u', 's', 't', '.', 'c', 'o', 'm', '\0', /* "aleksib.fi", true */ 'a', 'l', 'e', 'k', 's', 'i', 'b', '.', 'f', 'i', '\0', /* "alela.fr", true */ 'a', 'l', 'e', 'l', 'a', '.', 'f', 'r', '\0', - /* "alenan.org", true */ 'a', 'l', 'e', 'n', 'a', 'n', '.', 'o', 'r', 'g', '\0', /* "alertboxx.com", true */ 'a', 'l', 'e', 'r', 't', 'b', 'o', 'x', 'x', '.', 'c', 'o', 'm', '\0', /* "alertwire.com", true */ 'a', 'l', 'e', 'r', 't', 'w', 'i', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "alessandroz.pro", true */ 'a', 'l', 'e', 's', 's', 'a', 'n', 'd', 'r', 'o', 'z', '.', 'p', 'r', 'o', '\0', /* "alex-ross.co.uk", true */ 'a', 'l', 'e', 'x', '-', 'r', 'o', 's', 's', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "alexanderschimpf.de", true */ 'a', 'l', 'e', 'x', 'a', 'n', 'd', 'e', 'r', 's', 'c', 'h', 'i', 'm', 'p', 'f', '.', 'd', 'e', '\0', + /* "alexandra-schulze.de", true */ 'a', 'l', 'e', 'x', 'a', 'n', 'd', 'r', 'a', '-', 's', 'c', 'h', 'u', 'l', 'z', 'e', '.', 'd', 'e', '\0', /* "alexbaker.org", true */ 'a', 'l', 'e', 'x', 'b', 'a', 'k', 'e', 'r', '.', 'o', 'r', 'g', '\0', /* "alexberts.ch", true */ 'a', 'l', 'e', 'x', 'b', 'e', 'r', 't', 's', '.', 'c', 'h', '\0', /* "alexei.su", true */ 'a', 'l', 'e', 'x', 'e', 'i', '.', 's', 'u', '\0', @@ -562,7 +563,6 @@ static const char kSTSHostTable[] = { /* "alt.org", true */ 'a', 'l', 't', '.', 'o', 'r', 'g', '\0', /* "altahrim.net", true */ 'a', 'l', 't', 'a', 'h', 'r', 'i', 'm', '.', 'n', 'e', 't', '\0', /* "altedirect.com", true */ 'a', 'l', 't', 'e', 'd', 'i', 'r', 'e', 'c', 't', '.', 'c', 'o', 'm', '\0', - /* "alterbaum.net", true */ 'a', 'l', 't', 'e', 'r', 'b', 'a', 'u', 'm', '.', 'n', 'e', 't', '\0', /* "alternativet.party", true */ 'a', 'l', 't', 'e', 'r', 'n', 'a', 't', 'i', 'v', 'e', 't', '.', 'p', 'a', 'r', 't', 'y', '\0', /* "altesses.eu", true */ 'a', 'l', 't', 'e', 's', 's', 'e', 's', '.', 'e', 'u', '\0', /* "altestore.com", true */ 'a', 'l', 't', 'e', 's', 't', 'o', 'r', 'e', '.', 'c', 'o', 'm', '\0', @@ -678,7 +678,6 @@ static const char kSTSHostTable[] = { /* "angristan.fr", true */ 'a', 'n', 'g', 'r', 'i', 's', 't', 'a', 'n', '.', 'f', 'r', '\0', /* "angularjs.org", true */ 'a', 'n', 'g', 'u', 'l', 'a', 'r', 'j', 's', '.', 'o', 'r', 'g', '\0', /* "animalnet.de", false */ 'a', 'n', 'i', 'm', 'a', 'l', 'n', 'e', 't', '.', 'd', 'e', '\0', - /* "anime.my", false */ 'a', 'n', 'i', 'm', 'e', '.', 'm', 'y', '\0', /* "anitaalbersen.nl", true */ 'a', 'n', 'i', 't', 'a', 'a', 'l', 'b', 'e', 'r', 's', 'e', 'n', '.', 'n', 'l', '\0', /* "anitube-nocookie.ch", true */ 'a', 'n', 'i', 't', 'u', 'b', 'e', '-', 'n', 'o', 'c', 'o', 'o', 'k', 'i', 'e', '.', 'c', 'h', '\0', /* "anitube.ch", true */ 'a', 'n', 'i', 't', 'u', 'b', 'e', '.', 'c', 'h', '\0', @@ -815,7 +814,6 @@ static const char kSTSHostTable[] = { /* "areatrend.com", true */ 'a', 'r', 'e', 'a', 't', 'r', 'e', 'n', 'd', '.', 'c', 'o', 'm', '\0', /* "arendburgers.nl", true */ 'a', 'r', 'e', 'n', 'd', 'b', 'u', 'r', 'g', 'e', 'r', 's', '.', 'n', 'l', '\0', /* "argekultur.at", true */ 'a', 'r', 'g', 'e', 'k', 'u', 'l', 't', 'u', 'r', '.', 'a', 't', '\0', - /* "argh.io", true */ 'a', 'r', 'g', 'h', '.', 'i', 'o', '\0', /* "arguggi.co.uk", true */ 'a', 'r', 'g', 'u', 'g', 'g', 'i', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "ariege-pyrenees.net", true */ 'a', 'r', 'i', 'e', 'g', 'e', '-', 'p', 'y', 'r', 'e', 'n', 'e', 'e', 's', '.', 'n', 'e', 't', '\0', /* "arima.co.ke", true */ 'a', 'r', 'i', 'm', 'a', '.', 'c', 'o', '.', 'k', 'e', '\0', @@ -916,7 +914,6 @@ static const char kSTSHostTable[] = { /* "asta-bar.de", true */ 'a', 's', 't', 'a', '-', 'b', 'a', 'r', '.', 'd', 'e', '\0', /* "astengox.com", true */ 'a', 's', 't', 'e', 'n', 'g', 'o', 'x', '.', 'c', 'o', 'm', '\0', /* "astrath.net", true */ 'a', 's', 't', 'r', 'a', 't', 'h', '.', 'n', 'e', 't', '\0', - /* "astromelody.com", true */ 'a', 's', 't', 'r', 'o', 'm', 'e', 'l', 'o', 'd', 'y', '.', 'c', 'o', 'm', '\0', /* "asuhe.cc", true */ 'a', 's', 'u', 'h', 'e', '.', 'c', 'c', '\0', /* "asun.co", true */ 'a', 's', 'u', 'n', '.', 'c', 'o', '\0', /* "asurepay.cc", true */ 'a', 's', 'u', 'r', 'e', 'p', 'a', 'y', '.', 'c', 'c', '\0', @@ -955,7 +952,6 @@ static const char kSTSHostTable[] = { /* "atrinik.org", true */ 'a', 't', 'r', 'i', 'n', 'i', 'k', '.', 'o', 'r', 'g', '\0', /* "atte.fi", true */ 'a', 't', 't', 'e', '.', 'f', 'i', '\0', /* "attic118.com", true */ 'a', 't', 't', 'i', 'c', '1', '1', '8', '.', 'c', 'o', 'm', '\0', - /* "attilagyorffy.com", true */ 'a', 't', 't', 'i', 'l', 'a', 'g', 'y', 'o', 'r', 'f', 'f', 'y', '.', 'c', 'o', 'm', '\0', /* "attogproductions.com", true */ 'a', 't', 't', 'o', 'g', 'p', 'r', 'o', 'd', 'u', 'c', 't', 'i', 'o', 'n', 's', '.', 'c', 'o', 'm', '\0', /* "attogtech.com", true */ 'a', 't', 't', 'o', 'g', 't', 'e', 'c', 'h', '.', 'c', 'o', 'm', '\0', /* "attorney.org.il", true */ 'a', 't', 't', 'o', 'r', 'n', 'e', 'y', '.', 'o', 'r', 'g', '.', 'i', 'l', '\0', @@ -968,7 +964,6 @@ static const char kSTSHostTable[] = { /* "auditmatrix.com", true */ 'a', 'u', 'd', 'i', 't', 'm', 'a', 't', 'r', 'i', 'x', '.', 'c', 'o', 'm', '\0', /* "auditos.com", true */ 'a', 'u', 'd', 'i', 't', 'o', 's', '.', 'c', 'o', 'm', '\0', /* "auf-feindgebiet.de", true */ 'a', 'u', 'f', '-', 'f', 'e', 'i', 'n', 'd', 'g', 'e', 'b', 'i', 'e', 't', '.', 'd', 'e', '\0', - /* "aufmerksamkeitsstudie.com", true */ 'a', 'u', 'f', 'm', 'e', 'r', 'k', 's', 'a', 'm', 'k', 'e', 'i', 't', 's', 's', 't', 'u', 'd', 'i', 'e', '.', 'c', 'o', 'm', '\0', /* "augaware.org", true */ 'a', 'u', 'g', 'a', 'w', 'a', 'r', 'e', '.', 'o', 'r', 'g', '\0', /* "augias.org", true */ 'a', 'u', 'g', 'i', 'a', 's', '.', 'o', 'r', 'g', '\0', /* "augiero.it", true */ 'a', 'u', 'g', 'i', 'e', 'r', 'o', '.', 'i', 't', '\0', @@ -998,6 +993,7 @@ static const char kSTSHostTable[] = { /* "autoauctionsvirginia.com", true */ 'a', 'u', 't', 'o', 'a', 'u', 'c', 't', 'i', 'o', 'n', 's', 'v', 'i', 'r', 'g', 'i', 'n', 'i', 'a', '.', 'c', 'o', 'm', '\0', /* "autodeploy.it", true */ 'a', 'u', 't', 'o', 'd', 'e', 'p', 'l', 'o', 'y', '.', 'i', 't', '\0', /* "autoledky.sk", true */ 'a', 'u', 't', 'o', 'l', 'e', 'd', 'k', 'y', '.', 's', 'k', '\0', + /* "automacity.com", true */ 'a', 'u', 't', 'o', 'm', 'a', 'c', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0', /* "autoskola.hr", true */ 'a', 'u', 't', 'o', 's', 'k', 'o', 'l', 'a', '.', 'h', 'r', '\0', /* "autoskole.hr", true */ 'a', 'u', 't', 'o', 's', 'k', 'o', 'l', 'e', '.', 'h', 'r', '\0', /* "auxetek.se", true */ 'a', 'u', 'x', 'e', 't', 'e', 'k', '.', 's', 'e', '\0', @@ -1029,7 +1025,6 @@ static const char kSTSHostTable[] = { /* "awaremi-tai.com", true */ 'a', 'w', 'a', 'r', 'e', 'm', 'i', '-', 't', 'a', 'i', '.', 'c', 'o', 'm', '\0', /* "awk.tw", true */ 'a', 'w', 'k', '.', 't', 'w', '\0', /* "aww.moe", true */ 'a', 'w', 'w', '.', 'm', 'o', 'e', '\0', - /* "awxg.com", true */ 'a', 'w', 'x', 'g', '.', 'c', 'o', 'm', '\0', /* "axka.com", false */ 'a', 'x', 'k', 'a', '.', 'c', 'o', 'm', '\0', /* "axolotlfarm.org", true */ 'a', 'x', 'o', 'l', 'o', 't', 'l', 'f', 'a', 'r', 'm', '.', 'o', 'r', 'g', '\0', /* "axolsoft.com", true */ 'a', 'x', 'o', 'l', 's', 'o', 'f', 't', '.', 'c', 'o', 'm', '\0', @@ -1170,7 +1165,6 @@ static const char kSTSHostTable[] = { /* "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', @@ -1200,6 +1194,7 @@ static const char kSTSHostTable[] = { /* "bcweightlifting.ca", true */ 'b', 'c', 'w', 'e', 'i', 'g', 'h', 't', 'l', 'i', 'f', 't', 'i', 'n', 'g', '.', 'c', 'a', '\0', /* "bddemir.com", true */ 'b', 'd', 'd', 'e', 'm', 'i', 'r', '.', 'c', 'o', 'm', '\0', /* "bde-epitech.fr", true */ 'b', 'd', 'e', '-', 'e', 'p', 'i', 't', 'e', 'c', 'h', '.', 'f', 'r', '\0', + /* "bdikaros-network.net", true */ 'b', 'd', 'i', 'k', 'a', 'r', 'o', 's', '-', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'n', 'e', 't', '\0', /* "be-ka-tec.de", true */ 'b', 'e', '-', 'k', 'a', '-', 't', 'e', 'c', '.', 'd', 'e', '\0', /* "be-real.life", true */ 'b', 'e', '-', 'r', 'e', 'a', 'l', '.', 'l', 'i', 'f', 'e', '\0', /* "beamitapp.com", true */ 'b', 'e', 'a', 'm', 'i', 't', 'a', 'p', 'p', '.', 'c', 'o', 'm', '\0', @@ -1312,11 +1307,9 @@ static const char kSTSHostTable[] = { /* "betaworx.de", true */ 'b', 'e', 't', 'a', 'w', 'o', 'r', 'x', '.', 'd', 'e', '\0', /* "betaworx.eu", true */ 'b', 'e', 't', 'a', 'w', 'o', 'r', 'x', '.', 'e', 'u', '\0', /* "betcafearena.ro", false */ 'b', 'e', 't', 'c', 'a', 'f', 'e', 'a', 'r', 'e', 'n', 'a', '.', 'r', 'o', '\0', - /* "betlander.com", true */ 'b', 'e', 't', 'l', 'a', 'n', 'd', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "betonmoney.com", true */ 'b', 'e', 't', 'o', 'n', 'm', 'o', 'n', 'e', 'y', '.', 'c', 'o', 'm', '\0', /* "betpamm.com", true */ 'b', 'e', 't', 'p', 'a', 'm', 'm', '.', 'c', 'o', 'm', '\0', /* "betterbabyshop.com.au", true */ 'b', 'e', 't', 't', 'e', 'r', 'b', 'a', 'b', 'y', 's', 'h', 'o', 'p', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', - /* "bettercrypto.org", true */ 'b', 'e', 't', 't', 'e', 'r', 'c', 'r', 'y', 'p', 't', 'o', '.', 'o', 'r', 'g', '\0', /* "betterhelp.com", true */ 'b', 'e', 't', 't', 'e', 'r', 'h', 'e', 'l', 'p', '.', 'c', 'o', 'm', '\0', /* "betterlifemakers.com", true */ 'b', 'e', 't', 't', 'e', 'r', 'l', 'i', 'f', 'e', 'm', 'a', 'k', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0', /* "bettertest.it", true */ 'b', 'e', 't', 't', 'e', 'r', 't', 'e', 's', 't', '.', 'i', 't', '\0', @@ -1799,6 +1792,7 @@ static const char kSTSHostTable[] = { /* "bulktrade.de", true */ 'b', 'u', 'l', 'k', 't', 'r', 'a', 'd', 'e', '.', 'd', 'e', '\0', /* "bullbits.com", true */ 'b', 'u', 'l', 'l', 'b', 'i', 't', 's', '.', 'c', 'o', 'm', '\0', /* "bulldog-hosting.de", true */ 'b', 'u', 'l', 'l', 'd', 'o', 'g', '-', 'h', 'o', 's', 't', 'i', 'n', 'g', '.', 'd', 'e', '\0', + /* "bulmafox.com", true */ 'b', 'u', 'l', 'm', 'a', 'f', 'o', 'x', '.', 'c', 'o', 'm', '\0', /* "bunbun.be", false */ 'b', 'u', 'n', 'b', 'u', 'n', '.', 'b', 'e', '\0', /* "bund-von-theramore.de", true */ 'b', 'u', 'n', 'd', '-', 'v', 'o', 'n', '-', 't', 'h', 'e', 'r', 'a', 'm', 'o', 'r', 'e', '.', 'd', 'e', '\0', /* "bundaberg.com", true */ 'b', 'u', 'n', 'd', 'a', 'b', 'e', 'r', 'g', '.', 'c', 'o', 'm', '\0', @@ -1897,6 +1891,7 @@ static const char kSTSHostTable[] = { /* "caceis.bank", true */ 'c', 'a', 'c', 'e', 'i', 's', '.', 'b', 'a', 'n', 'k', '\0', /* "cachethq.io", true */ 'c', 'a', 'c', 'h', 'e', 't', 'h', 'q', '.', 'i', 'o', '\0', /* "cackette.com", true */ 'c', 'a', 'c', 'k', 'e', 't', 't', 'e', '.', 'c', 'o', 'm', '\0', + /* "cadmail.nl", true */ 'c', 'a', 'd', 'm', 'a', 'i', 'l', '.', 'n', 'l', '\0', /* "cadoth.net", true */ 'c', 'a', 'd', 'o', 't', 'h', '.', 'n', 'e', 't', '\0', /* "caesarkabalan.com", true */ 'c', 'a', 'e', 's', 'a', 'r', 'k', 'a', 'b', 'a', 'l', 'a', 'n', '.', 'c', 'o', 'm', '\0', /* "caesreon.com", true */ 'c', 'a', 'e', 's', 'r', 'e', 'o', 'n', '.', 'c', 'o', 'm', '\0', @@ -1919,6 +1914,7 @@ static const char kSTSHostTable[] = { /* "calgoty.com", true */ 'c', 'a', 'l', 'g', 'o', 't', 'y', '.', 'c', 'o', 'm', '\0', /* "calibreapp.com", false */ 'c', 'a', 'l', 'i', 'b', 'r', 'e', 'a', 'p', 'p', '.', 'c', 'o', 'm', '\0', /* "calibso.net", true */ 'c', 'a', 'l', 'i', 'b', 's', 'o', '.', 'n', 'e', 't', '\0', + /* "call.me", false */ 'c', 'a', 'l', 'l', '.', 'm', 'e', '\0', /* "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', @@ -1941,6 +1937,7 @@ static const char kSTSHostTable[] = { /* "campaign-ad.com", true */ 'c', 'a', 'm', 'p', 'a', 'i', 'g', 'n', '-', 'a', 'd', '.', 'c', 'o', 'm', '\0', /* "campaign.gov.uk", true */ 'c', 'a', 'm', 'p', 'a', 'i', 'g', 'n', '.', 'g', 'o', 'v', '.', 'u', 'k', '\0', /* "campaignelves.com", true */ 'c', 'a', 'm', 'p', 'a', 'i', 'g', 'n', 'e', 'l', 'v', 'e', 's', '.', 'c', 'o', 'm', '\0', + /* "campbellsoftware.co.uk", false */ 'c', 'a', 'm', 'p', 'b', 'e', 'l', 'l', 's', 'o', 'f', 't', 'w', 'a', 'r', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "campbrainybunch.com", true */ 'c', 'a', 'm', 'p', 'b', 'r', 'a', 'i', 'n', 'y', 'b', 'u', 'n', 'c', 'h', '.', 'c', 'o', 'm', '\0', /* "camperdays.de", true */ 'c', 'a', 'm', 'p', 'e', 'r', 'd', 'a', 'y', 's', '.', 'd', 'e', '\0', /* "campermanaustralia.com", true */ 'c', 'a', 'm', 'p', 'e', 'r', 'm', 'a', 'n', 'a', 'u', 's', 't', 'r', 'a', 'l', 'i', 'a', '.', 'c', 'o', 'm', '\0', @@ -2254,6 +2251,7 @@ static const char kSTSHostTable[] = { /* "chun.pro", true */ 'c', 'h', 'u', 'n', '.', 'p', 'r', 'o', '\0', /* "chunche.net", true */ 'c', 'h', 'u', 'n', 'c', 'h', 'e', '.', 'n', 'e', 't', '\0', /* "churchthemes.com", true */ 'c', 'h', 'u', 'r', 'c', 'h', 't', 'h', 'e', 'm', 'e', 's', '.', 'c', 'o', 'm', '\0', + /* "chxdf.net", true */ 'c', 'h', 'x', 'd', 'f', '.', 'n', 'e', 't', '\0', /* "cianmawhinney.xyz", true */ 'c', 'i', 'a', 'n', 'm', 'a', 'w', 'h', 'i', 'n', 'n', 'e', 'y', '.', 'x', 'y', 'z', '\0', /* "ciat.no", false */ 'c', 'i', 'a', 't', '.', 'n', 'o', '\0', /* "cidbot.com", true */ 'c', 'i', 'd', 'b', 'o', 't', '.', 'c', 'o', 'm', '\0', @@ -2524,6 +2522,7 @@ static const char kSTSHostTable[] = { /* "compucorner.com.mx", true */ 'c', 'o', 'm', 'p', 'u', 'c', 'o', 'r', 'n', 'e', 'r', '.', 'c', 'o', 'm', '.', 'm', 'x', '\0', /* "compucorner.mx", true */ 'c', 'o', 'm', 'p', 'u', 'c', 'o', 'r', 'n', 'e', 'r', '.', 'm', 'x', '\0', /* "computerhilfe-feucht.de", true */ 'c', 'o', 'm', 'p', 'u', 't', 'e', 'r', 'h', 'i', 'l', 'f', 'e', '-', 'f', 'e', 'u', 'c', 'h', 't', '.', 'd', 'e', '\0', + /* "computersystems.guru", true */ 'c', 'o', 'm', 'p', 'u', 't', 'e', 'r', 's', 'y', 's', 't', 'e', 'm', 's', '.', 'g', 'u', 'r', 'u', '\0', /* "comssa.org.au", true */ 'c', 'o', 'm', 's', 's', 'a', '.', 'o', 'r', 'g', '.', 'a', 'u', '\0', /* "concentrade.de", true */ 'c', 'o', 'n', 'c', 'e', 'n', 't', 'r', 'a', 'd', 'e', '.', 'd', 'e', '\0', /* "conclave.global", true */ 'c', 'o', 'n', 'c', 'l', 'a', 'v', 'e', '.', 'g', 'l', 'o', 'b', 'a', 'l', '\0', @@ -2532,7 +2531,7 @@ static const char kSTSHostTable[] = { /* "condosforcash.com", true */ 'c', 'o', 'n', 'd', 'o', 's', 'f', 'o', 'r', 'c', 'a', 's', 'h', '.', 'c', 'o', 'm', '\0', /* "confiancefoundation.org", true */ 'c', 'o', 'n', 'f', 'i', 'a', 'n', 'c', 'e', 'f', 'o', 'u', 'n', 'd', 'a', 't', 'i', 'o', 'n', '.', 'o', 'r', 'g', '\0', /* "config.schokokeks.org", false */ 'c', 'o', 'n', 'f', 'i', 'g', '.', 's', 'c', 'h', 'o', 'k', 'o', 'k', 'e', 'k', 's', '.', 'o', 'r', 'g', '\0', - /* "confiwall.de", true */ 'c', 'o', 'n', 'f', 'i', 'w', 'a', 'l', 'l', '.', 'd', 'e', '\0', + /* "confiwall.de", false */ 'c', 'o', 'n', 'f', 'i', 'w', 'a', 'l', 'l', '.', 'd', 'e', '\0', /* "conflux.tw", true */ 'c', 'o', 'n', 'f', 'l', 'u', 'x', '.', 't', 'w', '\0', /* "confucio.cl", true */ 'c', 'o', 'n', 'f', 'u', 'c', 'i', 'o', '.', 'c', 'l', '\0', /* "conjugacao.com.br", true */ 'c', 'o', 'n', 'j', 'u', 'g', 'a', 'c', 'a', 'o', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', @@ -2609,7 +2608,6 @@ static const char kSTSHostTable[] = { /* "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', /* "cosmeticasimple.com", true */ 'c', 'o', 's', 'm', 'e', 't', 'i', 'c', 'a', 's', 'i', 'm', 'p', 'l', 'e', '.', 'c', 'o', 'm', '\0', /* "cosmundi.de", true */ 'c', 'o', 's', 'm', 'u', 'n', 'd', 'i', '.', 'd', 'e', '\0', /* "costablancavoorjou.com", true */ 'c', 'o', 's', 't', 'a', 'b', 'l', 'a', 'n', 'c', 'a', 'v', 'o', 'o', 'r', 'j', 'o', 'u', '.', 'c', 'o', 'm', '\0', @@ -2621,6 +2619,7 @@ static const char kSTSHostTable[] = { /* "countermail.com", true */ 'c', 'o', 'u', 'n', 't', 'e', 'r', 'm', 'a', 'i', 'l', '.', 'c', 'o', 'm', '\0', /* "countybankdel.com", true */ 'c', 'o', 'u', 'n', 't', 'y', 'b', 'a', 'n', 'k', 'd', 'e', 'l', '.', 'c', 'o', 'm', '\0', /* "couponcodeq.com", true */ 'c', 'o', 'u', 'p', 'o', 'n', 'c', 'o', 'd', 'e', 'q', '.', 'c', 'o', 'm', '\0', + /* "couragefound.org", true */ 'c', 'o', 'u', 'r', 'a', 'g', 'e', 'f', 'o', 'u', 'n', 'd', '.', 'o', 'r', 'g', '\0', /* "coursera.org", true */ 'c', 'o', 'u', 'r', 's', 'e', 'r', 'a', '.', 'o', 'r', 'g', '\0', /* "courses.nl", true */ 'c', 'o', 'u', 'r', 's', 'e', 's', '.', 'n', 'l', '\0', /* "courtlistener.com", true */ 'c', 'o', 'u', 'r', 't', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'c', 'o', 'm', '\0', @@ -2673,6 +2672,7 @@ static const char kSTSHostTable[] = { /* "creep.im", true */ 'c', 'r', 'e', 'e', 'p', '.', 'i', 'm', '\0', /* "crefelder.com", true */ 'c', 'r', 'e', 'f', 'e', 'l', 'd', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "crepererum.net", true */ 'c', 'r', 'e', 'p', 'e', 'r', 'e', 'r', 'u', 'm', '.', 'n', 'e', 't', '\0', + /* "crestasantos.com", true */ 'c', 'r', 'e', 's', 't', 'a', 's', 'a', 'n', 't', 'o', 's', '.', 'c', 'o', 'm', '\0', /* "crimson.no", true */ 'c', 'r', 'i', 'm', 's', 'o', 'n', '.', 'n', 'o', '\0', /* "cristiandeluxe.com", true */ 'c', 'r', 'i', 's', 't', 'i', 'a', 'n', 'd', 'e', 'l', 'u', 'x', 'e', '.', 'c', 'o', 'm', '\0', /* "critcola.com", true */ 'c', 'r', 'i', 't', 'c', 'o', 'l', 'a', '.', 'c', 'o', 'm', '\0', @@ -2696,6 +2696,7 @@ static const char kSTSHostTable[] = { /* "crushroom.com", true */ 'c', 'r', 'u', 's', 'h', 'r', 'o', 'o', 'm', '.', 'c', 'o', 'm', '\0', /* "crute.me", true */ 'c', 'r', 'u', 't', 'e', '.', 'm', 'e', '\0', /* "crvv.me", true */ 'c', 'r', 'v', 'v', '.', 'm', 'e', '\0', + /* "cryptearth.de", true */ 'c', 'r', 'y', 'p', 't', 'e', 'a', 'r', 't', 'h', '.', 'd', 'e', '\0', /* "crypticshell.co.uk", true */ 'c', 'r', 'y', 'p', 't', 'i', 'c', 's', 'h', 'e', 'l', 'l', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "crypto.cat", false */ 'c', 'r', 'y', 'p', 't', 'o', '.', 'c', 'a', 't', '\0', /* "crypto.graphics", true */ 'c', 'r', 'y', 'p', 't', 'o', '.', 'g', 'r', 'a', 'p', 'h', 'i', 'c', 's', '\0', @@ -2717,6 +2718,7 @@ static const char kSTSHostTable[] = { /* "cryptophobia.nl", true */ 'c', 'r', 'y', 'p', 't', 'o', 'p', 'h', 'o', 'b', 'i', 'a', '.', 'n', 'l', '\0', /* "cryptoseb.pw", true */ 'c', 'r', 'y', 'p', 't', 'o', 's', 'e', 'b', '.', 'p', 'w', '\0', /* "cryptract.co", true */ 'c', 'r', 'y', 'p', 't', 'r', 'a', 'c', 't', '.', 'c', 'o', '\0', + /* "crystalchandelierservices.com", true */ 'c', 'r', 'y', 's', 't', 'a', 'l', 'c', 'h', 'a', 'n', 'd', 'e', 'l', 'i', 'e', 'r', 's', 'e', 'r', 'v', 'i', 'c', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "crystone.me", true */ 'c', 'r', 'y', 's', 't', 'o', 'n', 'e', '.', 'm', 'e', '\0', /* "cs-ubladego.pl", true */ 'c', 's', '-', 'u', 'b', 'l', 'a', 'd', 'e', 'g', 'o', '.', 'p', 'l', '\0', /* "csabg.org", true */ 'c', 's', 'a', 'b', 'g', '.', 'o', 'r', 'g', '\0', @@ -2766,7 +2768,6 @@ static const char kSTSHostTable[] = { /* "cup.al", true */ 'c', 'u', 'p', '.', 'a', 'l', '\0', /* "cupcake.io", true */ 'c', 'u', 'p', 'c', 'a', 'k', 'e', '.', 'i', 'o', '\0', /* "cupcake.is", true */ 'c', 'u', 'p', 'c', 'a', 'k', 'e', '.', 'i', 's', '\0', - /* "cupi.co", true */ 'c', 'u', 'p', 'i', '.', 'c', 'o', '\0', /* "curacao-license.com", true */ 'c', 'u', 'r', 'a', 'c', 'a', 'o', '-', 'l', 'i', 'c', 'e', 'n', 's', 'e', '.', 'c', 'o', 'm', '\0', /* "curiosity-driven.org", true */ 'c', 'u', 'r', 'i', 'o', 's', 'i', 't', 'y', '-', 'd', 'r', 'i', 'v', 'e', 'n', '.', 'o', 'r', 'g', '\0', /* "curlybracket.co.uk", true */ 'c', 'u', 'r', 'l', 'y', 'b', 'r', 'a', 'c', 'k', 'e', 't', '.', 'c', 'o', '.', 'u', 'k', '\0', @@ -2839,7 +2840,6 @@ static const char kSTSHostTable[] = { /* "cyph.im", true */ 'c', 'y', 'p', 'h', '.', 'i', 'm', '\0', /* "cyph.video", true */ 'c', 'y', 'p', 'h', '.', 'v', 'i', 'd', 'e', 'o', '\0', /* "cyprus-company-service.com", true */ 'c', 'y', 'p', 'r', 'u', 's', '-', 'c', 'o', 'm', 'p', 'a', 'n', 'y', '-', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'c', 'o', 'm', '\0', - /* "cysec.biz", true */ 'c', 'y', 's', 'e', 'c', '.', 'b', 'i', 'z', '\0', /* "cytadel.fr", true */ 'c', 'y', 't', 'a', 'd', 'e', 'l', '.', 'f', 'r', '\0', /* "czakey.net", true */ 'c', 'z', 'a', 'k', 'e', 'y', '.', 'n', 'e', 't', '\0', /* "czbix.com", true */ 'c', 'z', 'b', 'i', 'x', '.', 'c', 'o', 'm', '\0', @@ -2870,6 +2870,7 @@ static const char kSTSHostTable[] = { /* "dailybits.be", true */ 'd', 'a', 'i', 'l', 'y', 'b', 'i', 't', 's', '.', 'b', 'e', '\0', /* "dailyenglishchallenge.com", true */ 'd', 'a', 'i', 'l', 'y', 'e', 'n', 'g', 'l', 'i', 's', 'h', 'c', 'h', 'a', 'l', 'l', 'e', 'n', 'g', 'e', '.', 'c', 'o', 'm', '\0', /* "dailylifefinancial.com", false */ 'd', 'a', 'i', 'l', 'y', 'l', 'i', 'f', 'e', 'f', 'i', 'n', 'a', 'n', 'c', 'i', 'a', 'l', '.', 'c', 'o', 'm', '\0', + /* "daimadi.com", true */ 'd', 'a', 'i', 'm', 'a', 'd', 'i', '.', 'c', 'o', 'm', '\0', /* "dairyshrine.org", true */ 'd', 'a', 'i', 'r', 'y', 's', 'h', 'r', 'i', 'n', 'e', '.', 'o', 'r', 'g', '\0', /* "daiwai.de", true */ 'd', 'a', 'i', 'w', 'a', 'i', '.', 'd', 'e', '\0', /* "daiweihu.com", true */ 'd', 'a', 'i', 'w', 'e', 'i', 'h', 'u', '.', 'c', 'o', 'm', '\0', @@ -2915,6 +2916,7 @@ static const char kSTSHostTable[] = { /* "dankim.de", false */ 'd', 'a', 'n', 'k', 'i', 'm', '.', 'd', 'e', '\0', /* "danny.fm", true */ 'd', 'a', 'n', 'n', 'y', '.', 'f', 'm', '\0', /* "dannycrichton.com", true */ 'd', 'a', 'n', 'n', 'y', 'c', 'r', 'i', 'c', 'h', 't', 'o', 'n', '.', 'c', 'o', 'm', '\0', + /* "dannyrohde.de", true */ 'd', 'a', 'n', 'n', 'y', 'r', 'o', 'h', 'd', 'e', '.', 'd', 'e', '\0', /* "danonsecurity.com", true */ 'd', 'a', 'n', 'o', 'n', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0', /* "danscomp.com", true */ 'd', 'a', 'n', 's', 'c', 'o', 'm', 'p', '.', 'c', 'o', 'm', '\0', /* "danseressen.nl", true */ 'd', 'a', 'n', 's', 'e', 'r', 'e', 's', 's', 'e', 'n', '.', 'n', 'l', '\0', @@ -2942,12 +2944,11 @@ static const char kSTSHostTable[] = { /* "darkwater.info", true */ 'd', 'a', 'r', 'k', 'w', 'a', 't', 'e', 'r', '.', 'i', 'n', 'f', 'o', '\0', /* "darlo.co.uk", false */ 'd', 'a', 'r', 'l', 'o', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "darom.jp", true */ 'd', 'a', 'r', 'o', 'm', '.', 'j', 'p', '\0', - /* "darrenellis.xyz", true */ 'd', 'a', 'r', 'r', 'e', 'n', 'e', 'l', 'l', 'i', 's', '.', 'x', 'y', 'z', '\0', /* "darrenm.net", true */ 'd', 'a', 'r', 'r', 'e', 'n', 'm', '.', 'n', 'e', 't', '\0', /* "darrienworth.com", true */ 'd', 'a', 'r', 'r', 'i', 'e', 'n', 'w', 'o', 'r', 't', 'h', '.', 'c', 'o', 'm', '\0', /* "darth-sonic.de", true */ 'd', 'a', 'r', 't', 'h', '-', 's', 'o', 'n', 'i', 'c', '.', 'd', 'e', '\0', /* "darwinkel.net", false */ 'd', 'a', 'r', 'w', 'i', 'n', 'k', 'e', 'l', '.', 'n', 'e', 't', '\0', - /* "das-mediale-haus.de", true */ 'd', 'a', 's', '-', 'm', 'e', 'd', 'i', 'a', 'l', 'e', '-', 'h', 'a', 'u', 's', '.', 'd', 'e', '\0', + /* "das-mediale-haus.de", false */ 'd', 'a', 's', '-', 'm', 'e', 'd', 'i', 'a', 'l', 'e', '-', 'h', 'a', 'u', 's', '.', 'd', 'e', '\0', /* "dash-board.jp", false */ 'd', 'a', 's', 'h', '-', 'b', 'o', 'a', 'r', 'd', '.', 'j', 'p', '\0', /* "dash.rocks", true */ 'd', 'a', 's', 'h', '.', 'r', 'o', 'c', 'k', 's', '\0', /* "dashboard.yt", true */ 'd', 'a', 's', 'h', 'b', 'o', 'a', 'r', 'd', '.', 'y', 't', '\0', @@ -3124,7 +3125,7 @@ static const char kSTSHostTable[] = { /* "depeche-mode.moscow", true */ 'd', 'e', 'p', 'e', 'c', 'h', 'e', '-', 'm', 'o', 'd', 'e', '.', 'm', 'o', 's', 'c', 'o', 'w', '\0', /* "depechemode-live.com", true */ 'd', 'e', 'p', 'e', 'c', 'h', 'e', 'm', 'o', 'd', 'e', '-', 'l', 'i', 'v', 'e', '.', 'c', 'o', 'm', '\0', /* "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', + /* "der-stein-fluesterer.de", false */ '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', @@ -3141,7 +3142,7 @@ static const char kSTSHostTable[] = { /* "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', - /* "designhotel-kronjuwel.de", true */ 'd', 'e', 's', 'i', 'g', 'n', 'h', 'o', 't', 'e', 'l', '-', 'k', 'r', 'o', 'n', 'j', 'u', 'w', 'e', 'l', '.', 'd', 'e', '\0', + /* "designhotel-kronjuwel.de", false */ 'd', 'e', 's', 'i', 'g', 'n', 'h', 'o', 't', 'e', 'l', '-', 'k', 'r', 'o', 'n', 'j', 'u', 'w', 'e', 'l', '.', 'd', 'e', '\0', /* "designpilot.ch", true */ 'd', 'e', 's', 'i', 'g', 'n', 'p', 'i', 'l', 'o', 't', '.', 'c', 'h', '\0', /* "designsbyjanith.com", true */ 'd', 'e', 's', 'i', 'g', 'n', 's', 'b', 'y', 'j', 'a', 'n', 'i', 't', 'h', '.', 'c', 'o', 'm', '\0', /* "designthinking.or.jp", false */ 'd', 'e', 's', 'i', 'g', 'n', 't', 'h', 'i', 'n', 'k', 'i', 'n', 'g', '.', 'o', 'r', '.', 'j', 'p', '\0', @@ -3165,6 +3166,7 @@ static const char kSTSHostTable[] = { /* "devb.nl", true */ 'd', 'e', 'v', 'b', '.', 'n', 'l', '\0', /* "devct.cz", true */ 'd', 'e', 'v', 'c', 't', '.', 'c', 'z', '\0', /* "devcu.com", true */ 'd', 'e', 'v', 'c', 'u', '.', 'c', 'o', 'm', '\0', + /* "devdesco.com", true */ 'd', 'e', 'v', 'd', 'e', 's', 'c', 'o', '.', 'c', 'o', 'm', '\0', /* "devdom.io", true */ 'd', 'e', 'v', 'd', 'o', 'm', '.', 'i', 'o', '\0', /* "devdoodle.net", true */ 'd', 'e', 'v', 'd', 'o', 'o', 'd', 'l', 'e', '.', 'n', 'e', 't', '\0', /* "developer.mydigipass.com", false */ 'd', 'e', 'v', 'e', 'l', 'o', 'p', 'e', 'r', '.', 'm', 'y', 'd', 'i', 'g', 'i', 'p', 'a', 's', 's', '.', 'c', 'o', 'm', '\0', @@ -3249,7 +3251,7 @@ static const char kSTSHostTable[] = { /* "digidroom.be", true */ 'd', 'i', 'g', 'i', 'd', 'r', 'o', 'o', 'm', '.', 'b', 'e', '\0', /* "digihyp.ch", true */ 'd', 'i', 'g', 'i', 'h', 'y', 'p', '.', 'c', 'h', '\0', /* "digimagical.com", true */ 'd', 'i', 'g', 'i', 'm', 'a', 'g', 'i', 'c', 'a', 'l', '.', 'c', 'o', 'm', '\0', - /* "digimedia.cd", true */ 'd', 'i', 'g', 'i', 'm', 'e', 'd', 'i', 'a', '.', 'c', 'd', '\0', + /* "digimedia.cd", false */ 'd', 'i', 'g', 'i', 'm', 'e', 'd', 'i', 'a', '.', 'c', 'd', '\0', /* "digired.xyz", true */ 'd', 'i', 'g', 'i', 'r', 'e', 'd', '.', 'x', 'y', 'z', '\0', /* "digital-coach.it", false */ 'd', 'i', 'g', 'i', 't', 'a', 'l', '-', 'c', 'o', 'a', 'c', 'h', '.', 'i', 't', '\0', /* "digital-eastside.de", true */ 'd', 'i', 'g', 'i', 't', 'a', 'l', '-', 'e', 'a', 's', 't', 's', 'i', 'd', 'e', '.', 'd', 'e', '\0', @@ -3278,7 +3280,6 @@ static const char kSTSHostTable[] = { /* "dinepont.fr", true */ 'd', 'i', 'n', 'e', 'p', 'o', 'n', 't', '.', 'f', 'r', '\0', /* "dinge.xyz", true */ 'd', 'i', 'n', 'g', 'e', '.', 'x', 'y', 'z', '\0', /* "dingss.com", true */ 'd', 'i', 'n', 'g', 's', 's', '.', 'c', 'o', 'm', '\0', - /* "dinkum.online", true */ 'd', 'i', 'n', 'k', 'u', 'm', '.', 'o', 'n', 'l', 'i', 'n', 'e', '\0', /* "dinmtb.dk", true */ 'd', 'i', 'n', 'm', 't', 'b', '.', 'd', 'k', '\0', /* "dintillat.fr", true */ 'd', 'i', 'n', 't', 'i', 'l', 'l', 'a', 't', '.', 'f', 'r', '\0', /* "dintrafic.net", true */ 'd', 'i', 'n', 't', 'r', 'a', 'f', 'i', 'c', '.', 'n', 'e', 't', '\0', @@ -3320,6 +3321,7 @@ static const char kSTSHostTable[] = { /* "dixiediner.com", true */ 'd', 'i', 'x', 'i', 'e', 'd', 'i', 'n', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "dixmag.com", true */ 'd', 'i', 'x', 'm', 'a', 'g', '.', 'c', 'o', 'm', '\0', /* "diybook.at", true */ 'd', 'i', 'y', 'b', 'o', 'o', 'k', '.', 'a', 't', '\0', + /* "diycc.org", true */ 'd', 'i', 'y', 'c', 'c', '.', 'o', 'r', 'g', '\0', /* "djangoproject.com", true */ 'd', 'j', 'a', 'n', 'g', 'o', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'c', 'o', 'm', '\0', /* "djangosnippets.org", true */ 'd', 'j', 'a', 'n', 'g', 'o', 's', 'n', 'i', 'p', 'p', 'e', 't', 's', '.', 'o', 'r', 'g', '\0', /* "djlive.pl", true */ 'd', 'j', 'l', 'i', 'v', 'e', '.', 'p', 'l', '\0', @@ -3389,6 +3391,7 @@ static const char kSTSHostTable[] = { /* "dogfi.sh", true */ 'd', 'o', 'g', 'f', 'i', '.', 's', 'h', '\0', /* "doggieholic.net", true */ 'd', 'o', 'g', 'g', 'i', 'e', 'h', 'o', 'l', 'i', 'c', '.', 'n', 'e', 't', '\0', /* "dogoodbehappyllc.com", true */ 'd', 'o', 'g', 'o', 'o', 'd', 'b', 'e', 'h', 'a', 'p', 'p', 'y', 'l', 'l', 'c', '.', 'c', 'o', 'm', '\0', + /* "doku-gilde.de", true */ 'd', 'o', 'k', 'u', '-', 'g', 'i', 'l', 'd', 'e', '.', 'd', 'e', '\0', /* "dokuboard.com", true */ 'd', 'o', 'k', 'u', 'b', 'o', 'a', 'r', 'd', '.', 'c', 'o', 'm', '\0', /* "dokuraum.de", true */ 'd', 'o', 'k', 'u', 'r', 'a', 'u', 'm', '.', 'd', 'e', '\0', /* "dolarcanadense.com.br", true */ 'd', 'o', 'l', 'a', 'r', 'c', 'a', 'n', 'a', 'd', 'e', 'n', 's', 'e', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', @@ -3399,6 +3402,7 @@ static const char kSTSHostTable[] = { /* "dolphin-hosting.com", true */ 'd', 'o', 'l', 'p', 'h', 'i', 'n', '-', 'h', 'o', 's', 't', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "dolphin-it.de", true */ 'd', 'o', 'l', 'p', 'h', 'i', 'n', '-', 'i', 't', '.', 'd', 'e', '\0', /* "dolphinswithlasers.com", true */ 'd', 'o', 'l', 'p', 'h', 'i', 'n', 's', 'w', 'i', 't', 'h', 'l', 'a', 's', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0', + /* "domadillo.com", true */ 'd', 'o', 'm', 'a', 'd', 'i', 'l', 'l', 'o', '.', 'c', 'o', 'm', '\0', /* "domain001.info", true */ 'd', 'o', 'm', 'a', 'i', 'n', '0', '0', '1', '.', 'i', 'n', 'f', 'o', '\0', /* "domainexpress.de", true */ 'd', 'o', 'm', 'a', 'i', 'n', 'e', 'x', 'p', 'r', 'e', 's', 's', '.', 'd', 'e', '\0', /* "domainkauf.de", true */ 'd', 'o', 'm', 'a', 'i', 'n', 'k', 'a', 'u', 'f', '.', 'd', 'e', '\0', @@ -3516,7 +3520,7 @@ static const char kSTSHostTable[] = { /* "drpetervoigt.de", true */ 'd', 'r', 'p', 'e', 't', 'e', 'r', 'v', 'o', 'i', 'g', 't', '.', 'd', 'e', '\0', /* "drrr.chat", true */ 'd', 'r', 'r', 'r', '.', 'c', 'h', 'a', 't', '\0', /* "drrr.wiki", true */ 'd', 'r', 'r', 'r', '.', 'w', 'i', 'k', 'i', '\0', - /* "drschruefer.de", true */ 'd', 'r', 's', 'c', 'h', 'r', 'u', 'e', 'f', 'e', 'r', '.', 'd', 'e', '\0', + /* "drschruefer.de", false */ 'd', 'r', 's', 'c', 'h', 'r', 'u', 'e', 'f', 'e', 'r', '.', 'd', 'e', '\0', /* "drsturgeonfreitas.com", true */ 'd', 'r', 's', 't', 'u', 'r', 'g', 'e', 'o', 'n', 'f', 'r', 'e', 'i', 't', 'a', 's', '.', 'c', 'o', 'm', '\0', /* "drugagodba.si", true */ 'd', 'r', 'u', 'g', 'a', 'g', 'o', 'd', 'b', 'a', '.', 's', 'i', '\0', /* "drumbe.at", true */ 'd', 'r', 'u', 'm', 'b', 'e', '.', 'a', 't', '\0', @@ -3567,7 +3571,6 @@ static const char kSTSHostTable[] = { /* "dvotx.org", true */ 'd', 'v', 'o', 't', 'x', '.', 'o', 'r', 'g', '\0', /* "dvwc.org", true */ 'd', 'v', 'w', 'c', '.', 'o', 'r', 'g', '\0', /* "dwnld.me", true */ 'd', 'w', 'n', 'l', 'd', '.', 'm', 'e', '\0', - /* "dworzak.ch", true */ 'd', 'w', 'o', 'r', 'z', 'a', 'k', '.', 'c', 'h', '\0', /* "dwtm.ch", true */ 'd', 'w', 't', 'm', '.', 'c', 'h', '\0', /* "dxa.io", true */ 'd', 'x', 'a', '.', 'i', 'o', '\0', /* "dxgl.info", true */ 'd', 'x', 'g', 'l', '.', 'i', 'n', 'f', 'o', '\0', @@ -3708,7 +3711,6 @@ static const char kSTSHostTable[] = { /* "eff.org", true */ 'e', 'f', 'f', '.', 'o', 'r', 'g', '\0', /* "effectiveosgi.com", true */ 'e', 'f', 'f', 'e', 'c', 't', 'i', 'v', 'e', 'o', 's', 'g', 'i', '.', 'c', 'o', 'm', '\0', /* "effex.ru", true */ 'e', 'f', 'f', 'e', 'x', '.', 'r', 'u', '\0', - /* "effortlesshr.com", true */ 'e', 'f', 'f', 'o', 'r', 't', 'l', 'e', 's', 's', 'h', 'r', '.', 'c', 'o', 'm', '\0', /* "egfl.org.uk", true */ 'e', 'g', 'f', 'l', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0', /* "egge.com", true */ 'e', 'g', 'g', 'e', '.', 'c', 'o', 'm', '\0', /* "eggplant.today", true */ 'e', 'g', 'g', 'p', 'l', 'a', 'n', 't', '.', 't', 'o', 'd', 'a', 'y', '\0', @@ -3724,7 +3726,7 @@ static const char kSTSHostTable[] = { /* "ehuber.info", true */ 'e', 'h', 'u', 'b', 'e', 'r', '.', 'i', 'n', 'f', 'o', '\0', /* "eichornenterprises.com", true */ 'e', 'i', 'c', 'h', 'o', 'r', 'n', 'e', 'n', 't', 'e', 'r', 'p', 'r', 'i', 's', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "eickemeyer.nl", true */ 'e', 'i', 'c', 'k', 'e', 'm', 'e', 'y', 'e', 'r', '.', 'n', 'l', '\0', - /* "eighty-aid.com", true */ 'e', 'i', 'g', 'h', 't', 'y', '-', 'a', 'i', 'd', '.', 'c', 'o', 'm', '\0', + /* "eighty-aid.com", false */ 'e', 'i', 'g', 'h', 't', 'y', '-', 'a', 'i', 'd', '.', 'c', 'o', 'm', '\0', /* "eimacs.com", true */ 'e', 'i', 'm', 'a', 'c', 's', '.', 'c', 'o', 'm', '\0', /* "eimanavicius.lt", true */ 'e', 'i', 'm', 'a', 'n', 'a', 'v', 'i', 'c', 'i', 'u', 's', '.', 'l', 't', '\0', /* "einaros.is", true */ 'e', 'i', 'n', 'a', 'r', 'o', 's', '.', 'i', 's', '\0', @@ -3750,9 +3752,7 @@ static const char kSTSHostTable[] = { /* "elars.de", true */ 'e', 'l', 'a', 'r', 's', '.', 'd', 'e', '\0', /* "elastic7.uk", true */ 'e', 'l', 'a', 's', 't', 'i', 'c', '7', '.', 'u', 'k', '\0', /* "elaxy-online.de", true */ 'e', 'l', 'a', 'x', 'y', '-', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'd', 'e', '\0', - /* "elbetech.net", true */ 'e', 'l', 'b', 'e', 't', 'e', 'c', 'h', '.', 'n', 'e', 't', '\0', /* "elblein.de", true */ 'e', 'l', 'b', 'l', 'e', 'i', 'n', '.', 'd', 'e', '\0', - /* "eldinhadzic.com", true */ 'e', 'l', 'd', 'i', 'n', 'h', 'a', 'd', 'z', 'i', 'c', '.', 'c', 'o', 'm', '\0', /* "elearningpilot.com", true */ 'e', 'l', 'e', 'a', 'r', 'n', 'i', 'n', 'g', 'p', 'i', 'l', 'o', 't', '.', 'c', 'o', 'm', '\0', /* "electricant.com", true */ 'e', 'l', 'e', 'c', 't', 'r', 'i', 'c', 'a', 'n', 't', '.', 'c', 'o', 'm', '\0', /* "electricant.nl", true */ 'e', 'l', 'e', 'c', 't', 'r', 'i', 'c', 'a', 'n', 't', '.', 'n', 'l', '\0', @@ -3856,6 +3856,10 @@ static const char kSTSHostTable[] = { /* "endlesshorizon.net", true */ 'e', 'n', 'd', 'l', 'e', 's', 's', 'h', 'o', 'r', 'i', 'z', 'o', 'n', '.', 'n', 'e', 't', '\0', /* "endlesstone.com", true */ 'e', 'n', 'd', 'l', 'e', 's', 's', 't', 'o', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "endofnet.org", true */ 'e', 'n', 'd', 'o', 'f', 'n', 'e', 't', '.', 'o', 'r', 'g', '\0', + /* "endohaus.ca", true */ 'e', 'n', 'd', 'o', 'h', 'a', 'u', 's', '.', 'c', 'a', '\0', + /* "endohaus.com", true */ 'e', 'n', 'd', 'o', 'h', 'a', 'u', 's', '.', 'c', 'o', 'm', '\0', + /* "endohaus.eu", true */ 'e', 'n', 'd', 'o', 'h', 'a', 'u', 's', '.', 'e', 'u', '\0', + /* "endohaus.us", true */ 'e', 'n', 'd', 'o', 'h', 'a', 'u', 's', '.', 'u', 's', '\0', /* "enecoshop.nl", true */ 'e', 'n', 'e', 'c', 'o', 's', 'h', 'o', 'p', '.', 'n', 'l', '\0', /* "enefan.jp", true */ 'e', 'n', 'e', 'f', 'a', 'n', '.', 'j', 'p', '\0', /* "energiekeurplus.nl", true */ 'e', 'n', 'e', 'r', 'g', 'i', 'e', 'k', 'e', 'u', 'r', 'p', 'l', 'u', 's', '.', 'n', 'l', '\0', @@ -3945,7 +3949,6 @@ static const char kSTSHostTable[] = { /* "ernaehrungsberatung-rapperswil.ch", true */ 'e', 'r', 'n', 'a', 'e', 'h', 'r', 'u', 'n', 'g', 's', 'b', 'e', 'r', 'a', 't', 'u', 'n', 'g', '-', 'r', 'a', 'p', 'p', 'e', 'r', 's', 'w', 'i', 'l', '.', 'c', 'h', '\0', /* "ernaehrungsberatung-zurich.ch", true */ 'e', 'r', 'n', 'a', 'e', 'h', 'r', 'u', 'n', 'g', 's', 'b', 'e', 'r', 'a', 't', 'u', 'n', 'g', '-', 'z', 'u', 'r', 'i', 'c', 'h', '.', 'c', 'h', '\0', /* "ernest.ly", true */ 'e', 'r', 'n', 'e', 's', 't', '.', 'l', 'y', '\0', - /* "ernesto.at", true */ 'e', 'r', 'n', 'e', 's', 't', 'o', '.', 'a', 't', '\0', /* "erp-band.ru", true */ 'e', 'r', 'p', '-', 'b', 'a', 'n', 'd', '.', 'r', 'u', '\0', /* "erp.band", true */ 'e', 'r', 'p', '.', 'b', 'a', 'n', 'd', '\0', /* "erpband.ru", true */ 'e', 'r', 'p', 'b', 'a', 'n', 'd', '.', 'r', 'u', '\0', @@ -3983,7 +3986,6 @@ static const char kSTSHostTable[] = { /* "espci.fr", true */ 'e', 's', 'p', 'c', 'i', '.', 'f', 'r', '\0', /* "especificosba.com.ar", true */ 'e', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'c', 'o', 's', 'b', 'a', '.', 'c', 'o', 'm', '.', 'a', 'r', '\0', /* "espgg.org", true */ 'e', 's', 'p', 'g', 'g', '.', 'o', 'r', 'g', '\0', - /* "esquonic.com", true */ 'e', 's', 'q', 'u', 'o', 'n', 'i', 'c', '.', 'c', 'o', 'm', '\0', /* "ess-cert.ru", true */ 'e', 's', 's', '-', 'c', 'e', 'r', 't', '.', 'r', 'u', '\0', /* "essentialoilsimports.com", true */ 'e', 's', 's', 'e', 'n', 't', 'i', 'a', 'l', 'o', 'i', 'l', 's', 'i', 'm', 'p', 'o', 'r', 't', 's', '.', 'c', 'o', 'm', '\0', /* "esseriumani.com", true */ 'e', 's', 's', 'e', 'r', 'i', 'u', 'm', 'a', 'n', 'i', '.', 'c', 'o', 'm', '\0', @@ -4230,7 +4232,6 @@ static const char kSTSHostTable[] = { /* "fastconfirm.com", true */ 'f', 'a', 's', 't', 'c', 'o', 'n', 'f', 'i', 'r', 'm', '.', 'c', 'o', 'm', '\0', /* "fastmail.com", false */ 'f', 'a', 's', 't', 'm', 'a', 'i', 'l', '.', 'c', 'o', 'm', '\0', /* "fastograph.com", true */ 'f', 'a', 's', 't', 'o', 'g', 'r', 'a', 'p', 'h', '.', 'c', 'o', 'm', '\0', - /* "fatlossguide.xyz", true */ 'f', 'a', 't', 'l', 'o', 's', 's', 'g', 'u', 'i', 'd', 'e', '.', 'x', 'y', 'z', '\0', /* "fatzebra.com.au", false */ 'f', 'a', 't', 'z', 'e', 'b', 'r', 'a', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "faucetbox.com", true */ 'f', 'a', 'u', 'c', 'e', 't', 'b', 'o', 'x', '.', 'c', 'o', 'm', '\0', /* "favorit.club", true */ 'f', 'a', 'v', 'o', 'r', 'i', 't', '.', 'c', 'l', 'u', 'b', '\0', @@ -4530,7 +4531,7 @@ static const char kSTSHostTable[] = { /* "francoz.me", true */ 'f', 'r', 'a', 'n', 'c', 'o', 'z', '.', 'm', 'e', '\0', /* "frank.fyi", true */ 'f', 'r', 'a', 'n', 'k', '.', 'f', 'y', 'i', '\0', /* "franke-chemie.de", true */ 'f', 'r', 'a', 'n', 'k', 'e', '-', 'c', 'h', 'e', 'm', 'i', 'e', '.', 'd', 'e', '\0', - /* "franken-lehrmittel.de", true */ 'f', 'r', 'a', 'n', 'k', 'e', 'n', '-', 'l', 'e', 'h', 'r', 'm', 'i', 't', 't', 'e', 'l', '.', 'd', 'e', '\0', + /* "franken-lehrmittel.de", false */ 'f', 'r', 'a', 'n', 'k', 'e', 'n', '-', 'l', 'e', 'h', 'r', 'm', 'i', 't', 't', 'e', 'l', '.', 'd', 'e', '\0', /* "frankhaala.com", true */ 'f', 'r', 'a', 'n', 'k', 'h', 'a', 'a', 'l', 'a', '.', 'c', 'o', 'm', '\0', /* "frankierprofi.de", true */ 'f', 'r', 'a', 'n', 'k', 'i', 'e', 'r', 'p', 'r', 'o', 'f', 'i', '.', 'd', 'e', '\0', /* "frankl.in", true */ 'f', 'r', 'a', 'n', 'k', 'l', '.', 'i', 'n', '\0', @@ -4616,7 +4617,6 @@ static const char kSTSHostTable[] = { /* "fsapubs.gov", true */ 'f', 's', 'a', 'p', 'u', 'b', 's', '.', 'g', 'o', 'v', '\0', /* "fsbpaintrock.com", true */ 'f', 's', 'b', 'p', 'a', 'i', 'n', 't', 'r', 'o', 'c', 'k', '.', 'c', 'o', 'm', '\0', /* "fsbturton.com", true */ 'f', 's', 'b', 't', 'u', 'r', 't', 'o', 'n', '.', 'c', 'o', 'm', '\0', - /* "fsf.moe", true */ 'f', 's', 'f', '.', 'm', 'o', 'e', '\0', /* "fsfi.is", true */ 'f', 's', 'f', 'i', '.', 'i', 's', '\0', /* "fsinf.at", true */ 'f', 's', 'i', 'n', 'f', '.', 'a', 't', '\0', /* "fsm2016.org", true */ 'f', 's', 'm', '2', '0', '1', '6', '.', 'o', 'r', 'g', '\0', @@ -4679,7 +4679,6 @@ static const char kSTSHostTable[] = { /* "g-m-w.eu", true */ 'g', '-', 'm', '-', 'w', '.', 'e', 'u', '\0', /* "g-marketing.ro", true */ 'g', '-', 'm', 'a', 'r', 'k', 'e', 't', 'i', 'n', 'g', '.', 'r', 'o', '\0', /* "g-o.pl", true */ 'g', '-', 'o', '.', 'p', 'l', '\0', - /* "g01.in.ua", true */ 'g', '0', '1', '.', 'i', 'n', '.', 'u', 'a', '\0', /* "g2links.com", true */ 'g', '2', 'l', 'i', 'n', 'k', 's', '.', 'c', 'o', 'm', '\0', /* "g2pla.net", true */ 'g', '2', 'p', 'l', 'a', '.', 'n', 'e', 't', '\0', /* "g2soft.net", true */ 'g', '2', 's', 'o', 'f', 't', '.', 'n', 'e', 't', '\0', @@ -4999,7 +4998,6 @@ static const char kSTSHostTable[] = { /* "goldenhost.ca", true */ 'g', 'o', 'l', 'd', 'e', 'n', 'h', 'o', 's', 't', '.', 'c', 'a', '\0', /* "goldmark.com.au", true */ 'g', 'o', 'l', 'd', 'm', 'a', 'r', 'k', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "goldpreisfinder.at", true */ 'g', 'o', 'l', 'd', 'p', 'r', 'e', 'i', 's', 'f', 'i', 'n', 'd', 'e', 'r', '.', 'a', 't', '\0', - /* "goldpros.com", true */ 'g', 'o', 'l', 'd', 'p', 'r', 'o', 's', '.', 'c', 'o', 'm', '\0', /* "goldsecurity.com", true */ 'g', 'o', 'l', 'd', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0', /* "golf18network.com", true */ 'g', 'o', 'l', 'f', '1', '8', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'c', 'o', 'm', '\0', /* "golfburn.com", true */ 'g', 'o', 'l', 'f', 'b', 'u', 'r', 'n', '.', 'c', 'o', 'm', '\0', @@ -5013,6 +5011,7 @@ static const char kSTSHostTable[] = { /* "googlemail.com", false */ 'g', 'o', 'o', 'g', 'l', 'e', 'm', 'a', 'i', 'l', '.', 'c', 'o', 'm', '\0', /* "googleplex.com", true */ 'g', 'o', 'o', 'g', 'l', 'e', 'p', 'l', 'e', 'x', '.', 'c', 'o', 'm', '\0', /* "googlesource.com", true */ 'g', 'o', 'o', 'g', 'l', 'e', 's', 'o', 'u', 'r', 'c', 'e', '.', 'c', 'o', 'm', '\0', + /* "goolok.com", true */ 'g', 'o', 'o', 'l', 'o', 'k', '.', 'c', 'o', 'm', '\0', /* "goozz.nl", true */ 'g', 'o', 'o', 'z', 'z', '.', 'n', 'l', '\0', /* "gopay.cz", true */ 'g', 'o', 'p', 'a', 'y', '.', 'c', 'z', '\0', /* "gopokego.cz", true */ 'g', 'o', 'p', 'o', 'k', 'e', 'g', 'o', '.', 'c', 'z', '\0', @@ -5095,8 +5094,6 @@ static const char kSTSHostTable[] = { /* "grcnode.co.uk", true */ 'g', 'r', 'c', 'n', 'o', 'd', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "greatfire.org", true */ 'g', 'r', 'e', 'a', 't', 'f', 'i', 'r', 'e', '.', 'o', 'r', 'g', '\0', /* "greatnet.de", true */ 'g', 'r', 'e', 'a', 't', 'n', 'e', 't', '.', 'd', 'e', '\0', - /* "greboid.co.uk", true */ 'g', 'r', 'e', 'b', 'o', 'i', 'd', '.', 'c', 'o', '.', 'u', 'k', '\0', - /* "greboid.com", true */ 'g', 'r', 'e', 'b', 'o', 'i', 'd', '.', 'c', 'o', 'm', '\0', /* "greedbutt.com", true */ 'g', 'r', 'e', 'e', 'd', 'b', 'u', 't', 't', '.', 'c', 'o', 'm', '\0', /* "greek.dating", true */ 'g', 'r', 'e', 'e', 'k', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0', /* "green-attitude.be", true */ 'g', 'r', 'e', 'e', 'n', '-', 'a', 't', 't', 'i', 't', 'u', 'd', 'e', '.', 'b', 'e', '\0', @@ -5289,7 +5286,6 @@ static const char kSTSHostTable[] = { /* "handiworker.com", true */ 'h', 'a', 'n', 'd', 'i', 'w', 'o', 'r', 'k', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "handmadetutorials.ro", true */ 'h', 'a', 'n', 'd', 'm', 'a', 'd', 'e', 't', 'u', 't', 'o', 'r', 'i', 'a', 'l', 's', '.', 'r', 'o', '\0', /* "handycommerce.co", true */ 'h', 'a', 'n', 'd', 'y', 'c', 'o', 'm', 'm', 'e', 'r', 'c', 'e', '.', 'c', 'o', '\0', - /* "hang333.pw", true */ 'h', 'a', 'n', 'g', '3', '3', '3', '.', 'p', 'w', '\0', /* "hangouts.google.com", true */ 'h', 'a', 'n', 'g', 'o', 'u', 't', 's', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0', /* "hanimalis.fr", true */ 'h', 'a', 'n', 'i', 'm', 'a', 'l', 'i', 's', '.', 'f', 'r', '\0', /* "hans-natur.de", true */ 'h', 'a', 'n', 's', '-', 'n', 'a', 't', 'u', 'r', '.', 'd', 'e', '\0', @@ -5462,7 +5458,6 @@ static const char kSTSHostTable[] = { /* "hentschke-betonfertigteilwerk.de", true */ 'h', 'e', 'n', 't', 's', 'c', 'h', 'k', 'e', '-', 'b', 'e', 't', 'o', 'n', 'f', 'e', 'r', 't', 'i', 'g', 't', 'e', 'i', 'l', 'w', 'e', 'r', 'k', '.', 'd', 'e', '\0', /* "hentschke-invest.de", true */ 'h', 'e', 'n', 't', 's', 'c', 'h', 'k', 'e', '-', 'i', 'n', 'v', 'e', 's', 't', '.', 'd', 'e', '\0', /* "heppler.net", true */ 'h', 'e', 'p', 'p', 'l', 'e', 'r', '.', 'n', 'e', 't', '\0', - /* "hepteract.us", true */ 'h', 'e', 'p', 't', 'e', 'r', 'a', 'c', 't', '.', 'u', 's', '\0', /* "herbandpat.org", true */ 'h', 'e', 'r', 'b', 'a', 'n', 'd', 'p', 'a', 't', '.', 'o', 'r', 'g', '\0', /* "herbert.io", true */ 'h', 'e', 'r', 'b', 'e', 'r', 't', '.', 'i', 'o', '\0', /* "herbertmouwen.nl", true */ 'h', 'e', 'r', 'b', 'e', 'r', 't', 'm', 'o', 'u', 'w', 'e', 'n', '.', 'n', 'l', '\0', @@ -5618,6 +5613,7 @@ static const char kSTSHostTable[] = { /* "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', @@ -5628,10 +5624,10 @@ static const char kSTSHostTable[] = { /* "hostix.de", true */ 'h', 'o', 's', 't', 'i', 'x', '.', 'd', 'e', '\0', /* "hostmijnpagina.nl", true */ 'h', 'o', 's', 't', 'm', 'i', 'j', 'n', 'p', 'a', 'g', 'i', 'n', 'a', '.', 'n', 'l', '\0', /* "hotchillibox.co.za", true */ 'h', 'o', 't', 'c', 'h', 'i', 'l', 'l', 'i', 'b', 'o', 'x', '.', 'c', 'o', '.', 'z', 'a', '\0', - /* "hotel-kronjuwel.de", true */ 'h', 'o', 't', 'e', 'l', '-', 'k', 'r', 'o', 'n', 'j', 'u', 'w', 'e', 'l', '.', 'd', 'e', '\0', + /* "hotel-kronjuwel.de", false */ 'h', 'o', 't', 'e', 'l', '-', 'k', 'r', 'o', 'n', 'j', 'u', 'w', 'e', 'l', '.', 'd', 'e', '\0', /* "hotel-pension-sonnalp.eu", true */ 'h', 'o', 't', 'e', 'l', '-', 'p', 'e', 'n', 's', 'i', 'o', 'n', '-', 's', 'o', 'n', 'n', 'a', 'l', 'p', '.', 'e', 'u', '\0', /* "hotel-tongruben.de", true */ 'h', 'o', 't', 'e', 'l', '-', 't', 'o', 'n', 'g', 'r', 'u', 'b', 'e', 'n', '.', 'd', 'e', '\0', - /* "hotelident.de", true */ 'h', 'o', 't', 'e', 'l', 'i', 'd', 'e', 'n', 't', '.', 'd', 'e', '\0', + /* "hotelident.de", false */ 'h', 'o', 't', 'e', 'l', 'i', 'd', 'e', 'n', 't', '.', 'd', 'e', '\0', /* "hotelmap.com", true */ 'h', 'o', 't', 'e', 'l', 'm', 'a', 'p', '.', 'c', 'o', 'm', '\0', /* "hotelvictoriaoax-mailing.com", true */ 'h', 'o', 't', 'e', 'l', 'v', 'i', 'c', 't', 'o', 'r', 'i', 'a', 'o', 'a', 'x', '-', 'm', 'a', 'i', 'l', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "hotelvillahermosa-mailing.com", true */ 'h', 'o', 't', 'e', 'l', 'v', 'i', 'l', 'l', 'a', 'h', 'e', 'r', 'm', 'o', 's', 'a', '-', 'm', 'a', 'i', 'l', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', @@ -5691,13 +5687,13 @@ static const char kSTSHostTable[] = { /* "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', - /* "huntshomeinspections.com", true */ 'h', 'u', 'n', 't', 's', 'h', 'o', 'm', 'e', 'i', 'n', 's', 'p', 'e', 'c', 't', 'i', 'o', 'n', 's', '.', 'c', 'o', 'm', '\0', /* "hup.blue", true */ 'h', 'u', 'p', '.', 'b', 'l', 'u', 'e', '\0', /* "hupp.se", true */ 'h', 'u', 'p', 'p', '.', 's', 'e', '\0', /* "hurd.is", true */ 'h', 'u', 'r', 'd', '.', 'i', 's', '\0', @@ -5906,7 +5902,7 @@ static const char kSTSHostTable[] = { /* "inboxen.org", true */ 'i', 'n', 'b', 'o', 'x', 'e', 'n', '.', 'o', 'r', 'g', '\0', /* "incendiary-arts.com", true */ 'i', 'n', 'c', 'e', 'n', 'd', 'i', 'a', 'r', 'y', '-', 'a', 'r', 't', 's', '.', 'c', 'o', 'm', '\0', /* "inche-ali.com", true */ 'i', 'n', 'c', 'h', 'e', '-', 'a', 'l', 'i', '.', 'c', 'o', 'm', '\0', - /* "inconcerts.de", true */ 'i', 'n', 'c', 'o', 'n', 'c', 'e', 'r', 't', 's', '.', 'd', 'e', '\0', + /* "inconcerts.de", false */ 'i', 'n', 'c', 'o', 'n', 'c', 'e', 'r', 't', 's', '.', 'd', 'e', '\0', /* "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', @@ -6013,7 +6009,7 @@ static const char kSTSHostTable[] = { /* "interviewpipeline.co.uk", true */ 'i', 'n', 't', 'e', 'r', 'v', 'i', 'e', 'w', 'p', 'i', 'p', 'e', 'l', 'i', 'n', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "intervisteperstrada.com", true */ 'i', 'n', 't', 'e', 'r', 'v', 'i', 's', 't', 'e', 'p', 'e', 'r', 's', 't', 'r', 'a', 'd', 'a', '.', 'c', 'o', 'm', '\0', /* "interways.de", true */ 'i', 'n', 't', 'e', 'r', 'w', 'a', 'y', 's', '.', 'd', 'e', '\0', - /* "intheater.de", true */ 'i', 'n', 't', 'h', 'e', 'a', 't', 'e', 'r', '.', 'd', 'e', '\0', + /* "intheater.de", false */ 'i', 'n', 't', 'h', 'e', 'a', 't', 'e', 'r', '.', 'd', 'e', '\0', /* "inthepicture.com", true */ 'i', 'n', 't', 'h', 'e', 'p', 'i', 'c', 't', 'u', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "inthouse.cloud", true */ 'i', 'n', 't', 'h', 'o', 'u', 's', 'e', '.', 'c', 'l', 'o', 'u', 'd', '\0', /* "intimateperrierjouet.com", true */ 'i', 'n', 't', 'i', 'm', 'a', 't', 'e', 'p', 'e', 'r', 'r', 'i', 'e', 'r', 'j', 'o', 'u', 'e', 't', '.', 'c', 'o', 'm', '\0', @@ -6258,7 +6254,6 @@ static const char kSTSHostTable[] = { /* "jamesbywater.co.uk", true */ 'j', 'a', 'm', 'e', 's', 'b', 'y', 'w', 'a', 't', 'e', 'r', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "jamesbywater.com", true */ 'j', 'a', 'm', 'e', 's', 'b', 'y', 'w', 'a', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "jamesbywater.uk", false */ 'j', 'a', 'm', 'e', 's', 'b', 'y', 'w', 'a', 't', 'e', 'r', '.', 'u', 'k', '\0', - /* "jamesf.xyz", true */ 'j', 'a', 'm', 'e', 's', 'f', '.', 'x', 'y', 'z', '\0', /* "jamesgreenfield.com", true */ 'j', 'a', 'm', 'e', 's', 'g', 'r', 'e', 'e', 'n', 'f', 'i', 'e', 'l', 'd', '.', 'c', 'o', 'm', '\0', /* "jameshale.me", true */ 'j', 'a', 'm', 'e', 's', 'h', 'a', 'l', 'e', '.', 'm', 'e', '\0', /* "jameshost.net", true */ 'j', 'a', 'm', 'e', 's', 'h', 'o', 's', 't', '.', 'n', 'e', 't', '\0', @@ -6322,6 +6317,7 @@ static const char kSTSHostTable[] = { /* "jcyz.cf", true */ 'j', 'c', 'y', 'z', '.', 'c', 'f', '\0', /* "jdav-leipzig.de", true */ 'j', 'd', 'a', 'v', '-', 'l', 'e', 'i', 'p', 'z', 'i', 'g', '.', 'd', 'e', '\0', /* "jdcgroup.com.ph", true */ 'j', 'd', 'c', 'g', 'r', 'o', 'u', 'p', '.', 'c', 'o', 'm', '.', 'p', 'h', '\0', + /* "jdh8.org", true */ 'j', 'd', 'h', '8', '.', 'o', 'r', 'g', '\0', /* "jdubya.info", true */ 'j', 'd', 'u', 'b', 'y', 'a', '.', 'i', 'n', 'f', 'o', '\0', /* "jean-remy.ch", true */ 'j', 'e', 'a', 'n', '-', 'r', 'e', 'm', 'y', '.', 'c', 'h', '\0', /* "jedipedia.net", true */ 'j', 'e', 'd', 'i', 'p', 'e', 'd', 'i', 'a', '.', 'n', 'e', 't', '\0', @@ -6392,6 +6388,7 @@ static const char kSTSHostTable[] = { /* "jlhmedia.com", true */ 'j', 'l', 'h', 'm', 'e', 'd', 'i', 'a', '.', 'c', 'o', 'm', '\0', /* "jlkhosting.com", true */ 'j', 'l', 'k', 'h', 'o', 's', 't', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "jmedved.com", true */ 'j', 'm', 'e', 'd', 'v', 'e', 'd', '.', 'c', 'o', 'm', '\0', + /* "jmk.hu", true */ 'j', 'm', 'k', '.', 'h', 'u', '\0', /* "jn1.me", true */ 'j', 'n', '1', '.', 'm', 'e', '\0', /* "jncde.de", true */ 'j', 'n', 'c', 'd', 'e', '.', 'd', 'e', '\0', /* "jncie.eu", true */ 'j', 'n', 'c', 'i', 'e', '.', 'e', 'u', '\0', @@ -6498,6 +6495,7 @@ static const char kSTSHostTable[] = { /* "juliangonggrijp.com", true */ 'j', 'u', 'l', 'i', 'a', 'n', 'g', 'o', 'n', 'g', 'g', 'r', 'i', 'j', 'p', '.', 'c', 'o', 'm', '\0', /* "julianmeyer.de", true */ 'j', 'u', 'l', 'i', 'a', 'n', 'm', 'e', 'y', 'e', 'r', '.', 'd', 'e', '\0', /* "juliansimioni.com", true */ 'j', 'u', 'l', 'i', 'a', 'n', 's', 'i', 'm', 'i', 'o', 'n', 'i', '.', 'c', 'o', 'm', '\0', + /* "julibear.com", true */ 'j', 'u', 'l', 'i', 'b', 'e', 'a', 'r', '.', 'c', 'o', 'm', '\0', /* "julido.de", true */ 'j', 'u', 'l', 'i', 'd', 'o', '.', 'd', 'e', '\0', /* "juliekoubova.net", true */ 'j', 'u', 'l', 'i', 'e', 'k', 'o', 'u', 'b', 'o', 'v', 'a', '.', 'n', 'e', 't', '\0', /* "juliemaurel.fr", true */ 'j', 'u', 'l', 'i', 'e', 'm', 'a', 'u', 'r', 'e', 'l', '.', 'f', 'r', '\0', @@ -6533,6 +6531,7 @@ static const char kSTSHostTable[] = { /* "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', @@ -6612,7 +6611,6 @@ static const char kSTSHostTable[] = { /* "kasadara.com", true */ 'k', 'a', 's', 'a', 'd', 'a', 'r', 'a', '.', 'c', 'o', 'm', '\0', /* "kashdash.ca", true */ 'k', 'a', 's', 'h', 'd', 'a', 's', 'h', '.', 'c', 'a', '\0', /* "kashmirobserver.net", true */ 'k', 'a', 's', 'h', 'm', 'i', 'r', 'o', 'b', 's', 'e', 'r', 'v', 'e', 'r', '.', 'n', 'e', 't', '\0', - /* "kasilag.me", true */ 'k', 'a', 's', 'i', 'l', 'a', 'g', '.', 'm', 'e', '\0', /* "kasko.io", true */ 'k', 'a', 's', 'k', 'o', '.', 'i', 'o', '\0', /* "kassa.at", true */ 'k', 'a', 's', 's', 'a', '.', 'a', 't', '\0', /* "kat.al", true */ 'k', 'a', 't', '.', 'a', 'l', '\0', @@ -6741,6 +6739,7 @@ static const char kSTSHostTable[] = { /* "kigmbh.com", true */ 'k', 'i', 'g', 'm', 'b', 'h', '.', 'c', 'o', 'm', '\0', /* "kikuzuki.org", false */ 'k', 'i', 'k', 'u', 'z', 'u', 'k', 'i', '.', 'o', 'r', 'g', '\0', /* "kilerd.me", true */ 'k', 'i', 'l', 'e', 'r', 'd', '.', 'm', 'e', '\0', + /* "kilianvalkhof.com", true */ 'k', 'i', 'l', 'i', 'a', 'n', 'v', 'a', 'l', 'k', 'h', 'o', 'f', '.', 'c', 'o', 'm', '\0', /* "killerrobots.com", true */ 'k', 'i', 'l', 'l', 'e', 'r', 'r', 'o', 'b', 'o', 't', 's', '.', 'c', 'o', 'm', '\0', /* "kilobyte22.de", true */ 'k', 'i', 'l', 'o', 'b', 'y', 't', 'e', '2', '2', '.', 'd', 'e', '\0', /* "kilogram.nl", true */ 'k', 'i', 'l', 'o', 'g', 'r', 'a', 'm', '.', 'n', 'l', '\0', @@ -6775,6 +6774,7 @@ static const char kSTSHostTable[] = { /* "kionetworks.es", true */ 'k', 'i', 'o', 'n', 'e', 't', 'w', 'o', 'r', 'k', 's', '.', 'e', 's', '\0', /* "kiragameforum.net", true */ 'k', 'i', 'r', 'a', 'g', 'a', 'm', 'e', 'f', 'o', 'r', 'u', 'm', '.', 'n', 'e', 't', '\0', /* "kirara.eu", true */ 'k', 'i', 'r', 'a', 'r', 'a', '.', 'e', 'u', '\0', + /* "kirbear.com", true */ 'k', 'i', 'r', 'b', 'e', 'a', 'r', '.', 'c', 'o', 'm', '\0', /* "kircp.com", true */ 'k', 'i', 'r', 'c', 'p', '.', 'c', 'o', 'm', '\0', /* "kirei.se", true */ 'k', 'i', 'r', 'e', 'i', '.', 's', 'e', '\0', /* "kirinas.com", true */ 'k', 'i', 'r', 'i', 'n', 'a', 's', '.', 'c', 'o', 'm', '\0', @@ -6784,7 +6784,6 @@ static const char kSTSHostTable[] = { /* "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', - /* "kisa.io", true */ 'k', 'i', 's', 'a', '.', 'i', 'o', '\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', /* "kisun.co.jp", true */ 'k', 'i', 's', 'u', 'n', '.', 'c', 'o', '.', 'j', 'p', '\0', @@ -6942,6 +6941,7 @@ static const char kSTSHostTable[] = { /* "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', @@ -7216,6 +7216,7 @@ static const char kSTSHostTable[] = { /* "leonmahler.consulting", true */ 'l', 'e', 'o', 'n', 'm', 'a', 'h', 'l', 'e', 'r', '.', 'c', 'o', 'n', 's', 'u', 'l', 't', 'i', 'n', 'g', '\0', /* "lep.gov", true */ 'l', 'e', 'p', '.', 'g', 'o', 'v', '\0', /* "lepont.pl", true */ 'l', 'e', 'p', 'o', 'n', 't', '.', 'p', 'l', '\0', + /* "leppis-it.de", true */ 'l', 'e', 'p', 'p', 'i', 's', '-', 'i', 't', '.', 'd', 'e', '\0', /* "leprado.com", true */ 'l', 'e', 'p', 'r', 'a', 'd', 'o', '.', 'c', 'o', 'm', '\0', /* "lereporter.ma", true */ 'l', 'e', 'r', 'e', 'p', 'o', 'r', 't', 'e', 'r', '.', 'm', 'a', '\0', /* "lerku.com", true */ 'l', 'e', 'r', 'k', 'u', '.', 'c', 'o', 'm', '\0', @@ -7288,6 +7289,7 @@ static const char kSTSHostTable[] = { /* "lightworx.io", true */ 'l', 'i', 'g', 'h', 't', 'w', 'o', 'r', 'x', '.', 'i', 'o', '\0', /* "likeablehub.com", true */ 'l', 'i', 'k', 'e', 'a', 'b', 'l', 'e', 'h', 'u', 'b', '.', 'c', 'o', 'm', '\0', /* "likeabox.de", true */ 'l', 'i', 'k', 'e', 'a', 'b', 'o', 'x', '.', 'd', 'e', '\0', + /* "likeaross.com", true */ 'l', 'i', 'k', 'e', 'a', 'r', 'o', 's', 's', '.', 'c', 'o', 'm', '\0', /* "liliang13.com", true */ 'l', 'i', 'l', 'i', 'a', 'n', 'g', '1', '3', '.', 'c', 'o', 'm', '\0', /* "lillepuu.com", true */ 'l', 'i', 'l', 'l', 'e', 'p', 'u', 'u', '.', 'c', 'o', 'm', '\0', /* "lily-inn.com", true */ 'l', 'i', 'l', 'y', '-', 'i', 'n', 'n', '.', 'c', 'o', 'm', '\0', @@ -7306,7 +7308,7 @@ static const char kSTSHostTable[] = { /* "link-sanitizer.com", true */ 'l', 'i', 'n', 'k', '-', 's', 'a', 'n', 'i', 't', 'i', 'z', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "link.ba", true */ 'l', 'i', 'n', 'k', '.', 'b', 'a', '\0', /* "link2serve.com", true */ 'l', 'i', 'n', 'k', '2', 's', 'e', 'r', 'v', 'e', '.', 'c', 'o', 'm', '\0', - /* "linkages.org", true */ 'l', 'i', 'n', 'k', 'a', 'g', 'e', 's', '.', 'o', 'r', 'g', '\0', + /* "linkenheil.org", true */ 'l', 'i', 'n', 'k', 'e', 'n', 'h', 'e', 'i', 'l', '.', 'o', 'r', 'g', '\0', /* "linklocker.co", true */ 'l', 'i', 'n', 'k', 'l', 'o', 'c', 'k', 'e', 'r', '.', 'c', 'o', '\0', /* "linkmaker.co.uk", true */ 'l', 'i', 'n', 'k', 'm', 'a', 'k', 'e', 'r', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "linkonaut.net", true */ 'l', 'i', 'n', 'k', 'o', 'n', 'a', 'u', 't', '.', 'n', 'e', 't', '\0', @@ -7433,7 +7435,6 @@ static const char kSTSHostTable[] = { /* "logicsale.fr", true */ 'l', 'o', 'g', 'i', 'c', 's', 'a', 'l', 'e', '.', 'f', 'r', '\0', /* "logicsale.it", true */ 'l', 'o', 'g', 'i', 'c', 's', 'a', 'l', 'e', '.', 'i', 't', '\0', /* "login.corp.google.com", true */ 'l', 'o', 'g', 'i', 'n', '.', 'c', 'o', 'r', 'p', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0', - /* "login.gov", true */ 'l', 'o', 'g', 'i', 'n', '.', 'g', 'o', 'v', '\0', /* "login.launchpad.net", true */ 'l', 'o', 'g', 'i', 'n', '.', 'l', 'a', 'u', 'n', 'c', 'h', 'p', 'a', 'd', '.', 'n', 'e', 't', '\0', /* "login.persona.org", true */ 'l', 'o', 'g', 'i', 'n', '.', 'p', 'e', 'r', 's', 'o', 'n', 'a', '.', 'o', 'r', 'g', '\0', /* "login.sapo.pt", true */ 'l', 'o', 'g', 'i', 'n', '.', 's', 'a', 'p', 'o', '.', 'p', 't', '\0', @@ -7582,6 +7583,7 @@ static const char kSTSHostTable[] = { /* "lyx.dk", true */ 'l', 'y', 'x', '.', 'd', 'k', '\0', /* "lzzr.me", true */ 'l', 'z', 'z', 'r', '.', 'm', 'e', '\0', /* "m-edmondson.co.uk", true */ 'm', '-', 'e', 'd', 'm', 'o', 'n', 'd', 's', 'o', 'n', '.', 'c', 'o', '.', 'u', 'k', '\0', + /* "m-plan.com", true */ 'm', '-', 'p', 'l', 'a', 'n', '.', 'c', 'o', 'm', '\0', /* "m.facebook.com", false */ 'm', '.', 'f', 'a', 'c', 'e', 'b', 'o', 'o', 'k', '.', 'c', 'o', 'm', '\0', /* "m.mail.ru", true */ 'm', '.', 'm', 'a', 'i', 'l', '.', 'r', 'u', '\0', /* "m0wef.uk", true */ 'm', '0', 'w', 'e', 'f', '.', 'u', 'k', '\0', @@ -7594,7 +7596,6 @@ static const char kSTSHostTable[] = { /* "mac1.net", true */ 'm', 'a', 'c', '1', '.', 'n', 'e', 't', '\0', /* "macaque.io", false */ 'm', 'a', 'c', 'a', 'q', 'u', 'e', '.', 'i', 'o', '\0', /* "macdj.tk", true */ 'm', 'a', 'c', 'd', 'j', '.', 't', 'k', '\0', - /* "macgeneral.de", true */ 'm', 'a', 'c', 'g', 'e', 'n', 'e', 'r', 'a', 'l', '.', 'd', 'e', '\0', /* "mach-politik.ch", true */ 'm', 'a', 'c', 'h', '-', 'p', 'o', 'l', 'i', 't', 'i', 'k', '.', 'c', 'h', '\0', /* "machbach.com", true */ 'm', 'a', 'c', 'h', 'b', 'a', 'c', 'h', '.', 'c', 'o', 'm', '\0', /* "machbach.net", true */ 'm', 'a', 'c', 'h', 'b', 'a', 'c', 'h', '.', 'n', 'e', 't', '\0', @@ -8104,6 +8105,7 @@ static const char kSTSHostTable[] = { /* "mikalikes.men", true */ 'm', 'i', 'k', 'a', 'l', 'i', 'k', 'e', 's', '.', 'm', 'e', 'n', '\0', /* "mike-bland.com", true */ 'm', 'i', 'k', 'e', '-', 'b', 'l', 'a', 'n', 'd', '.', 'c', 'o', 'm', '\0', /* "mikecb.org", true */ 'm', 'i', 'k', 'e', 'c', 'b', '.', 'o', 'r', 'g', '\0', + /* "mikek.work", true */ 'm', 'i', 'k', 'e', 'k', '.', 'w', 'o', 'r', 'k', '\0', /* "mikepair.net", true */ 'm', 'i', 'k', 'e', 'p', 'a', 'i', 'r', '.', 'n', 'e', 't', '\0', /* "miketabor.com", true */ 'm', 'i', 'k', 'e', 't', 'a', 'b', 'o', 'r', '.', 'c', 'o', 'm', '\0', /* "mikewest.org", true */ 'm', 'i', 'k', 'e', 'w', 'e', 's', 't', '.', 'o', 'r', 'g', '\0', @@ -8345,7 +8347,6 @@ static const char kSTSHostTable[] = { /* "morenci.ch", true */ 'm', 'o', 'r', 'e', 'n', 'c', 'i', '.', 'c', 'h', '\0', /* "morfitronik.pl", true */ 'm', 'o', 'r', 'f', 'i', 't', 'r', 'o', 'n', 'i', 'k', '.', 'p', 'l', '\0', /* "morganestes.com", true */ 'm', 'o', 'r', 'g', 'a', 'n', 'e', 's', 't', 'e', 's', '.', 'c', 'o', 'm', '\0', - /* "morganino.eu", true */ 'm', 'o', 'r', 'g', 'a', 'n', 'i', 'n', 'o', '.', 'e', 'u', '\0', /* "morganino.it", true */ 'm', 'o', 'r', 'g', 'a', 'n', 'i', 'n', 'o', '.', 'i', 't', '\0', /* "moritz-baestlein.de", true */ 'm', 'o', 'r', 'i', 't', 'z', '-', 'b', 'a', 'e', 's', 't', 'l', 'e', 'i', 'n', '.', 'd', 'e', '\0', /* "moriz.de", true */ 'm', 'o', 'r', 'i', 'z', '.', 'd', 'e', '\0', @@ -8557,6 +8558,7 @@ static const char kSTSHostTable[] = { /* "myworth.com.au", true */ 'm', 'y', 'w', 'o', 'r', 't', 'h', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "myzina.cz", false */ 'm', 'y', 'z', 'i', 'n', 'a', '.', 'c', 'z', '\0', /* "n-pix.com", false */ 'n', '-', 'p', 'i', 'x', '.', 'c', 'o', 'm', '\0', + /* "n-soft.info", true */ 'n', '-', 's', 'o', 'f', 't', '.', 'i', 'n', 'f', 'o', '\0', /* "n0paste.tk", true */ 'n', '0', 'p', 'a', 's', 't', 'e', '.', 't', 'k', '\0', /* "nabankco.com", true */ 'n', 'a', 'b', 'a', 'n', 'k', 'c', 'o', '.', 'c', 'o', 'm', '\0', /* "nabru.co.uk", true */ 'n', 'a', 'b', 'r', 'u', '.', 'c', 'o', '.', 'u', 'k', '\0', @@ -8651,6 +8653,8 @@ static const char kSTSHostTable[] = { /* "ndeoffshore.com", true */ 'n', 'd', 'e', 'o', 'f', 'f', 's', 'h', 'o', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "nder.be", true */ 'n', 'd', 'e', 'r', '.', 'b', 'e', '\0', /* "ndmath.club", true */ 'n', 'd', 'm', 'a', 't', 'h', '.', 'c', 'l', 'u', 'b', '\0', + /* "ndtblog.com", true */ 'n', 'd', 't', 'b', 'l', 'o', 'g', '.', 'c', 'o', 'm', '\0', + /* "ndtmarket.place", true */ 'n', 'd', 't', 'm', 'a', 'r', 'k', 'e', 't', '.', 'p', 'l', 'a', 'c', 'e', '\0', /* "ne-on.org", true */ 'n', 'e', '-', 'o', 'n', '.', 'o', 'r', 'g', '\0', /* "ne1home.dyndns.org", true */ 'n', 'e', '1', 'h', 'o', 'm', 'e', '.', 'd', 'y', 'n', 'd', 'n', 's', '.', 'o', 'r', 'g', '\0', /* "neap.io", true */ 'n', 'e', 'a', 'p', '.', 'i', 'o', '\0', @@ -8887,6 +8891,7 @@ static const char kSTSHostTable[] = { /* "nnqc.nl", true */ 'n', 'n', 'q', 'c', '.', 'n', 'l', '\0', /* "no.search.yahoo.com", false */ 'n', 'o', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0', /* "nobly.de", true */ 'n', 'o', 'b', 'l', 'y', '.', 'd', 'e', '\0', + /* "nocit.dk", true */ 'n', 'o', 'c', 'i', 't', '.', 'd', 'k', '\0', /* "noclegi-online.pl", true */ 'n', 'o', 'c', 'l', 'e', 'g', 'i', '-', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'p', 'l', '\0', /* "nodecompat.com", true */ 'n', 'o', 'd', 'e', 'c', 'o', 'm', 'p', 'a', 't', '.', 'c', 'o', 'm', '\0', /* "nodelia.com", true */ 'n', 'o', 'd', 'e', 'l', 'i', 'a', '.', 'c', 'o', 'm', '\0', @@ -9125,8 +9130,8 @@ static const char kSTSHostTable[] = { /* "onehourloan.com", true */ 'o', 'n', 'e', 'h', 'o', 'u', 'r', 'l', 'o', 'a', 'n', '.', 'c', 'o', 'm', '\0', /* "onehourloan.sg", true */ 'o', 'n', 'e', 'h', 'o', 'u', 'r', 'l', 'o', 'a', 'n', '.', 's', 'g', '\0', /* "oneminutefilm.tv", true */ 'o', 'n', 'e', 'm', 'i', 'n', 'u', 't', 'e', 'f', 'i', 'l', 'm', '.', 't', 'v', '\0', - /* "oneononeonone.de", true */ 'o', 'n', 'e', 'o', 'n', 'o', 'n', 'e', 'o', 'n', 'o', 'n', 'e', '.', 'd', 'e', '\0', - /* "oneononeonone.tv", true */ 'o', 'n', 'e', 'o', 'n', 'o', 'n', 'e', 'o', 'n', 'o', 'n', 'e', '.', 't', 'v', '\0', + /* "oneononeonone.de", false */ 'o', 'n', 'e', 'o', 'n', 'o', 'n', 'e', 'o', 'n', 'o', 'n', 'e', '.', 'd', 'e', '\0', + /* "oneononeonone.tv", false */ 'o', 'n', 'e', 'o', 'n', 'o', 'n', 'e', 'o', 'n', 'o', 'n', 'e', '.', 't', 'v', '\0', /* "oneway.ga", true */ 'o', 'n', 'e', 'w', 'a', 'y', '.', 'g', 'a', '\0', /* "onewaymail.com", true */ 'o', 'n', 'e', 'w', 'a', 'y', 'm', 'a', 'i', 'l', '.', 'c', 'o', 'm', '\0', /* "oneweb.hu", true */ 'o', 'n', 'e', 'w', 'e', 'b', '.', 'h', 'u', '\0', @@ -9403,6 +9408,7 @@ static const char kSTSHostTable[] = { /* "pastaenprosecco.nl", true */ 'p', 'a', 's', 't', 'a', 'e', 'n', 'p', 'r', 'o', 's', 'e', 'c', 'c', 'o', '.', 'n', 'l', '\0', /* "pasternok.org", true */ 'p', 'a', 's', 't', 'e', 'r', 'n', 'o', 'k', '.', 'o', 'r', 'g', '\0', /* "pasteros.io", true */ 'p', 'a', 's', 't', 'e', 'r', 'o', 's', '.', 'i', 'o', '\0', + /* "pastie.se", true */ 'p', 'a', 's', 't', 'i', 'e', '.', 's', 'e', '\0', /* "pataua.kiwi", true */ 'p', 'a', 't', 'a', 'u', 'a', '.', 'k', 'i', 'w', 'i', '\0', /* "patechmasters.com", true */ 'p', 'a', 't', 'e', 'c', 'h', 'm', 'a', 's', 't', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0', /* "patentfamily.de", true */ 'p', 'a', 't', 'e', 'n', 't', 'f', 'a', 'm', 'i', 'l', 'y', '.', 'd', 'e', '\0', @@ -9463,9 +9469,7 @@ static const char kSTSHostTable[] = { /* "pbscreens.com", true */ 'p', 'b', 's', 'c', 'r', 'e', 'e', 'n', 's', '.', 'c', 'o', 'm', '\0', /* "pccentral.nl", true */ 'p', 'c', 'c', 'e', 'n', 't', 'r', 'a', 'l', '.', 'n', 'l', '\0', /* "pcel.com", true */ 'p', 'c', 'e', 'l', '.', 'c', 'o', 'm', '\0', - /* "pcfeuerwehr.de", true */ 'p', 'c', 'f', 'e', 'u', 'e', 'r', 'w', 'e', 'h', 'r', '.', 'd', 'e', '\0', /* "pcforum.sk", true */ 'p', 'c', 'f', 'o', 'r', 'u', 'm', '.', 's', 'k', '\0', - /* "pcfun.net", true */ 'p', 'c', 'f', 'u', 'n', '.', 'n', 'e', 't', '\0', /* "pciconcursos.com.br", true */ 'p', 'c', 'i', 'c', 'o', 'n', 'c', 'u', 'r', 's', 'o', 's', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', /* "pclaeuft.de", true */ 'p', 'c', 'l', 'a', 'e', 'u', 'f', 't', '.', 'd', 'e', '\0', /* "pclob.gov", true */ 'p', 'c', 'l', 'o', 'b', '.', 'g', 'o', 'v', '\0', @@ -9806,7 +9810,6 @@ static const char kSTSHostTable[] = { /* "pollpodium.nl", true */ 'p', 'o', 'l', 'l', 'p', 'o', 'd', 'i', 'u', 'm', '.', 'n', 'l', '\0', /* "polycoise.com", true */ 'p', 'o', 'l', 'y', 'c', 'o', 'i', 's', 'e', '.', 'c', 'o', 'm', '\0', /* "polycrypt.us", true */ 'p', 'o', 'l', 'y', 'c', 'r', 'y', 'p', 't', '.', 'u', 's', '\0', - /* "polymathematician.com", true */ 'p', 'o', 'l', 'y', 'm', 'a', 't', 'h', 'e', 'm', 'a', 't', 'i', 'c', 'i', 'a', 'n', '.', 'c', 'o', 'm', '\0', /* "polynomapp.com", true */ 'p', 'o', 'l', 'y', 'n', 'o', 'm', 'a', 'p', 'p', '.', 'c', 'o', 'm', '\0', /* "polypet.com.sg", true */ 'p', 'o', 'l', 'y', 'p', 'e', 't', '.', 'c', 'o', 'm', '.', 's', 'g', '\0', /* "pomar.club", true */ 'p', 'o', 'm', 'a', 'r', '.', 'c', 'l', 'u', 'b', '\0', @@ -9844,7 +9847,6 @@ static const char kSTSHostTable[] = { /* "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', @@ -9959,7 +9961,6 @@ static const char kSTSHostTable[] = { /* "progress-technologies.com", true */ 'p', 'r', 'o', 'g', 'r', 'e', 's', 's', '-', 't', 'e', 'c', 'h', 'n', 'o', 'l', 'o', 'g', 'i', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "progressiveplanning.com", true */ 'p', 'r', 'o', 'g', 'r', 'e', 's', 's', 'i', 'v', 'e', 'p', 'l', 'a', 'n', 'n', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "proitconsulting.com.au", true */ 'p', 'r', 'o', 'i', 't', 'c', 'o', 'n', 's', 'u', 'l', 't', 'i', 'n', 'g', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', - /* "proj.org.cn", true */ 'p', 'r', 'o', 'j', '.', 'o', 'r', 'g', '.', 'c', 'n', '\0', /* "project-sparks.eu", true */ 'p', 'r', 'o', 'j', 'e', 'c', 't', '-', 's', 'p', 'a', 'r', 'k', 's', '.', 'e', 'u', '\0', /* "projectarmy.net", true */ 'p', 'r', 'o', 'j', 'e', 'c', 't', 'a', 'r', 'm', 'y', '.', 'n', 'e', 't', '\0', /* "projectascension.io", true */ 'p', 'r', 'o', 'j', 'e', 'c', 't', 'a', 's', 'c', 'e', 'n', 's', 'i', 'o', 'n', '.', 'i', 'o', '\0', @@ -10013,6 +10014,7 @@ static const char kSTSHostTable[] = { /* "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', @@ -10091,7 +10093,6 @@ static const char kSTSHostTable[] = { /* "pythia.nz", true */ 'p', 'y', 't', 'h', 'i', 'a', '.', 'n', 'z', '\0', /* "python-hyper.org", true */ 'p', 'y', 't', 'h', 'o', 'n', '-', 'h', 'y', 'p', 'e', 'r', '.', 'o', 'r', 'g', '\0', /* "python.org", false */ 'p', 'y', 't', 'h', 'o', 'n', '.', 'o', 'r', 'g', '\0', - /* "pzme.me", true */ 'p', 'z', 'm', 'e', '.', 'm', 'e', '\0', /* "q-inn.com", true */ 'q', '-', 'i', 'n', 'n', '.', 'c', 'o', 'm', '\0', /* "q-inn.nl", true */ 'q', '-', 'i', 'n', 'n', '.', 'n', 'l', '\0', /* "qa.fedoraproject.org", true */ 'q', 'a', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0', @@ -10144,7 +10145,7 @@ static const char kSTSHostTable[] = { /* "qtpower.co.uk", true */ 'q', 't', 'p', 'o', 'w', 'e', 'r', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "qtpower.net", true */ 'q', 't', 'p', 'o', 'w', 'e', 'r', '.', 'n', 'e', 't', '\0', /* "qtpower.org", true */ 'q', 't', 'p', 'o', 'w', 'e', 'r', '.', 'o', 'r', 'g', '\0', - /* "qtvr.com", true */ 'q', 't', 'v', 'r', '.', 'c', 'o', 'm', '\0', + /* "qtvr.com", false */ 'q', 't', 'v', 'r', '.', 'c', 'o', 'm', '\0', /* "qtxh.net", true */ 'q', 't', 'x', 'h', '.', 'n', 'e', 't', '\0', /* "quaedam.org", true */ 'q', 'u', 'a', 'e', 'd', 'a', 'm', '.', 'o', 'r', 'g', '\0', /* "quai10.org", false */ 'q', 'u', 'a', 'i', '1', '0', '.', 'o', 'r', 'g', '\0', @@ -10175,6 +10176,7 @@ static const char kSTSHostTable[] = { /* "quizogames.com", true */ 'q', 'u', 'i', 'z', 'o', 'g', 'a', 'm', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "qul.link", true */ 'q', 'u', 'l', '.', 'l', 'i', 'n', 'k', '\0', /* "quli.nl", true */ 'q', 'u', 'l', 'i', '.', 'n', 'l', '\0', + /* "quotehex.com", true */ 'q', 'u', 'o', 't', 'e', 'h', 'e', 'x', '.', 'c', 'o', 'm', '\0', /* "quotemaster.co.za", true */ 'q', 'u', 'o', 't', 'e', 'm', 'a', 's', 't', 'e', 'r', '.', 'c', 'o', '.', 'z', 'a', '\0', /* "quotev.com", true */ 'q', 'u', 'o', 't', 'e', 'v', '.', 'c', 'o', 'm', '\0', /* "quppa.net", true */ 'q', 'u', 'p', 'p', 'a', '.', 'n', 'e', 't', '\0', @@ -10410,6 +10412,7 @@ static const char kSTSHostTable[] = { /* "renemayrhofer.com", true */ 'r', 'e', 'n', 'e', 'm', 'a', 'y', 'r', 'h', 'o', 'f', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "renemoser.net", true */ 'r', 'e', 'n', 'e', 'm', 'o', 's', 'e', 'r', '.', 'n', 'e', 't', '\0', /* "renewablefreedom.org", true */ 'r', 'e', 'n', 'e', 'w', 'a', 'b', 'l', 'e', 'f', 'r', 'e', 'e', 'd', 'o', 'm', '.', 'o', 'r', 'g', '\0', + /* "renideo.fr", true */ 'r', 'e', 'n', 'i', 'd', 'e', 'o', '.', 'f', 'r', '\0', /* "renkenlaw.com", true */ 'r', 'e', 'n', 'k', 'e', 'n', 'l', 'a', 'w', '.', 'c', 'o', 'm', '\0', /* "renkhosting.com", true */ 'r', 'e', 'n', 'k', 'h', 'o', 's', 't', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "renrenche.com", false */ 'r', 'e', 'n', 'r', 'e', 'n', 'c', 'h', 'e', '.', 'c', 'o', 'm', '\0', @@ -10420,7 +10423,6 @@ static const char kSTSHostTable[] = { /* "rentinsingapore.com.sg", true */ 'r', 'e', 'n', 't', 'i', 'n', 's', 'i', 'n', 'g', 'a', 'p', 'o', 'r', 'e', '.', 'c', 'o', 'm', '.', 's', 'g', '\0', /* "renuo.ch", true */ 'r', 'e', 'n', 'u', 'o', '.', 'c', 'h', '\0', /* "reox.at", false */ 'r', 'e', 'o', 'x', '.', 'a', 't', '\0', - /* "repaxan.com", true */ 'r', 'e', 'p', 'a', 'x', 'a', 'n', '.', 'c', 'o', 'm', '\0', /* "replicagunsswords.com", false */ 'r', 'e', 'p', 'l', 'i', 'c', 'a', 'g', 'u', 'n', 's', 's', 'w', 'o', 'r', 'd', 's', '.', 'c', 'o', 'm', '\0', /* "report-uri.com", true */ 'r', 'e', 'p', 'o', 'r', 't', '-', 'u', 'r', 'i', '.', 'c', 'o', 'm', '\0', /* "report-uri.io", true */ 'r', 'e', 'p', 'o', 'r', 't', '-', 'u', 'r', 'i', '.', 'i', 'o', '\0', @@ -10546,6 +10548,7 @@ static const char kSTSHostTable[] = { /* "ro.search.yahoo.com", false */ 'r', 'o', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0', /* "roadfeast.com", true */ 'r', 'o', 'a', 'd', 'f', 'e', 'a', 's', 't', '.', 'c', 'o', 'm', '\0', /* "roave.com", true */ 'r', 'o', 'a', 'v', 'e', '.', 'c', 'o', 'm', '\0', + /* "robandjanine.com", true */ 'r', 'o', 'b', 'a', 'n', 'd', 'j', 'a', 'n', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "roberthurlbut.com", true */ 'r', 'o', 'b', 'e', 'r', 't', 'h', 'u', 'r', 'l', 'b', 'u', 't', '.', 'c', 'o', 'm', '\0', /* "robertkrueger.de", true */ 'r', 'o', 'b', 'e', 'r', 't', 'k', 'r', 'u', 'e', 'g', 'e', 'r', '.', 'd', 'e', '\0', /* "roberto-webhosting.nl", true */ 'r', 'o', 'b', 'e', 'r', 't', 'o', '-', 'w', 'e', 'b', 'h', 'o', 's', 't', 'i', 'n', 'g', '.', 'n', 'l', '\0', @@ -10559,6 +10562,7 @@ static const char kSTSHostTable[] = { /* "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', /* "robtex.com", true */ 'r', 'o', 'b', 't', 'e', 'x', '.', 'c', 'o', 'm', '\0', /* "robtex.net", true */ 'r', 'o', 'b', 't', 'e', 'x', '.', 'n', 'e', 't', '\0', @@ -10868,6 +10872,7 @@ static const char kSTSHostTable[] = { /* "sb.im", true */ 's', 'b', '.', 'i', 'm', '\0', /* "sb.sb", true */ 's', 'b', '.', 's', 'b', '\0', /* "sber.us", true */ 's', 'b', 'e', 'r', '.', 'u', 's', '\0', + /* "sbiewald.de", true */ 's', 'b', 'i', 'e', 'w', 'a', 'l', 'd', '.', 'd', 'e', '\0', /* "sbirecruitment.co.in", true */ 's', 'b', 'i', 'r', 'e', 'c', 'r', 'u', 'i', 't', 'm', 'e', 'n', 't', '.', 'c', 'o', '.', 'i', 'n', '\0', /* "sbm.cloud", true */ 's', 'b', 'm', '.', 'c', 'l', 'o', 'u', 'd', '\0', /* "sbox-archives.com", true */ 's', 'b', 'o', 'x', '-', 'a', 'r', 'c', 'h', 'i', 'v', 'e', 's', '.', 'c', 'o', 'm', '\0', @@ -10876,6 +10881,7 @@ static const char kSTSHostTable[] = { /* "scandicom.fi", true */ 's', 'c', 'a', 'n', 'd', 'i', 'c', 'o', 'm', '.', 'f', 'i', '\0', /* "scandinavia.dating", true */ 's', 'c', 'a', 'n', 'd', 'i', 'n', 'a', 'v', 'i', 'a', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0', /* "scanleasing.net", true */ 's', 'c', 'a', 'n', 'l', 'e', 'a', 's', 'i', 'n', 'g', '.', 'n', 'e', 't', '\0', + /* "scannabi.com", true */ 's', 'c', 'a', 'n', 'n', 'a', 'b', 'i', '.', 'c', 'o', 'm', '\0', /* "scanpay.dk", true */ 's', 'c', 'a', 'n', 'p', 'a', 'y', '.', 'd', 'k', '\0', /* "scenester.tv", true */ 's', 'c', 'e', 'n', 'e', 's', 't', 'e', 'r', '.', 't', 'v', '\0', /* "schachburg.de", true */ 's', 'c', 'h', 'a', 'c', 'h', 'b', 'u', 'r', 'g', '.', 'd', 'e', '\0', @@ -10975,6 +10981,7 @@ static const char kSTSHostTable[] = { /* "sdcardrecovery.de", true */ 's', 'd', 'c', 'a', 'r', 'd', 'r', 'e', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'd', 'e', '\0', /* "se.search.yahoo.com", false */ 's', 'e', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0', /* "sea-godzilla.com", true */ 's', 'e', 'a', '-', 'g', 'o', 'd', 'z', 'i', 'l', 'l', 'a', '.', 'c', 'o', 'm', '\0', + /* "sealbaker.com", true */ 's', 'e', 'a', 'l', 'b', 'a', 'k', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "seamless.no", true */ 's', 'e', 'a', 'm', 'l', 'e', 's', 's', '.', 'n', 'o', '\0', /* "seanholcroft.co.uk", true */ 's', 'e', 'a', 'n', 'h', 'o', 'l', 'c', 'r', 'o', 'f', 't', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "search.yahoo.com", false */ 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0', @@ -11128,7 +11135,6 @@ static const char kSTSHostTable[] = { /* "servious.org", true */ 's', 'e', 'r', 'v', 'i', 'o', 'u', 's', '.', 'o', 'r', 'g', '\0', /* "seryo.net", true */ 's', 'e', 'r', 'y', 'o', '.', 'n', 'e', 't', '\0', /* "seryovpn.com", true */ 's', 'e', 'r', 'y', 'o', 'v', 'p', 'n', '.', 'c', 'o', 'm', '\0', - /* "sesha.co.za", true */ 's', 'e', 's', 'h', 'a', '.', 'c', 'o', '.', 'z', 'a', '\0', /* "sessionslogning.dk", true */ 's', 'e', 's', 's', 'i', 'o', 'n', 's', 'l', 'o', 'g', 'n', 'i', 'n', 'g', '.', 'd', 'k', '\0', /* "setfix.de", true */ 's', 'e', 't', 'f', 'i', 'x', '.', 'd', 'e', '\0', /* "sethcaplan.com", true */ 's', 'e', 't', 'h', 'c', 'a', 'p', 'l', 'a', 'n', '.', 'c', 'o', 'm', '\0', @@ -11608,7 +11614,6 @@ static const char kSTSHostTable[] = { /* "soporte.cc", true */ 's', 'o', 'p', 'o', 'r', 't', 'e', '.', 'c', 'c', '\0', /* "sor.so", true */ 's', 'o', 'r', '.', 's', 'o', '\0', /* "sorcix.com", true */ 's', 'o', 'r', 'c', 'i', 'x', '.', 'c', 'o', 'm', '\0', - /* "sorenstudios.com", true */ 's', 'o', 'r', 'e', 'n', 's', 't', 'u', 'd', 'i', 'o', 's', '.', 'c', 'o', 'm', '\0', /* "sorn.service.gov.uk", true */ 's', 'o', 'r', 'n', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'g', 'o', 'v', '.', 'u', 'k', '\0', /* "sortaweird.net", true */ 's', 'o', 'r', 't', 'a', 'w', 'e', 'i', 'r', 'd', '.', 'n', 'e', 't', '\0', /* "sorz.org", true */ 's', 'o', 'r', 'z', '.', 'o', 'r', 'g', '\0', @@ -11632,7 +11637,6 @@ static const char kSTSHostTable[] = { /* "sourcebox.be", true */ 's', 'o', 'u', 'r', 'c', 'e', 'b', 'o', 'x', '.', 'b', 'e', '\0', /* "sourcecode.love", true */ 's', 'o', 'u', 'r', 'c', 'e', 'c', 'o', 'd', 'e', '.', 'l', 'o', 'v', 'e', '\0', /* "sourcely.net", true */ 's', 'o', 'u', 'r', 'c', 'e', 'l', 'y', '.', 'n', 'e', 't', '\0', - /* "sourceway.de", true */ 's', 'o', 'u', 'r', 'c', 'e', 'w', 'a', 'y', '.', 'd', 'e', '\0', /* "sourcitec.com", true */ 's', 'o', 'u', 'r', 'c', 'i', 't', 'e', 'c', '.', 'c', 'o', 'm', '\0', /* "sous-surveillance.net", true */ 's', 'o', 'u', 's', '-', 's', 'u', 'r', 'v', 'e', 'i', 'l', 'l', 'a', 'n', 'c', 'e', '.', 'n', 'e', 't', '\0', /* "southamerican.dating", true */ 's', 'o', 'u', 't', 'h', 'a', 'm', 'e', 'r', 'i', 'c', 'a', 'n', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0', @@ -11952,7 +11956,7 @@ static const char kSTSHostTable[] = { /* "studiodewit.nl", true */ 's', 't', 'u', 'd', 'i', 'o', 'd', 'e', 'w', 'i', 't', '.', 'n', 'l', '\0', /* "studiomarcella.com", true */ 's', 't', 'u', 'd', 'i', 'o', 'm', 'a', 'r', 'c', 'e', 'l', 'l', 'a', '.', 'c', 'o', 'm', '\0', /* "studiostawki.com", true */ 's', 't', 'u', 'd', 'i', 'o', 's', 't', 'a', 'w', 'k', 'i', '.', 'c', 'o', 'm', '\0', - /* "studiostudio.net", true */ 's', 't', 'u', 'd', 'i', 'o', 's', 't', 'u', 'd', 'i', 'o', '.', 'n', 'e', 't', '\0', + /* "studiostudio.net", false */ 's', 't', 'u', 'd', 'i', 'o', 's', 't', 'u', 'd', 'i', 'o', '.', 'n', 'e', 't', '\0', /* "studiozelden.com", true */ 's', 't', 'u', 'd', 'i', 'o', 'z', 'e', 'l', 'd', 'e', 'n', '.', 'c', 'o', 'm', '\0', /* "studlan.no", true */ 's', 't', 'u', 'd', 'l', 'a', 'n', '.', 'n', 'o', '\0', /* "studyhub.cf", true */ 's', 't', 'u', 'd', 'y', 'h', 'u', 'b', '.', 'c', 'f', '\0', @@ -11980,7 +11984,6 @@ static const char kSTSHostTable[] = { /* "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', /* "suche.org", true */ 's', 'u', 'c', 'h', 'e', '.', 'o', 'r', 'g', '\0', /* "suckmyan.us", true */ 's', 'u', 'c', 'k', 'm', 'y', 'a', 'n', '.', 'u', 's', '\0', /* "sudaraka.org", true */ 's', 'u', 'd', 'a', 'r', 'a', 'k', 'a', '.', 'o', 'r', 'g', '\0', @@ -12016,8 +12019,8 @@ static const char kSTSHostTable[] = { /* "supernt.lt", true */ 's', 'u', 'p', 'e', 'r', 'n', 't', '.', 'l', 't', '\0', /* "superpase.com", true */ 's', 'u', 'p', 'e', 'r', 'p', 'a', 's', 'e', '.', 'c', 'o', 'm', '\0', /* "supersecurefancydomain.com", true */ 's', 'u', 'p', 'e', 'r', 's', 'e', 'c', 'u', 'r', 'e', 'f', 'a', 'n', 'c', 'y', 'd', 'o', 'm', 'a', 'i', 'n', '.', 'c', 'o', 'm', '\0', - /* "supersonnig-festival.de", true */ 's', 'u', 'p', 'e', 'r', 's', 'o', 'n', 'n', 'i', 'g', '-', 'f', 'e', 's', 't', 'i', 'v', 'a', 'l', '.', 'd', 'e', '\0', - /* "supersonnigfestival.de", true */ 's', 'u', 'p', 'e', 'r', 's', 'o', 'n', 'n', 'i', 'g', 'f', 'e', 's', 't', 'i', 'v', 'a', 'l', '.', 'd', 'e', '\0', + /* "supersonnig-festival.de", false */ 's', 'u', 'p', 'e', 'r', 's', 'o', 'n', 'n', 'i', 'g', '-', 'f', 'e', 's', 't', 'i', 'v', 'a', 'l', '.', 'd', 'e', '\0', + /* "supersonnigfestival.de", false */ 's', 'u', 'p', 'e', 'r', 's', 'o', 'n', 'n', 'i', 'g', 'f', 'e', 's', 't', 'i', 'v', 'a', 'l', '.', 'd', 'e', '\0', /* "superswingtrainer.com", true */ 's', 'u', 'p', 'e', 'r', 's', 'w', 'i', 'n', 'g', 't', 'r', 'a', 'i', 'n', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "superuser.fi", true */ 's', 'u', 'p', 'e', 'r', 'u', 's', 'e', 'r', '.', 'f', 'i', '\0', /* "supinbot.ovh", false */ 's', 'u', 'p', 'i', 'n', 'b', 'o', 't', '.', 'o', 'v', 'h', '\0', @@ -12492,6 +12495,7 @@ static const char kSTSHostTable[] = { /* "thibautcharles.net", true */ 't', 'h', 'i', 'b', 'a', 'u', 't', 'c', 'h', 'a', 'r', 'l', 'e', 's', '.', 'n', 'e', 't', '\0', /* "thierryhayoz.ch", true */ 't', 'h', 'i', 'e', 'r', 'r', 'y', 'h', 'a', 'y', 'o', 'z', '.', 'c', 'h', '\0', /* "thijsvanderveen.net", true */ 't', 'h', 'i', 'j', 's', 'v', 'a', 'n', 'd', 'e', 'r', 'v', 'e', 'e', 'n', '.', 'n', 'e', 't', '\0', + /* "thingies.site", true */ 't', 'h', 'i', 'n', 'g', 'i', 'e', 's', '.', 's', 'i', 't', 'e', '\0', /* "thinkcash.nl", true */ 't', 'h', 'i', 'n', 'k', 'c', 'a', 's', 'h', '.', 'n', 'l', '\0', /* "thinkcoding.org", true */ 't', 'h', 'i', 'n', 'k', 'c', 'o', 'd', 'i', 'n', 'g', '.', 'o', 'r', 'g', '\0', /* "thinkdo.jp", true */ 't', 'h', 'i', 'n', 'k', 'd', 'o', '.', 'j', 'p', '\0', @@ -12645,7 +12649,6 @@ static const char kSTSHostTable[] = { /* "todoist.com", true */ 't', 'o', 'd', 'o', 'i', 's', 't', '.', 'c', 'o', 'm', '\0', /* "tofu.im", true */ 't', 'o', 'f', 'u', '.', 'i', 'm', '\0', /* "togelonlinecommunity.com", false */ 't', 'o', 'g', 'e', 'l', 'o', 'n', 'l', 'i', 'n', 'e', 'c', 'o', 'm', 'm', 'u', 'n', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0', - /* "tokage.me", true */ 't', 'o', 'k', 'a', 'g', 'e', '.', 'm', 'e', '\0', /* "tokaido-kun.jp", true */ 't', 'o', 'k', 'a', 'i', 'd', 'o', '-', 'k', 'u', 'n', '.', 'j', 'p', '\0', /* "tokaido.com", true */ 't', 'o', 'k', 'a', 'i', 'd', 'o', '.', 'c', 'o', 'm', '\0', /* "tokenloan.com", true */ 't', 'o', 'k', 'e', 'n', 'l', 'o', 'a', 'n', '.', 'c', 'o', 'm', '\0', @@ -12673,6 +12676,7 @@ static const char kSTSHostTable[] = { /* "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', @@ -12928,7 +12932,7 @@ static const char kSTSHostTable[] = { /* "tumutanzi.com", true */ 't', 'u', 'm', 'u', 't', 'a', 'n', 'z', 'i', '.', 'c', 'o', 'm', '\0', /* "tunai.id", true */ 't', 'u', 'n', 'a', 'i', '.', 'i', 'd', '\0', /* "tunebitfm.de", true */ 't', 'u', 'n', 'e', 'b', 'i', 't', 'f', 'm', '.', 'd', 'e', '\0', - /* "tunefish-entertainment.de", true */ 't', 'u', 'n', 'e', 'f', 'i', 's', 'h', '-', 'e', 'n', 't', 'e', 'r', 't', 'a', 'i', 'n', 'm', 'e', 'n', 't', '.', 'd', 'e', '\0', + /* "tunefish-entertainment.de", false */ 't', 'u', 'n', 'e', 'f', 'i', 's', 'h', '-', 'e', 'n', 't', 'e', 'r', 't', 'a', 'i', 'n', 'm', 'e', 'n', 't', '.', 'd', 'e', '\0', /* "tunnelblick.net", true */ 't', 'u', 'n', 'n', 'e', 'l', 'b', 'l', 'i', 'c', 'k', '.', 'n', 'e', 't', '\0', /* "tunnelwatch.com", true */ 't', 'u', 'n', 'n', 'e', 'l', 'w', 'a', 't', 'c', 'h', '.', 'c', 'o', 'm', '\0', /* "tuntitili.fi", true */ 't', 'u', 'n', 't', 'i', 't', 'i', 'l', 'i', '.', 'f', 'i', '\0', @@ -12989,6 +12993,7 @@ static const char kSTSHostTable[] = { /* "typo3.com", true */ 't', 'y', 'p', 'o', '3', '.', 'c', 'o', 'm', '\0', /* "tysye.ca", true */ 't', 'y', 's', 'y', 'e', '.', 'c', 'a', '\0', /* "tzwe.com", true */ 't', 'z', 'w', 'e', '.', 'c', 'o', 'm', '\0', + /* "u03.fr", true */ 'u', '0', '3', '.', 'f', 'r', '\0', /* "u5b.de", true */ 'u', '5', 'b', '.', 'd', 'e', '\0', /* "uadp.pw", true */ 'u', 'a', 'd', 'p', '.', 'p', 'w', '\0', /* "uae-company-service.com", true */ 'u', 'a', 'e', '-', 'c', 'o', 'm', 'p', 'a', 'n', 'y', '-', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'c', 'o', 'm', '\0', @@ -13191,7 +13196,6 @@ static const char kSTSHostTable[] = { /* "utopicestudios.com", true */ 'u', 't', 'o', 'p', 'i', 'c', 'e', 's', 't', 'u', 'd', 'i', 'o', 's', '.', 'c', 'o', 'm', '\0', /* "uttnetgroup.fr", false */ 'u', 't', 't', 'n', 'e', 't', 'g', 'r', 'o', 'u', 'p', '.', 'f', 'r', '\0', /* "utvbloggen.se", true */ 'u', 't', 'v', 'b', 'l', 'o', 'g', 'g', 'e', 'n', '.', 's', 'e', '\0', - /* "uvarov.pw", false */ 'u', 'v', 'a', 'r', 'o', 'v', '.', 'p', 'w', '\0', /* "v0rtex.xyz", true */ 'v', '0', 'r', 't', 'e', 'x', '.', 'x', 'y', 'z', '\0', /* "v0tti.com", false */ 'v', '0', 't', 't', 'i', '.', 'c', 'o', 'm', '\0', /* "v2.pw", true */ 'v', '2', '.', 'p', 'w', '\0', @@ -13344,7 +13348,6 @@ static const char kSTSHostTable[] = { /* "vikings.net", true */ 'v', 'i', 'k', 'i', 'n', 'g', 's', '.', 'n', 'e', 't', '\0', /* "vilaydin.com", true */ 'v', 'i', 'l', 'a', 'y', 'd', 'i', 'n', '.', 'c', 'o', 'm', '\0', /* "villasenor.online", true */ 'v', 'i', 'l', 'l', 'a', 's', 'e', 'n', 'o', 'r', '.', 'o', 'n', 'l', 'i', 'n', 'e', '\0', - /* "villenvinkit.com", true */ 'v', 'i', 'l', 'l', 'e', 'n', 'v', 'i', 'n', 'k', 'i', 't', '.', 'c', 'o', 'm', '\0', /* "vimeo.com", true */ 'v', 'i', 'm', 'e', 'o', '.', 'c', 'o', 'm', '\0', /* "vinasec.se", true */ 'v', 'i', 'n', 'a', 's', 'e', 'c', '.', 's', 'e', '\0', /* "vincentcox.com", false */ 'v', 'i', 'n', 'c', 'e', 'n', 't', 'c', 'o', 'x', '.', 'c', 'o', 'm', '\0', @@ -13358,7 +13361,6 @@ static const char kSTSHostTable[] = { /* "violin4fun.nl", true */ 'v', 'i', 'o', 'l', 'i', 'n', '4', 'f', 'u', 'n', '.', 'n', 'l', '\0', /* "viphospitality.se", true */ 'v', 'i', 'p', 'h', 'o', 's', 'p', 'i', 't', 'a', 'l', 'i', 't', 'y', '.', 's', 'e', '\0', /* "vipi.es", true */ 'v', 'i', 'p', 'i', '.', 'e', 's', '\0', - /* "vipnettikasinoklubi.com", true */ 'v', 'i', 'p', 'n', 'e', 't', 't', 'i', 'k', 'a', 's', 'i', 'n', 'o', 'k', 'l', 'u', 'b', 'i', '.', 'c', 'o', 'm', '\0', /* "virginiacrimeanalysisnetwork.org", true */ 'v', 'i', 'r', 'g', 'i', 'n', 'i', 'a', 'c', 'r', 'i', 'm', 'e', 'a', 'n', 'a', 'l', 'y', 's', 'i', 's', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'o', 'r', 'g', '\0', /* "virtualdesignmedia.com", false */ 'v', 'i', 'r', 't', 'u', 'a', 'l', 'd', 'e', 's', 'i', 'g', 'n', 'm', 'e', 'd', 'i', 'a', '.', 'c', 'o', 'm', '\0', /* "virtuallifestyle.nl", true */ 'v', 'i', 'r', 't', 'u', 'a', 'l', 'l', 'i', 'f', 'e', 's', 't', 'y', 'l', 'e', '.', 'n', 'l', '\0', @@ -13739,6 +13741,7 @@ static const char kSTSHostTable[] = { /* "wikiclash.info", false */ 'w', 'i', 'k', 'i', 'c', 'l', 'a', 's', 'h', '.', 'i', 'n', 'f', 'o', '\0', /* "wikidata.org", true */ 'w', 'i', 'k', 'i', 'd', 'a', 't', 'a', '.', 'o', 'r', 'g', '\0', /* "wikidsystems.com", false */ 'w', 'i', 'k', 'i', 'd', 's', 'y', 's', 't', 'e', 'm', 's', '.', 'c', 'o', 'm', '\0', + /* "wikileaks.com", true */ 'w', 'i', 'k', 'i', 'l', 'e', 'a', 'k', 's', '.', 'c', 'o', 'm', '\0', /* "wikileaks.org", true */ 'w', 'i', 'k', 'i', 'l', 'e', 'a', 'k', 's', '.', 'o', 'r', 'g', '\0', /* "wikimedia.org", true */ 'w', 'i', 'k', 'i', 'm', 'e', 'd', 'i', 'a', '.', 'o', 'r', 'g', '\0', /* "wikimediafoundation.org", true */ 'w', 'i', 'k', 'i', 'm', 'e', 'd', 'i', 'a', 'f', 'o', 'u', 'n', 'd', 'a', 't', 'i', 'o', 'n', '.', 'o', 'r', 'g', '\0', @@ -14225,6 +14228,7 @@ static const char kSTSHostTable[] = { /* "yunpan.blue", true */ 'y', 'u', 'n', 'p', 'a', 'n', '.', 'b', 'l', 'u', 'e', '\0', /* "yurikirin.me", true */ 'y', 'u', 'r', 'i', 'k', 'i', 'r', 'i', 'n', '.', 'm', 'e', '\0', /* "yusa.me", true */ 'y', 'u', 's', 'a', '.', 'm', 'e', '\0', + /* "yutabon.com", false */ 'y', 'u', 't', 'a', 'b', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "yutangyun.com", true */ 'y', 'u', 't', 'a', 'n', 'g', 'y', 'u', 'n', '.', 'c', 'o', 'm', '\0', /* "yuushou.com", true */ 'y', 'u', 'u', 's', 'h', 'o', 'u', '.', 'c', 'o', 'm', '\0', /* "yux.fr", true */ 'y', 'u', 'x', '.', 'f', 'r', '\0', @@ -14470,8 +14474,8 @@ static const nsSTSPreload kSTSPreloadList[] = { { 877, true }, { 884, true }, { 893, true }, - { 900, true }, - { 911, true }, + { 900, false }, + { 911, false }, { 922, true }, { 929, true }, { 936, true }, @@ -14487,5194 +14491,5190 @@ static const nsSTSPreload kSTSPreloadList[] = { { 1057, true }, { 1063, true }, { 1078, true }, - { 1087, true }, - { 1105, true }, - { 1117, true }, - { 1126, true }, + { 1086, true }, + { 1095, true }, + { 1113, true }, + { 1125, true }, { 1134, true }, { 1142, true }, - { 1153, true }, - { 1162, true }, - { 1174, true }, + { 1150, true }, + { 1161, true }, + { 1170, true }, { 1182, true }, - { 1192, true }, - { 1208, false }, - { 1221, true }, - { 1230, true }, - { 1244, true }, - { 1253, true }, - { 1274, true }, - { 1283, true }, - { 1293, true }, - { 1308, true }, - { 1325, true }, - { 1341, true }, - { 1348, true }, - { 1361, true }, - { 1370, true }, - { 1382, false }, - { 1394, true }, + { 1190, true }, + { 1200, true }, + { 1216, false }, + { 1229, true }, + { 1238, true }, + { 1252, true }, + { 1261, true }, + { 1282, true }, + { 1291, true }, + { 1301, true }, + { 1316, true }, + { 1333, true }, + { 1349, true }, + { 1356, true }, + { 1369, true }, + { 1378, true }, + { 1390, false }, { 1402, true }, - { 1413, true }, - { 1420, true }, - { 1429, true }, - { 1438, false }, - { 1454, true }, - { 1467, true }, - { 1476, true }, - { 1495, true }, - { 1514, true }, - { 1526, true }, - { 1540, true }, - { 1552, true }, - { 1565, true }, + { 1410, true }, + { 1421, true }, + { 1428, true }, + { 1437, true }, + { 1446, false }, + { 1462, true }, + { 1475, true }, + { 1484, true }, + { 1503, true }, + { 1522, true }, + { 1534, true }, + { 1548, true }, + { 1560, true }, { 1573, true }, - { 1589, true }, - { 1604, true }, - { 1616, true }, - { 1629, true }, - { 1639, true }, - { 1653, true }, - { 1669, true }, - { 1683, true }, - { 1698, true }, - { 1712, true }, + { 1581, true }, + { 1597, true }, + { 1612, true }, + { 1624, true }, + { 1637, true }, + { 1647, true }, + { 1661, true }, + { 1677, true }, + { 1691, true }, + { 1706, true }, { 1720, true }, - { 1727, true }, - { 1734, true }, - { 1746, true }, - { 1757, true }, - { 1770, true }, - { 1779, true }, - { 1791, true }, - { 1802, true }, - { 1815, true }, - { 1830, true }, - { 1838, false }, - { 1851, true }, - { 1859, true }, - { 1871, true }, - { 1883, true }, - { 1898, true }, - { 1917, true }, - { 1924, false }, - { 1943, true }, - { 1953, true }, - { 1959, true }, - { 1968, true }, - { 1981, false }, - { 1988, true }, - { 2000, true }, - { 2009, true }, - { 2022, true }, - { 2032, true }, - { 2040, false }, - { 2047, true }, - { 2058, true }, - { 2070, true }, - { 2078, true }, - { 2091, true }, - { 2098, true }, - { 2107, true }, - { 2119, true }, - { 2128, true }, - { 2149, true }, - { 2173, true }, - { 2188, true }, - { 2199, true }, - { 2205, true }, - { 2218, true }, - { 2230, true }, - { 2242, true }, - { 2252, true }, - { 2269, true }, - { 2276, true }, - { 2285, true }, - { 2306, true }, - { 2319, false }, - { 2332, true }, - { 2342, true }, - { 2395, true }, - { 2407, true }, - { 2416, true }, - { 2425, true }, - { 2435, true }, - { 2445, true }, - { 2456, true }, - { 2464, true }, - { 2476, true }, - { 2486, true }, - { 2505, true }, - { 2516, true }, - { 2527, true }, - { 2536, true }, - { 2549, true }, - { 2569, true }, - { 2584, true }, - { 2599, true }, - { 2607, true }, - { 2617, true }, - { 2634, true }, - { 2649, true }, - { 2659, true }, - { 2666, false }, - { 2677, true }, - { 2692, false }, - { 2707, true }, - { 2726, true }, - { 2736, true }, - { 2747, true }, - { 2765, true }, - { 2776, true }, - { 2790, true }, - { 2802, true }, - { 2824, true }, - { 2840, true }, - { 2851, false }, - { 2867, false }, - { 2879, true }, - { 2892, true }, - { 2905, true }, - { 2922, true }, - { 2947, false }, - { 2955, true }, - { 2979, true }, - { 2998, true }, - { 3011, true }, - { 3023, true }, - { 3034, true }, - { 3058, true }, - { 3071, true }, - { 3080, true }, - { 3097, true }, - { 3109, true }, - { 3128, true }, - { 3151, true }, - { 3165, true }, - { 3181, true }, - { 3194, true }, - { 3211, true }, - { 3231, true }, - { 3246, true }, - { 3267, true }, - { 3287, true }, - { 3299, true }, - { 3310, true }, - { 3329, false }, - { 3336, true }, - { 3348, true }, - { 3369, true }, - { 3381, true }, - { 3398, true }, - { 3411, true }, - { 3427, true }, - { 3439, true }, - { 3452, false }, - { 3461, true }, - { 3471, true }, - { 3486, true }, - { 3503, true }, - { 3517, true }, - { 3533, true }, - { 3544, true }, - { 3556, true }, - { 3577, false }, - { 3587, true }, - { 3602, true }, - { 3616, true }, - { 3637, false }, - { 3650, true }, - { 3659, true }, - { 3673, true }, - { 3685, true }, - { 3700, true }, - { 3713, true }, - { 3725, true }, - { 3737, true }, - { 3749, true }, - { 3761, true }, - { 3773, true }, - { 3781, true }, - { 3792, true }, - { 3806, true }, - { 3822, true }, - { 3835, true }, - { 3852, true }, - { 3867, true }, - { 3882, true }, - { 3900, true }, - { 3909, true }, - { 3922, true }, - { 3943, true }, - { 3952, true }, - { 3962, true }, - { 3987, true }, - { 3998, true }, - { 4017, true }, - { 4029, true }, - { 4048, true }, - { 4067, true }, - { 4086, true }, - { 4105, true }, - { 4117, true }, - { 4132, true }, - { 4143, true }, - { 4156, true }, - { 4168, true }, - { 4181, true }, - { 4195, true }, - { 4206, true }, - { 4215, true }, - { 4229, true }, - { 4241, true }, - { 4268, true }, - { 4294, true }, - { 4307, true }, - { 4318, true }, - { 4342, true }, - { 4359, true }, - { 4387, true }, - { 4403, true }, - { 4412, true }, - { 4422, true }, - { 4436, true }, - { 4455, true }, - { 4465, true }, - { 4479, true }, - { 4487, false }, - { 4508, true }, - { 4526, true }, - { 4534, true }, - { 4543, true }, - { 4562, true }, - { 4576, true }, - { 4595, true }, - { 4608, true }, - { 4619, true }, - { 4639, true }, - { 4657, true }, - { 4675, false }, - { 4694, true }, - { 4708, true }, - { 4729, true }, - { 4745, true }, - { 4755, true }, - { 4768, true }, - { 4781, true }, - { 4795, true }, - { 4809, true }, - { 4819, true }, - { 4829, true }, - { 4839, true }, - { 4849, true }, - { 4859, true }, - { 4869, true }, - { 4886, true }, - { 4896, false }, - { 4904, true }, - { 4915, true }, - { 4926, true }, - { 4937, true }, - { 4946, true }, - { 4966, true }, - { 4977, true }, - { 5001, true }, - { 5015, true }, - { 5031, true }, - { 5043, true }, - { 5059, true }, - { 5070, true }, - { 5084, true }, - { 5100, true }, - { 5108, true }, - { 5125, true }, - { 5137, false }, - { 5161, true }, - { 5178, true }, - { 5186, false }, - { 5202, true }, - { 5210, true }, - { 5224, true }, - { 5236, false }, - { 5249, true }, - { 5261, true }, - { 5273, true }, - { 5287, true }, - { 5299, true }, - { 5309, true }, - { 5317, true }, - { 5327, true }, - { 5341, true }, - { 5354, true }, - { 5366, true }, - { 5385, true }, - { 5404, true }, - { 5420, true }, - { 5453, true }, - { 5463, true }, - { 5477, true }, - { 5484, true }, - { 5493, true }, - { 5500, true }, - { 5514, true }, - { 5522, true }, - { 5533, true }, - { 5548, true }, - { 5563, true }, - { 5580, true }, - { 5590, true }, - { 5601, true }, - { 5616, true }, - { 5627, true }, - { 5639, true }, - { 5650, true }, - { 5670, true }, - { 5681, true }, - { 5692, true }, - { 5703, true }, - { 5716, true }, + { 1728, true }, + { 1735, true }, + { 1747, true }, + { 1758, true }, + { 1771, true }, + { 1780, true }, + { 1792, true }, + { 1803, true }, + { 1816, true }, + { 1831, true }, + { 1839, false }, + { 1852, true }, + { 1860, true }, + { 1872, true }, + { 1884, true }, + { 1899, true }, + { 1918, true }, + { 1925, false }, + { 1944, true }, + { 1954, true }, + { 1960, true }, + { 1969, true }, + { 1982, false }, + { 1989, true }, + { 2001, true }, + { 2010, true }, + { 2023, true }, + { 2033, true }, + { 2041, false }, + { 2048, true }, + { 2059, true }, + { 2071, true }, + { 2079, true }, + { 2092, true }, + { 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, false }, + { 2678, true }, + { 2693, false }, + { 2708, true }, + { 2727, true }, + { 2737, true }, + { 2748, true }, + { 2766, true }, + { 2777, true }, + { 2791, true }, + { 2803, true }, + { 2825, true }, + { 2841, true }, + { 2852, false }, + { 2868, false }, + { 2880, true }, + { 2893, true }, + { 2906, true }, + { 2923, true }, + { 2948, false }, + { 2956, true }, + { 2980, true }, + { 2999, true }, + { 3012, true }, + { 3024, true }, + { 3035, true }, + { 3059, true }, + { 3072, true }, + { 3081, true }, + { 3098, true }, + { 3110, true }, + { 3129, true }, + { 3152, true }, + { 3166, true }, + { 3182, true }, + { 3195, true }, + { 3212, true }, + { 3232, true }, + { 3247, true }, + { 3268, true }, + { 3288, true }, + { 3300, true }, + { 3311, true }, + { 3330, false }, + { 3337, true }, + { 3349, true }, + { 3370, true }, + { 3382, true }, + { 3399, true }, + { 3412, true }, + { 3428, true }, + { 3440, true }, + { 3453, false }, + { 3462, true }, + { 3472, true }, + { 3487, true }, + { 3504, true }, + { 3518, true }, + { 3534, true }, + { 3545, true }, + { 3557, true }, + { 3578, false }, + { 3588, true }, + { 3603, true }, + { 3617, true }, + { 3638, false }, + { 3651, true }, + { 3660, true }, + { 3674, true }, + { 3686, true }, + { 3701, true }, + { 3714, true }, + { 3726, true }, + { 3738, true }, + { 3750, true }, + { 3762, true }, + { 3774, true }, + { 3782, true }, + { 3793, true }, + { 3807, true }, + { 3823, true }, + { 3836, true }, + { 3853, true }, + { 3868, true }, + { 3883, true }, + { 3901, true }, + { 3910, true }, + { 3923, false }, + { 3944, false }, + { 3953, false }, + { 3963, true }, + { 3988, true }, + { 3999, true }, + { 4018, true }, + { 4030, true }, + { 4049, true }, + { 4068, true }, + { 4087, true }, + { 4106, true }, + { 4118, true }, + { 4133, true }, + { 4144, true }, + { 4157, true }, + { 4169, true }, + { 4182, true }, + { 4196, true }, + { 4207, true }, + { 4216, true }, + { 4230, true }, + { 4242, true }, + { 4269, true }, + { 4295, true }, + { 4308, true }, + { 4319, true }, + { 4343, true }, + { 4360, true }, + { 4388, true }, + { 4404, true }, + { 4413, true }, + { 4423, true }, + { 4437, true }, + { 4456, true }, + { 4466, true }, + { 4480, true }, + { 4488, false }, + { 4509, true }, + { 4527, true }, + { 4535, true }, + { 4544, true }, + { 4563, true }, + { 4577, true }, + { 4596, true }, + { 4609, true }, + { 4620, true }, + { 4640, true }, + { 4658, true }, + { 4676, false }, + { 4695, false }, + { 4709, true }, + { 4730, true }, + { 4746, true }, + { 4756, true }, + { 4769, true }, + { 4782, true }, + { 4796, true }, + { 4810, true }, + { 4820, true }, + { 4830, true }, + { 4840, true }, + { 4850, true }, + { 4860, true }, + { 4870, true }, + { 4887, true }, + { 4897, false }, + { 4905, true }, + { 4916, true }, + { 4927, true }, + { 4938, true }, + { 4947, true }, + { 4967, true }, + { 4978, true }, + { 5002, true }, + { 5016, true }, + { 5032, true }, + { 5044, true }, + { 5060, true }, + { 5071, true }, + { 5085, true }, + { 5101, true }, + { 5109, true }, + { 5126, true }, + { 5138, false }, + { 5162, true }, + { 5179, true }, + { 5187, false }, + { 5203, true }, + { 5211, true }, + { 5225, true }, + { 5237, false }, + { 5250, true }, + { 5262, true }, + { 5274, true }, + { 5288, true }, + { 5300, true }, + { 5310, true }, + { 5318, true }, + { 5328, true }, + { 5342, true }, + { 5355, true }, + { 5367, true }, + { 5386, true }, + { 5405, true }, + { 5421, true }, + { 5454, true }, + { 5464, true }, + { 5478, true }, + { 5485, true }, + { 5502, true }, + { 5511, true }, + { 5518, true }, + { 5532, true }, + { 5540, true }, + { 5551, true }, + { 5566, true }, + { 5581, true }, + { 5598, true }, + { 5608, true }, + { 5619, true }, + { 5634, true }, + { 5645, true }, + { 5657, true }, + { 5668, true }, + { 5688, true }, + { 5699, true }, + { 5710, true }, + { 5721, true }, { 5734, true }, - { 5746, true }, - { 5755, true }, - { 5769, true }, - { 5780, true }, - { 5797, true }, - { 5808, true }, - { 5817, false }, - { 5843, true }, - { 5854, true }, - { 5864, false }, - { 5881, true }, - { 5891, true }, - { 5905, true }, - { 5917, true }, - { 5926, true }, - { 5943, true }, - { 5950, true }, - { 5974, true }, - { 5990, true }, - { 6010, true }, - { 6035, true }, - { 6060, true }, - { 6085, true }, - { 6097, true }, - { 6106, true }, - { 6133, true }, - { 6146, false }, - { 6155, true }, - { 6171, true }, - { 6187, true }, - { 6199, true }, - { 6213, true }, - { 6233, true }, - { 6248, true }, - { 6269, true }, - { 6281, true }, - { 6291, true }, - { 6303, true }, - { 6315, true }, - { 6324, true }, - { 6336, true }, - { 6355, true }, - { 6368, true }, - { 6379, true }, - { 6388, true }, - { 6399, true }, - { 6413, true }, - { 6427, true }, - { 6443, true }, - { 6459, true }, - { 6479, true }, - { 6493, true }, - { 6506, true }, - { 6516, true }, - { 6531, true }, - { 6541, true }, - { 6553, true }, - { 6568, true }, - { 6582, true }, - { 6597, true }, - { 6607, true }, - { 6621, true }, - { 6638, true }, - { 6653, true }, - { 6667, true }, + { 5752, true }, + { 5764, true }, + { 5773, true }, + { 5787, true }, + { 5798, true }, + { 5815, true }, + { 5826, true }, + { 5835, false }, + { 5861, true }, + { 5872, true }, + { 5882, false }, + { 5899, true }, + { 5909, true }, + { 5923, true }, + { 5935, true }, + { 5944, true }, + { 5961, true }, + { 5968, true }, + { 5992, true }, + { 6008, true }, + { 6028, true }, + { 6053, true }, + { 6078, true }, + { 6103, true }, + { 6115, true }, + { 6124, true }, + { 6151, true }, + { 6164, false }, + { 6173, true }, + { 6189, true }, + { 6205, true }, + { 6217, true }, + { 6231, true }, + { 6251, true }, + { 6266, true }, + { 6287, true }, + { 6299, true }, + { 6309, true }, + { 6321, true }, + { 6333, true }, + { 6342, true }, + { 6354, true }, + { 6373, true }, + { 6386, true }, + { 6397, true }, + { 6406, true }, + { 6420, true }, + { 6434, true }, + { 6450, true }, + { 6466, true }, + { 6486, true }, + { 6507, true }, + { 6521, true }, + { 6534, true }, + { 6544, true }, + { 6559, true }, + { 6569, true }, + { 6581, true }, + { 6596, true }, + { 6610, true }, + { 6625, true }, + { 6635, true }, + { 6649, true }, + { 6666, true }, { 6681, true }, - { 6697, true }, + { 6695, true }, { 6709, true }, - { 6721, true }, - { 6736, true }, - { 6750, true }, - { 6772, true }, - { 6784, true }, - { 6805, true }, - { 6817, true }, - { 6830, true }, - { 6842, true }, - { 6855, true }, + { 6725, true }, + { 6737, true }, + { 6749, true }, + { 6764, true }, + { 6778, true }, + { 6800, true }, + { 6812, true }, + { 6833, true }, + { 6845, true }, + { 6858, true }, { 6870, true }, - { 6881, true }, - { 6897, true }, - { 6908, true }, - { 6920, true }, - { 6933, true }, - { 6953, true }, - { 6974, true }, - { 6987, true }, - { 7005, true }, - { 7022, true }, - { 7046, true }, - { 7065, true }, - { 7076, true }, - { 7090, true }, - { 7106, true }, - { 7125, true }, - { 7138, true }, - { 7158, true }, - { 7178, true }, - { 7191, false }, - { 7204, true }, - { 7216, true }, - { 7226, true }, - { 7239, true }, - { 7253, true }, - { 7269, true }, - { 7283, true }, - { 7299, true }, + { 6883, true }, + { 6898, true }, + { 6909, true }, + { 6925, true }, + { 6936, true }, + { 6948, true }, + { 6961, true }, + { 6981, true }, + { 7002, true }, + { 7015, true }, + { 7033, true }, + { 7050, true }, + { 7074, true }, + { 7093, true }, + { 7104, true }, + { 7118, true }, + { 7134, true }, + { 7153, true }, + { 7166, true }, + { 7186, true }, + { 7206, true }, + { 7219, false }, + { 7232, true }, + { 7244, true }, + { 7254, true }, + { 7267, true }, + { 7281, true }, + { 7297, true }, { 7311, true }, - { 7325, true }, - { 7338, true }, - { 7352, true }, - { 7360, true }, - { 7373, true }, + { 7327, true }, + { 7339, true }, + { 7353, true }, + { 7366, true }, + { 7380, true }, { 7388, true }, - { 7402, true }, - { 7421, true }, - { 7433, true }, + { 7401, true }, + { 7416, true }, + { 7435, true }, { 7447, true }, { 7461, true }, - { 7473, true }, - { 7488, true }, - { 7499, true }, - { 7510, true }, + { 7475, true }, + { 7487, true }, + { 7502, true }, + { 7513, true }, { 7524, true }, - { 7536, true }, - { 7544, true }, - { 7555, true }, - { 7563, true }, - { 7571, true }, - { 7579, true }, - { 7587, true }, - { 7600, true }, - { 7607, true }, - { 7617, true }, - { 7630, true }, - { 7642, true }, - { 7655, true }, - { 7675, true }, - { 7687, true }, - { 7698, true }, - { 7716, true }, - { 7729, true }, - { 7738, true }, - { 7750, true }, + { 7538, true }, + { 7550, true }, + { 7558, true }, + { 7569, true }, + { 7577, true }, + { 7585, true }, + { 7593, true }, + { 7601, true }, + { 7614, true }, + { 7621, true }, + { 7631, true }, + { 7644, true }, + { 7656, true }, + { 7669, true }, + { 7689, true }, + { 7701, true }, + { 7712, true }, + { 7730, true }, + { 7743, true }, + { 7752, true }, { 7764, true }, - { 7777, true }, - { 7788, true }, - { 7798, true }, - { 7809, true }, - { 7819, true }, - { 7830, true }, - { 7839, true }, - { 7848, true }, - { 7864, true }, - { 7880, true }, - { 7908, true }, - { 7927, true }, - { 7942, true }, - { 7962, true }, - { 7974, true }, - { 7985, true }, - { 8000, true }, - { 8020, true }, - { 8038, true }, - { 8048, false }, - { 8059, true }, - { 8069, true }, - { 8086, true }, - { 8097, true }, - { 8106, true }, - { 8117, true }, - { 8136, true }, - { 8147, true }, - { 8165, true }, - { 8191, true }, - { 8213, true }, + { 7778, true }, + { 7791, true }, + { 7802, true }, + { 7812, true }, + { 7823, true }, + { 7833, true }, + { 7844, true }, + { 7853, true }, + { 7862, true }, + { 7878, true }, + { 7894, true }, + { 7922, true }, + { 7941, true }, + { 7956, true }, + { 7976, true }, + { 7988, true }, + { 7999, true }, + { 8014, true }, + { 8034, true }, + { 8052, true }, + { 8062, false }, + { 8073, true }, + { 8083, true }, + { 8100, true }, + { 8111, true }, + { 8120, true }, + { 8131, true }, + { 8150, true }, + { 8161, true }, + { 8179, true }, + { 8205, true }, { 8227, true }, - { 8242, true }, + { 8241, true }, { 8256, true }, { 8270, true }, - { 8285, true }, - { 8306, true }, - { 8316, true }, - { 8327, true }, - { 8348, true }, - { 8366, true }, - { 8379, true }, - { 8387, true }, - { 8400, true }, + { 8284, true }, + { 8299, true }, + { 8320, true }, + { 8330, true }, + { 8341, true }, + { 8362, true }, + { 8380, true }, + { 8393, true }, + { 8401, true }, { 8414, true }, - { 8430, true }, - { 8448, true }, - { 8470, true }, - { 8485, true }, - { 8502, true }, - { 8524, true }, - { 8539, true }, - { 8556, true }, - { 8572, true }, - { 8588, true }, - { 8605, true }, - { 8624, true }, - { 8639, true }, - { 8658, true }, - { 8675, true }, - { 8692, true }, - { 8704, true }, - { 8722, true }, - { 8739, true }, - { 8754, true }, + { 8428, true }, + { 8444, true }, + { 8462, true }, + { 8484, true }, + { 8499, true }, + { 8516, true }, + { 8538, true }, + { 8553, true }, + { 8570, true }, + { 8586, true }, + { 8602, true }, + { 8619, true }, + { 8638, true }, + { 8653, true }, + { 8672, true }, + { 8689, true }, + { 8706, true }, + { 8718, true }, + { 8736, true }, + { 8753, true }, { 8768, true }, - { 8785, true }, - { 8803, true }, - { 8818, true }, - { 8830, true }, - { 8843, true }, - { 8863, true }, - { 8874, true }, - { 8885, true }, - { 8896, true }, - { 8907, true }, - { 8918, true }, - { 8929, true }, - { 8941, true }, - { 8954, true }, - { 8973, true }, - { 8984, true }, - { 8997, true }, - { 9011, false }, - { 9024, false }, - { 9033, true }, - { 9050, true }, - { 9070, true }, - { 9081, true }, - { 9099, false }, - { 9132, true }, - { 9164, true }, - { 9191, true }, - { 9201, true }, - { 9219, true }, - { 9234, true }, - { 9246, true }, - { 9258, true }, - { 9278, true }, - { 9297, true }, - { 9317, true }, - { 9340, true }, - { 9364, true }, - { 9376, true }, - { 9387, true }, - { 9399, true }, - { 9411, true }, - { 9427, true }, - { 9444, true }, - { 9463, true }, - { 9477, true }, - { 9488, true }, - { 9521, true }, - { 9532, true }, - { 9545, true }, - { 9557, false }, - { 9581, true }, - { 9597, true }, - { 9613, true }, - { 9625, true }, - { 9641, true }, - { 9658, true }, - { 9672, true }, - { 9683, true }, - { 9701, true }, - { 9717, true }, - { 9738, true }, - { 9752, true }, - { 9767, true }, - { 9777, true }, - { 9794, true }, - { 9807, true }, - { 9820, true }, - { 9836, true }, - { 9847, true }, - { 9859, true }, - { 9870, true }, - { 9877, true }, - { 9885, true }, - { 9898, false }, - { 9906, true }, - { 9916, true }, - { 9930, false }, - { 9944, true }, - { 9960, true }, - { 9990, true }, - { 10013, true }, - { 10026, true }, - { 10045, true }, - { 10058, false }, - { 10077, true }, - { 10093, true }, - { 10109, false }, - { 10124, false }, - { 10137, true }, - { 10153, true }, - { 10165, true }, - { 10184, true }, - { 10203, true }, - { 10218, true }, - { 10239, false }, - { 10254, true }, - { 10267, true }, - { 10277, true }, - { 10288, true }, - { 10299, true }, - { 10313, true }, - { 10329, true }, - { 10346, false }, - { 10363, true }, - { 10389, true }, - { 10402, true }, - { 10416, true }, - { 10435, true }, - { 10456, true }, - { 10468, true }, - { 10482, true }, - { 10506, true }, - { 10519, true }, - { 10532, true }, - { 10546, true }, - { 10557, true }, - { 10566, true }, - { 10579, true }, - { 10592, true }, - { 10604, false }, - { 10622, true }, - { 10645, true }, - { 10672, true }, - { 10691, true }, - { 10703, true }, - { 10716, true }, - { 10736, true }, - { 10747, true }, - { 10759, true }, - { 10773, true }, - { 10781, true }, - { 10798, true }, - { 10811, true }, - { 10823, true }, - { 10841, true }, - { 10864, false }, - { 10880, true }, - { 10886, true }, - { 10898, true }, - { 10909, true }, - { 10926, true }, - { 10945, true }, - { 10957, true }, - { 10986, true }, - { 11002, true }, - { 11015, true }, - { 11029, true }, - { 11045, true }, - { 11058, true }, - { 11069, true }, - { 11078, true }, - { 11090, true }, - { 11106, true }, - { 11120, true }, - { 11136, true }, - { 11150, true }, - { 11158, true }, - { 11172, true }, - { 11192, true }, - { 11204, true }, - { 11220, true }, - { 11234, false }, - { 11247, true }, - { 11262, true }, - { 11276, true }, - { 11285, true }, - { 11297, true }, - { 11315, true }, - { 11330, true }, - { 11343, true }, - { 11353, true }, - { 11367, true }, - { 11393, true }, - { 11403, true }, - { 11417, true }, - { 11431, true }, - { 11449, true }, - { 11467, true }, - { 11477, true }, - { 11488, true }, - { 11504, true }, - { 11512, true }, - { 11520, true }, - { 11531, true }, - { 11541, true }, - { 11556, true }, - { 11575, true }, - { 11588, true }, - { 11603, true }, - { 11621, false }, - { 11636, true }, - { 11656, true }, - { 11667, true }, - { 11679, true }, - { 11692, true }, - { 11712, false }, - { 11726, true }, - { 11739, true }, - { 11757, true }, - { 11771, true }, - { 11784, true }, - { 11796, true }, - { 11810, true }, - { 11824, true }, - { 11836, true }, - { 11847, true }, - { 11858, true }, - { 11871, true }, - { 11886, true }, - { 11897, true }, - { 11908, true }, - { 11919, true }, - { 11929, true }, - { 11950, true }, - { 11961, true }, - { 11970, true }, - { 11977, true }, - { 11991, false }, - { 12004, true }, - { 12014, true }, - { 12027, true }, - { 12040, true }, - { 12051, true }, - { 12063, true }, - { 12077, true }, - { 12087, true }, - { 12105, true }, - { 12115, true }, - { 12127, true }, - { 12141, true }, - { 12151, true }, - { 12167, true }, - { 12184, true }, - { 12203, true }, - { 12217, true }, - { 12239, true }, - { 12265, true }, - { 12275, true }, - { 12290, true }, - { 12308, true }, - { 12319, true }, - { 12329, true }, - { 12339, true }, - { 12349, true }, - { 12358, true }, - { 12377, true }, - { 12397, true }, - { 12409, true }, - { 12423, true }, - { 12430, true }, - { 12440, true }, - { 12458, true }, - { 12480, true }, - { 12492, true }, - { 12504, true }, - { 12517, true }, - { 12529, true }, - { 12545, true }, - { 12554, true }, - { 12562, true }, - { 12574, false }, - { 12594, true }, - { 12601, true }, - { 12617, true }, - { 12633, true }, - { 12648, true }, - { 12658, true }, - { 12676, true }, - { 12703, true }, - { 12720, true }, - { 12738, true }, - { 12746, true }, - { 12760, true }, - { 12771, true }, - { 12780, true }, - { 12807, true }, - { 12817, true }, - { 12833, true }, - { 12845, true }, - { 12860, true }, - { 12872, true }, - { 12887, true }, - { 12902, true }, - { 12914, true }, - { 12935, true }, - { 12952, true }, - { 12966, true }, - { 12978, true }, - { 12988, true }, - { 12998, true }, - { 13013, true }, - { 13028, true }, - { 13041, true }, - { 13053, true }, - { 13061, true }, - { 13074, true }, - { 13092, true }, - { 13113, true }, - { 13127, true }, - { 13143, true }, - { 13153, true }, - { 13165, true }, - { 13178, true }, - { 13197, true }, - { 13223, true }, - { 13235, true }, - { 13251, true }, - { 13263, true }, - { 13282, true }, - { 13308, true }, - { 13321, true }, - { 13332, true }, - { 13343, true }, - { 13361, true }, - { 13391, true }, - { 13414, true }, - { 13427, false }, - { 13435, true }, - { 13447, true }, - { 13457, true }, - { 13473, true }, - { 13488, true }, - { 13506, true }, - { 13516, true }, - { 13537, true }, - { 13566, true }, - { 13582, true }, - { 13598, true }, - { 13619, true }, - { 13630, true }, - { 13642, true }, - { 13654, true }, - { 13677, true }, - { 13695, true }, - { 13713, true }, - { 13734, true }, - { 13759, true }, - { 13773, true }, - { 13786, true }, - { 13799, true }, - { 13812, true }, - { 13823, true }, - { 13839, true }, - { 13849, true }, - { 13861, true }, - { 13878, true }, - { 13890, true }, + { 8782, true }, + { 8799, true }, + { 8817, true }, + { 8832, true }, + { 8844, true }, + { 8857, true }, + { 8877, true }, + { 8888, true }, + { 8899, true }, + { 8910, true }, + { 8921, true }, + { 8932, true }, + { 8943, true }, + { 8955, true }, + { 8968, true }, + { 8987, true }, + { 8998, true }, + { 9011, true }, + { 9025, false }, + { 9038, true }, + { 9055, true }, + { 9075, true }, + { 9086, true }, + { 9104, false }, + { 9137, true }, + { 9169, true }, + { 9196, true }, + { 9206, true }, + { 9224, true }, + { 9239, true }, + { 9251, true }, + { 9263, true }, + { 9283, true }, + { 9302, true }, + { 9322, true }, + { 9345, true }, + { 9369, true }, + { 9381, true }, + { 9392, true }, + { 9404, true }, + { 9416, true }, + { 9432, true }, + { 9449, true }, + { 9468, true }, + { 9482, true }, + { 9493, true }, + { 9526, true }, + { 9537, true }, + { 9550, true }, + { 9562, false }, + { 9586, true }, + { 9602, true }, + { 9618, true }, + { 9630, true }, + { 9646, true }, + { 9663, true }, + { 9677, true }, + { 9688, true }, + { 9706, true }, + { 9722, true }, + { 9743, true }, + { 9757, true }, + { 9772, true }, + { 9782, true }, + { 9799, true }, + { 9812, true }, + { 9825, true }, + { 9841, true }, + { 9852, true }, + { 9864, true }, + { 9875, true }, + { 9882, true }, + { 9890, true }, + { 9903, false }, + { 9911, true }, + { 9921, true }, + { 9935, false }, + { 9949, true }, + { 9965, true }, + { 9995, true }, + { 10018, true }, + { 10031, true }, + { 10050, true }, + { 10063, false }, + { 10082, true }, + { 10098, true }, + { 10114, false }, + { 10129, false }, + { 10142, true }, + { 10158, true }, + { 10170, true }, + { 10189, true }, + { 10208, true }, + { 10223, true }, + { 10244, false }, + { 10259, true }, + { 10272, true }, + { 10282, true }, + { 10293, true }, + { 10304, true }, + { 10318, true }, + { 10334, true }, + { 10351, false }, + { 10368, true }, + { 10394, true }, + { 10407, true }, + { 10421, true }, + { 10440, true }, + { 10461, true }, + { 10473, true }, + { 10487, true }, + { 10511, true }, + { 10524, true }, + { 10537, true }, + { 10551, true }, + { 10562, true }, + { 10571, true }, + { 10584, true }, + { 10597, true }, + { 10609, false }, + { 10627, true }, + { 10650, true }, + { 10677, true }, + { 10696, true }, + { 10708, true }, + { 10721, true }, + { 10741, true }, + { 10752, true }, + { 10764, true }, + { 10778, true }, + { 10786, true }, + { 10803, true }, + { 10816, true }, + { 10828, true }, + { 10846, true }, + { 10869, false }, + { 10885, true }, + { 10891, true }, + { 10903, true }, + { 10914, true }, + { 10931, true }, + { 10950, true }, + { 10962, true }, + { 10991, true }, + { 11007, true }, + { 11020, true }, + { 11034, true }, + { 11050, true }, + { 11063, true }, + { 11074, true }, + { 11083, true }, + { 11095, true }, + { 11111, true }, + { 11125, true }, + { 11141, true }, + { 11155, true }, + { 11169, true }, + { 11189, true }, + { 11201, true }, + { 11217, true }, + { 11231, false }, + { 11244, true }, + { 11259, true }, + { 11273, true }, + { 11282, true }, + { 11294, true }, + { 11312, true }, + { 11327, true }, + { 11340, true }, + { 11350, true }, + { 11364, true }, + { 11390, true }, + { 11400, true }, + { 11414, true }, + { 11428, true }, + { 11446, true }, + { 11464, true }, + { 11474, true }, + { 11485, true }, + { 11501, true }, + { 11509, true }, + { 11517, true }, + { 11528, true }, + { 11538, true }, + { 11553, true }, + { 11572, true }, + { 11585, true }, + { 11600, true }, + { 11618, false }, + { 11633, true }, + { 11653, true }, + { 11664, true }, + { 11676, true }, + { 11689, true }, + { 11709, false }, + { 11723, true }, + { 11736, true }, + { 11754, true }, + { 11768, true }, + { 11781, true }, + { 11793, true }, + { 11807, true }, + { 11821, true }, + { 11833, true }, + { 11844, true }, + { 11855, true }, + { 11868, true }, + { 11883, true }, + { 11894, true }, + { 11905, true }, + { 11916, true }, + { 11926, true }, + { 11947, true }, + { 11958, true }, + { 11967, true }, + { 11974, true }, + { 11988, false }, + { 12001, true }, + { 12011, true }, + { 12024, true }, + { 12037, true }, + { 12048, true }, + { 12060, true }, + { 12074, true }, + { 12084, true }, + { 12102, true }, + { 12112, true }, + { 12124, true }, + { 12138, true }, + { 12148, true }, + { 12164, true }, + { 12181, true }, + { 12200, true }, + { 12214, true }, + { 12236, true }, + { 12262, true }, + { 12272, true }, + { 12287, true }, + { 12305, true }, + { 12316, true }, + { 12326, true }, + { 12336, true }, + { 12346, true }, + { 12355, true }, + { 12374, true }, + { 12394, true }, + { 12406, true }, + { 12420, true }, + { 12427, true }, + { 12437, true }, + { 12455, true }, + { 12477, true }, + { 12489, true }, + { 12501, true }, + { 12514, true }, + { 12526, true }, + { 12535, true }, + { 12543, true }, + { 12555, false }, + { 12575, true }, + { 12582, true }, + { 12598, true }, + { 12614, true }, + { 12629, true }, + { 12639, true }, + { 12657, true }, + { 12684, true }, + { 12701, true }, + { 12719, true }, + { 12727, true }, + { 12741, true }, + { 12752, true }, + { 12761, true }, + { 12788, true }, + { 12798, true }, + { 12814, true }, + { 12826, true }, + { 12841, true }, + { 12853, true }, + { 12868, true }, + { 12883, true }, + { 12895, true }, + { 12916, true }, + { 12933, true }, + { 12947, true }, + { 12959, true }, + { 12969, true }, + { 12979, true }, + { 12994, true }, + { 13009, true }, + { 13022, true }, + { 13034, true }, + { 13042, true }, + { 13055, true }, + { 13076, true }, + { 13090, true }, + { 13106, true }, + { 13116, true }, + { 13128, true }, + { 13141, true }, + { 13160, true }, + { 13186, true }, + { 13198, true }, + { 13214, true }, + { 13226, true }, + { 13245, true }, + { 13258, true }, + { 13269, true }, + { 13280, true }, + { 13298, true }, + { 13328, true }, + { 13351, true }, + { 13364, false }, + { 13372, true }, + { 13384, true }, + { 13394, true }, + { 13410, true }, + { 13425, true }, + { 13443, true }, + { 13453, true }, + { 13474, true }, + { 13503, true }, + { 13519, true }, + { 13535, true }, + { 13556, true }, + { 13567, true }, + { 13579, true }, + { 13591, true }, + { 13614, true }, + { 13632, true }, + { 13650, true }, + { 13671, true }, + { 13696, true }, + { 13710, true }, + { 13723, true }, + { 13738, true }, + { 13751, true }, + { 13764, true }, + { 13775, true }, + { 13791, true }, + { 13801, true }, + { 13813, true }, + { 13830, true }, + { 13842, true }, + { 13855, true }, + { 13863, true }, + { 13874, true }, + { 13885, true }, { 13903, true }, - { 13911, true }, - { 13922, true }, - { 13933, true }, - { 13951, true }, - { 13966, true }, - { 13984, true }, - { 13993, true }, - { 14004, true }, + { 13918, true }, + { 13936, true }, + { 13945, true }, + { 13956, true }, + { 13970, true }, + { 13981, true }, + { 13989, true }, + { 13999, true }, + { 14010, true }, { 14018, true }, - { 14029, true }, - { 14037, true }, - { 14047, true }, - { 14058, true }, - { 14066, true }, - { 14076, true }, - { 14091, true }, - { 14111, true }, + { 14028, true }, + { 14043, true }, + { 14063, true }, + { 14071, true }, + { 14096, true }, + { 14112, true }, { 14119, true }, - { 14144, true }, - { 14160, true }, - { 14167, true }, - { 14175, true }, - { 14184, false }, - { 14193, true }, - { 14209, true }, - { 14222, true }, - { 14231, true }, - { 14240, true }, - { 14255, true }, - { 14265, true }, - { 14277, true }, - { 14295, false }, - { 14311, true }, - { 14323, true }, - { 14333, true }, - { 14343, true }, - { 14353, true }, - { 14365, true }, - { 14378, true }, - { 14391, true }, - { 14401, true }, - { 14411, true }, - { 14421, true }, - { 14433, false }, - { 14445, true }, - { 14461, true }, - { 14472, false }, - { 14482, true }, - { 14490, true }, + { 14127, false }, + { 14136, true }, + { 14152, true }, + { 14165, true }, + { 14174, true }, + { 14183, true }, + { 14198, true }, + { 14208, true }, + { 14220, true }, + { 14238, false }, + { 14254, true }, + { 14266, true }, + { 14276, true }, + { 14286, true }, + { 14296, true }, + { 14308, true }, + { 14321, true }, + { 14334, true }, + { 14344, true }, + { 14354, true }, + { 14364, true }, + { 14376, false }, + { 14388, true }, + { 14404, true }, + { 14415, false }, + { 14425, true }, + { 14433, true }, + { 14442, true }, + { 14456, true }, + { 14471, true }, + { 14485, true }, { 14499, true }, - { 14513, true }, - { 14528, true }, - { 14542, true }, - { 14556, true }, - { 14567, true }, - { 14580, true }, - { 14604, true }, - { 14617, true }, - { 14629, true }, - { 14646, true }, - { 14657, true }, - { 14677, true }, - { 14695, true }, - { 14713, true }, - { 14728, true }, - { 14749, true }, - { 14773, true }, - { 14783, true }, - { 14793, true }, - { 14803, true }, - { 14814, true }, - { 14839, true }, - { 14868, true }, - { 14881, true }, - { 14900, true }, - { 14912, true }, - { 14922, true }, - { 14930, true }, - { 14939, true }, - { 14953, false }, - { 14970, true }, - { 14982, true }, - { 14997, true }, + { 14510, true }, + { 14523, true }, + { 14547, true }, + { 14560, true }, + { 14572, true }, + { 14589, true }, + { 14600, true }, + { 14620, true }, + { 14638, true }, + { 14656, true }, + { 14671, true }, + { 14692, true }, + { 14716, true }, + { 14726, true }, + { 14736, true }, + { 14746, true }, + { 14757, true }, + { 14782, true }, + { 14811, true }, + { 14824, true }, + { 14843, true }, + { 14855, true }, + { 14865, true }, + { 14873, true }, + { 14882, true }, + { 14896, false }, + { 14913, true }, + { 14925, true }, + { 14940, true }, + { 14947, true }, + { 14960, true }, + { 14972, true }, + { 14980, true }, + { 14995, true }, { 15004, true }, - { 15017, true }, - { 15029, true }, - { 15037, true }, - { 15052, true }, - { 15061, true }, - { 15073, true }, - { 15084, true }, - { 15100, true }, - { 15110, true }, - { 15125, true }, - { 15142, true }, - { 15155, true }, - { 15165, true }, - { 15178, true }, + { 15016, true }, + { 15027, true }, + { 15043, true }, + { 15053, true }, + { 15068, true }, + { 15085, true }, + { 15098, true }, + { 15108, true }, + { 15121, true }, + { 15135, true }, + { 15149, true }, + { 15161, true }, + { 15176, true }, { 15192, true }, - { 15206, true }, - { 15218, true }, - { 15233, true }, - { 15249, true }, - { 15264, true }, - { 15278, true }, - { 15291, true }, - { 15307, true }, - { 15319, true }, - { 15333, true }, - { 15345, true }, - { 15357, true }, - { 15368, true }, - { 15379, true }, - { 15395, true }, - { 15410, true }, - { 15425, false }, - { 15441, true }, - { 15459, true }, - { 15476, true }, + { 15207, true }, + { 15221, true }, + { 15234, true }, + { 15250, true }, + { 15262, true }, + { 15276, true }, + { 15288, true }, + { 15300, true }, + { 15311, true }, + { 15322, true }, + { 15338, true }, + { 15353, true }, + { 15368, false }, + { 15384, true }, + { 15402, true }, + { 15419, true }, + { 15437, true }, + { 15448, true }, + { 15461, true }, + { 15478, true }, { 15494, true }, - { 15505, true }, - { 15518, true }, - { 15535, true }, - { 15551, true }, - { 15571, true }, - { 15586, true }, - { 15600, true }, - { 15611, true }, - { 15623, true }, - { 15636, true }, - { 15650, true }, - { 15663, true }, - { 15681, true }, - { 15699, true }, - { 15717, true }, - { 15734, true }, - { 15744, true }, - { 15757, true }, - { 15766, true }, - { 15781, true }, - { 15792, false }, - { 15802, true }, - { 15813, true }, - { 15827, true }, - { 15840, true }, - { 15850, true }, - { 15863, true }, - { 15877, true }, - { 15888, true }, - { 15898, true }, - { 15916, true }, - { 15925, true }, - { 15937, true }, - { 15954, true }, - { 15974, true }, - { 15993, true }, + { 15514, true }, + { 15529, true }, + { 15543, true }, + { 15554, true }, + { 15566, true }, + { 15579, true }, + { 15593, true }, + { 15606, true }, + { 15624, true }, + { 15642, true }, + { 15660, true }, + { 15677, true }, + { 15687, true }, + { 15700, true }, + { 15709, true }, + { 15724, true }, + { 15735, false }, + { 15745, true }, + { 15756, true }, + { 15770, true }, + { 15783, true }, + { 15793, true }, + { 15806, true }, + { 15820, true }, + { 15831, true }, + { 15841, true }, + { 15859, true }, + { 15868, true }, + { 15880, true }, + { 15897, true }, + { 15917, true }, + { 15936, true }, + { 15951, true }, + { 15969, true }, + { 15982, true }, + { 15997, true }, { 16008, true }, - { 16026, true }, - { 16039, true }, + { 16022, true }, + { 16033, true }, + { 16043, true }, { 16054, true }, { 16065, true }, - { 16079, true }, - { 16090, true }, - { 16098, true }, - { 16108, true }, - { 16119, true }, - { 16130, true }, - { 16157, true }, - { 16167, true }, + { 16092, true }, + { 16102, true }, + { 16114, true }, + { 16126, true }, + { 16135, true }, + { 16144, true }, + { 16153, true }, + { 16168, true }, { 16179, true }, - { 16191, true }, + { 16188, true }, { 16200, true }, { 16209, true }, - { 16218, true }, - { 16233, true }, - { 16244, true }, - { 16253, true }, - { 16265, true }, - { 16274, true }, - { 16284, true }, - { 16295, true }, - { 16305, true }, - { 16317, true }, - { 16331, true }, - { 16341, true }, - { 16351, true }, - { 16361, false }, - { 16372, true }, - { 16390, true }, - { 16400, true }, - { 16419, true }, - { 16431, true }, - { 16446, true }, - { 16459, true }, - { 16472, true }, - { 16486, true }, - { 16499, false }, + { 16219, true }, + { 16230, true }, + { 16240, true }, + { 16252, true }, + { 16266, true }, + { 16276, true }, + { 16286, true }, + { 16296, false }, + { 16307, true }, + { 16325, true }, + { 16335, true }, + { 16354, true }, + { 16366, true }, + { 16381, true }, + { 16402, true }, + { 16415, true }, + { 16428, true }, + { 16442, true }, + { 16455, false }, + { 16469, true }, + { 16481, true }, + { 16495, true }, { 16513, true }, - { 16525, true }, - { 16539, true }, - { 16557, true }, - { 16570, false }, - { 16579, true }, - { 16597, true }, - { 16608, true }, - { 16622, true }, - { 16635, true }, - { 16649, true }, - { 16662, true }, - { 16676, true }, - { 16688, true }, - { 16704, true }, - { 16715, true }, - { 16730, true }, - { 16743, true }, - { 16756, true }, - { 16772, true }, - { 16784, true }, - { 16797, true }, - { 16809, true }, - { 16825, true }, - { 16838, true }, - { 16848, true }, - { 16876, true }, - { 16891, true }, - { 16907, true }, - { 16918, true }, - { 16929, true }, - { 16939, true }, - { 16949, false }, - { 16963, true }, - { 16975, false }, - { 16994, true }, - { 17021, true }, - { 17042, true }, + { 16526, false }, + { 16535, true }, + { 16553, true }, + { 16564, true }, + { 16578, true }, + { 16591, true }, + { 16605, true }, + { 16618, true }, + { 16632, true }, + { 16644, true }, + { 16660, true }, + { 16671, true }, + { 16686, true }, + { 16699, true }, + { 16712, true }, + { 16728, true }, + { 16740, true }, + { 16753, true }, + { 16765, true }, + { 16781, true }, + { 16794, true }, + { 16804, true }, + { 16832, true }, + { 16847, true }, + { 16863, true }, + { 16874, true }, + { 16885, true }, + { 16895, true }, + { 16905, false }, + { 16919, true }, + { 16931, false }, + { 16950, true }, + { 16977, true }, + { 16998, true }, + { 17014, true }, + { 17025, true }, + { 17043, true }, { 17058, true }, { 17069, true }, - { 17087, true }, - { 17102, true }, - { 17113, true }, - { 17128, false }, - { 17143, true }, - { 17153, true }, - { 17167, true }, - { 17189, true }, - { 17204, true }, - { 17219, true }, - { 17240, true }, - { 17250, true }, - { 17264, true }, - { 17277, true }, - { 17292, true }, - { 17313, true }, - { 17325, true }, - { 17343, true }, - { 17361, true }, - { 17375, true }, - { 17394, true }, + { 17084, false }, + { 17099, true }, + { 17109, true }, + { 17123, true }, + { 17145, true }, + { 17160, true }, + { 17175, true }, + { 17196, true }, + { 17206, true }, + { 17220, true }, + { 17233, true }, + { 17248, true }, + { 17269, true }, + { 17281, true }, + { 17299, true }, + { 17317, true }, + { 17331, true }, + { 17350, true }, + { 17364, true }, + { 17374, true }, + { 17385, true }, + { 17395, true }, { 17408, true }, - { 17418, true }, - { 17429, true }, - { 17439, true }, - { 17452, true }, - { 17467, true }, - { 17481, true }, - { 17494, true }, - { 17507, true }, - { 17524, true }, + { 17423, true }, + { 17437, true }, + { 17450, true }, + { 17463, true }, + { 17480, true }, + { 17496, true }, + { 17509, true }, + { 17526, true }, { 17540, true }, - { 17553, true }, + { 17552, true }, { 17570, true }, - { 17584, true }, - { 17596, true }, - { 17614, true }, - { 17627, true }, - { 17647, true }, - { 17663, true }, - { 17679, true }, - { 17688, true }, - { 17696, true }, - { 17705, true }, - { 17714, true }, - { 17731, true }, - { 17744, true }, - { 17754, true }, - { 17764, true }, - { 17774, true }, - { 17792, true }, - { 17811, true }, - { 17835, true }, - { 17849, true }, - { 17864, true }, - { 17882, true }, - { 17898, true }, - { 17910, true }, - { 17933, true }, + { 17583, true }, + { 17603, true }, + { 17619, true }, + { 17635, true }, + { 17644, true }, + { 17652, true }, + { 17661, true }, + { 17670, true }, + { 17687, true }, + { 17700, true }, + { 17710, true }, + { 17720, true }, + { 17730, true }, + { 17748, true }, + { 17767, true }, + { 17791, true }, + { 17805, true }, + { 17820, true }, + { 17838, true }, + { 17854, true }, + { 17866, true }, + { 17889, true }, + { 17911, true }, + { 17937, true }, { 17955, true }, - { 17981, true }, - { 17999, true }, - { 18021, true }, - { 18035, true }, - { 18048, true }, - { 18060, true }, - { 18072, false }, - { 18088, true }, - { 18102, true }, - { 18117, true }, + { 17977, true }, + { 17991, true }, + { 18004, true }, + { 18016, true }, + { 18028, false }, + { 18044, true }, + { 18059, true }, + { 18071, true }, + { 18093, true }, + { 18108, true }, { 18129, true }, - { 18151, true }, - { 18168, true }, - { 18183, true }, - { 18204, true }, - { 18218, true }, - { 18237, true }, + { 18143, true }, + { 18162, true }, + { 18179, true }, + { 18193, true }, + { 18206, true }, + { 18222, true }, + { 18235, true }, { 18254, true }, - { 18268, true }, - { 18281, true }, - { 18297, true }, - { 18310, true }, - { 18329, true }, - { 18346, true }, - { 18364, true }, - { 18382, true }, - { 18391, true }, - { 18407, true }, - { 18423, true }, - { 18442, true }, - { 18460, true }, - { 18476, true }, - { 18490, true }, - { 18502, true }, - { 18513, true }, - { 18526, true }, - { 18536, true }, - { 18546, true }, - { 18560, true }, - { 18570, true }, - { 18581, true }, - { 18590, false }, - { 18599, true }, + { 18271, true }, + { 18289, true }, + { 18307, true }, + { 18316, true }, + { 18332, true }, + { 18348, true }, + { 18367, true }, + { 18385, true }, + { 18401, true }, + { 18415, true }, + { 18427, true }, + { 18438, true }, + { 18451, true }, + { 18461, true }, + { 18471, true }, + { 18485, true }, + { 18495, true }, + { 18506, true }, + { 18515, false }, + { 18524, true }, + { 18538, true }, + { 18552, true }, + { 18564, true }, + { 18579, true }, + { 18589, true }, + { 18602, true }, { 18613, true }, - { 18627, true }, - { 18639, true }, - { 18654, true }, - { 18664, true }, - { 18677, true }, + { 18636, true }, + { 18648, true }, + { 18663, true }, + { 18679, true }, { 18688, true }, - { 18711, true }, - { 18723, true }, - { 18738, true }, - { 18754, true }, - { 18763, true }, - { 18778, true }, - { 18794, true }, - { 18809, true }, - { 18822, true }, - { 18835, true }, - { 18854, true }, - { 18864, true }, - { 18874, true }, - { 18886, true }, + { 18703, true }, + { 18719, true }, + { 18734, true }, + { 18747, true }, + { 18760, true }, + { 18779, true }, + { 18789, true }, + { 18799, true }, + { 18811, true }, + { 18826, true }, + { 18841, true }, + { 18851, true }, + { 18866, true }, + { 18882, true }, { 18901, true }, - { 18916, true }, - { 18926, true }, - { 18941, true }, - { 18957, true }, - { 18976, true }, - { 18985, true }, - { 18998, true }, - { 19018, true }, - { 19033, false }, - { 19048, true }, - { 19063, true }, - { 19078, true }, + { 18910, true }, + { 18923, true }, + { 18943, true }, + { 18958, false }, + { 18973, true }, + { 18988, true }, + { 19003, true }, + { 19013, true }, + { 19023, true }, + { 19038, true }, + { 19060, true }, + { 19075, true }, { 19088, true }, - { 19098, true }, - { 19113, true }, - { 19135, true }, - { 19150, true }, - { 19163, true }, - { 19190, true }, - { 19204, true }, - { 19216, true }, - { 19231, true }, - { 19245, true }, - { 19255, true }, - { 19276, true }, - { 19293, true }, - { 19315, true }, - { 19333, false }, - { 19352, true }, - { 19366, true }, - { 19378, true }, - { 19395, true }, - { 19410, true }, - { 19421, true }, - { 19437, true }, - { 19455, true }, - { 19467, true }, - { 19479, true }, - { 19493, false }, - { 19506, true }, - { 19523, true }, - { 19536, true }, - { 19548, true }, - { 19571, true }, - { 19584, true }, - { 19592, false }, - { 19603, true }, - { 19621, true }, - { 19642, true }, - { 19653, true }, - { 19667, true }, - { 19684, true }, - { 19695, true }, - { 19704, true }, - { 19716, true }, - { 19727, true }, - { 19737, false }, - { 19751, true }, - { 19769, true }, - { 19782, true }, - { 19793, true }, - { 19807, true }, - { 19819, true }, - { 19830, true }, - { 19841, true }, - { 19854, true }, - { 19866, true }, - { 19877, true }, - { 19896, true }, - { 19912, true }, - { 19926, true }, - { 19945, true }, - { 19957, true }, - { 19975, true }, + { 19115, true }, + { 19129, true }, + { 19141, true }, + { 19156, true }, + { 19170, true }, + { 19180, true }, + { 19201, true }, + { 19218, true }, + { 19240, true }, + { 19258, false }, + { 19277, true }, + { 19291, true }, + { 19303, true }, + { 19320, true }, + { 19335, true }, + { 19346, true }, + { 19362, true }, + { 19380, true }, + { 19392, true }, + { 19404, true }, + { 19418, false }, + { 19431, true }, + { 19448, true }, + { 19461, true }, + { 19473, true }, + { 19496, true }, + { 19509, true }, + { 19517, false }, + { 19528, true }, + { 19546, true }, + { 19567, true }, + { 19578, true }, + { 19592, true }, + { 19609, true }, + { 19620, true }, + { 19629, true }, + { 19641, true }, + { 19652, true }, + { 19662, false }, + { 19676, true }, + { 19694, true }, + { 19707, true }, + { 19718, true }, + { 19732, true }, + { 19744, true }, + { 19755, true }, + { 19766, true }, + { 19779, true }, + { 19791, true }, + { 19802, true }, + { 19821, true }, + { 19837, true }, + { 19851, true }, + { 19870, true }, + { 19882, true }, + { 19900, true }, + { 19915, true }, + { 19924, true }, + { 19939, true }, + { 19953, true }, + { 19966, true }, + { 19978, true }, { 19990, true }, - { 19999, true }, - { 20014, true }, - { 20028, true }, - { 20041, true }, - { 20053, true }, - { 20065, true }, - { 20079, true }, - { 20090, true }, + { 20004, true }, + { 20015, true }, + { 20029, true }, + { 20040, true }, + { 20051, true }, + { 20061, true }, + { 20071, true }, + { 20082, true }, + { 20093, true }, { 20104, true }, - { 20115, true }, - { 20126, true }, - { 20136, true }, - { 20146, true }, + { 20117, true }, + { 20131, true }, + { 20143, true }, { 20157, true }, - { 20168, true }, - { 20179, true }, - { 20192, true }, - { 20206, true }, - { 20218, true }, - { 20232, true }, - { 20244, true }, - { 20257, true }, - { 20282, true }, - { 20294, true }, - { 20311, true }, - { 20322, true }, - { 20333, true }, - { 20344, true }, - { 20363, true }, - { 20379, true }, - { 20389, true }, - { 20400, true }, + { 20169, true }, + { 20182, true }, + { 20207, true }, + { 20219, true }, + { 20236, true }, + { 20247, true }, + { 20258, true }, + { 20269, true }, + { 20288, true }, + { 20304, true }, + { 20314, true }, + { 20325, true }, + { 20337, true }, + { 20352, true }, + { 20371, true }, + { 20388, true }, + { 20396, true }, { 20412, true }, - { 20427, true }, - { 20446, true }, - { 20463, true }, - { 20471, true }, - { 20487, true }, - { 20501, true }, - { 20518, true }, - { 20535, true }, - { 20548, true }, - { 20561, true }, - { 20574, true }, - { 20587, true }, - { 20600, true }, - { 20613, true }, - { 20626, true }, - { 20639, true }, - { 20652, true }, - { 20665, true }, - { 20678, true }, - { 20691, true }, - { 20704, true }, - { 20717, true }, - { 20734, true }, - { 20749, true }, - { 20761, true }, - { 20783, true }, - { 20795, true }, - { 20818, true }, - { 20842, true }, - { 20860, true }, - { 20879, false }, - { 20900, true }, - { 20913, true }, - { 20928, true }, - { 20944, true }, - { 20970, true }, - { 20980, true }, - { 20997, true }, - { 21012, true }, - { 21031, true }, - { 21048, true }, + { 20426, true }, + { 20443, true }, + { 20460, true }, + { 20473, true }, + { 20486, true }, + { 20499, true }, + { 20512, true }, + { 20525, true }, + { 20538, true }, + { 20551, true }, + { 20564, true }, + { 20577, true }, + { 20590, true }, + { 20603, true }, + { 20616, true }, + { 20629, true }, + { 20642, true }, + { 20659, true }, + { 20674, true }, + { 20686, true }, + { 20708, true }, + { 20720, true }, + { 20743, true }, + { 20767, true }, + { 20785, true }, + { 20804, false }, + { 20825, true }, + { 20838, true }, + { 20853, true }, + { 20869, true }, + { 20895, true }, + { 20905, true }, + { 20922, true }, + { 20937, true }, + { 20956, true }, + { 20973, true }, + { 20989, true }, + { 21001, true }, + { 21011, true }, + { 21021, true }, + { 21042, true }, { 21064, true }, { 21076, true }, - { 21086, true }, - { 21096, true }, - { 21117, true }, - { 21139, true }, - { 21151, true }, - { 21162, true }, - { 21177, true }, - { 21188, true }, - { 21203, true }, - { 21218, true }, - { 21230, true }, - { 21249, true }, + { 21087, true }, + { 21102, true }, + { 21113, true }, + { 21128, true }, + { 21143, true }, + { 21155, true }, + { 21174, true }, + { 21187, true }, + { 21201, true }, + { 21223, true }, + { 21242, true }, { 21262, true }, - { 21276, true }, - { 21298, true }, - { 21317, true }, - { 21337, true }, - { 21345, true }, - { 21358, true }, - { 21372, true }, - { 21386, true }, - { 21397, true }, + { 21270, true }, + { 21283, true }, + { 21297, true }, + { 21311, true }, + { 21322, true }, + { 21335, true }, + { 21351, true }, + { 21366, true }, + { 21380, true }, + { 21398, true }, { 21410, true }, - { 21426, true }, - { 21441, true }, - { 21455, true }, - { 21473, true }, - { 21485, true }, - { 21502, false }, - { 21518, false }, - { 21538, true }, - { 21551, true }, - { 21567, true }, - { 21592, true }, - { 21608, true }, - { 21621, true }, - { 21634, true }, - { 21645, true }, - { 21661, true }, - { 21675, true }, - { 21691, true }, - { 21702, true }, - { 21715, true }, - { 21730, true }, - { 21744, true }, - { 21756, true }, - { 21776, true }, - { 21788, true }, - { 21801, true }, - { 21814, true }, - { 21835, true }, - { 21855, true }, - { 21869, true }, - { 21884, true }, - { 21899, true }, - { 21908, true }, - { 21919, true }, - { 21929, true }, - { 21939, true }, - { 21957, true }, - { 21982, true }, - { 21993, true }, + { 21427, false }, + { 21443, false }, + { 21463, true }, + { 21476, true }, + { 21492, true }, + { 21517, true }, + { 21533, true }, + { 21546, true }, + { 21559, true }, + { 21570, true }, + { 21586, true }, + { 21600, true }, + { 21616, true }, + { 21627, true }, + { 21640, true }, + { 21655, true }, + { 21669, true }, + { 21681, true }, + { 21701, true }, + { 21713, true }, + { 21726, true }, + { 21739, true }, + { 21760, true }, + { 21780, true }, + { 21794, true }, + { 21809, true }, + { 21824, true }, + { 21833, true }, + { 21844, true }, + { 21854, true }, + { 21864, true }, + { 21882, true }, + { 21907, true }, + { 21918, true }, + { 21940, true }, + { 21952, true }, + { 21965, true }, + { 21978, true }, + { 21986, true }, + { 22005, true }, { 22015, true }, - { 22027, true }, - { 22040, true }, - { 22053, true }, - { 22061, true }, - { 22080, true }, - { 22090, true }, - { 22103, true }, - { 22118, true }, - { 22135, true }, - { 22151, true }, + { 22028, true }, + { 22043, true }, + { 22060, true }, + { 22076, true }, + { 22088, true }, + { 22100, true }, + { 22111, true }, + { 22125, true }, + { 22149, false }, { 22163, true }, - { 22175, true }, - { 22186, true }, - { 22200, true }, - { 22224, false }, - { 22238, true }, - { 22253, true }, - { 22268, true }, - { 22290, true }, - { 22301, true }, + { 22178, true }, + { 22193, true }, + { 22215, true }, + { 22226, true }, + { 22239, true }, + { 22259, true }, + { 22270, true }, + { 22278, true }, + { 22295, true }, { 22314, true }, - { 22334, true }, - { 22345, true }, - { 22353, true }, - { 22370, true }, - { 22389, true }, - { 22403, true }, + { 22328, true }, + { 22343, true }, + { 22358, true }, + { 22373, true }, + { 22383, true }, + { 22392, true }, + { 22406, true }, { 22418, true }, - { 22433, true }, - { 22448, true }, - { 22458, true }, - { 22467, true }, - { 22481, true }, - { 22493, true }, - { 22519, true }, - { 22534, true }, - { 22549, true }, - { 22561, true }, - { 22579, true }, - { 22599, true }, + { 22444, true }, + { 22459, true }, + { 22474, true }, + { 22486, true }, + { 22504, true }, + { 22524, true }, + { 22540, true }, + { 22552, true }, + { 22569, true }, + { 22581, true }, + { 22595, true }, { 22615, true }, { 22627, true }, { 22644, true }, - { 22656, true }, - { 22670, true }, - { 22690, true }, - { 22702, true }, - { 22719, true }, - { 22728, true }, - { 22740, true }, - { 22762, false }, - { 22776, true }, - { 22792, true }, - { 22809, true }, - { 22821, true }, - { 22839, false }, - { 22861, false }, - { 22886, false }, + { 22653, true }, + { 22665, true }, + { 22687, false }, + { 22701, true }, + { 22717, true }, + { 22734, true }, + { 22746, true }, + { 22764, false }, + { 22786, false }, + { 22811, false }, + { 22835, true }, + { 22847, true }, + { 22857, true }, + { 22870, true }, + { 22880, true }, + { 22890, true }, + { 22900, true }, { 22910, true }, - { 22922, true }, - { 22932, true }, - { 22945, true }, - { 22955, true }, - { 22965, true }, - { 22975, true }, - { 22985, true }, - { 22995, true }, - { 23005, true }, - { 23015, true }, - { 23029, true }, - { 23047, true }, - { 23062, true }, - { 23076, true }, - { 23088, true }, - { 23100, true }, - { 23111, true }, - { 23125, true }, - { 23140, true }, + { 22920, true }, + { 22930, true }, + { 22940, true }, + { 22954, true }, + { 22972, true }, + { 22987, true }, + { 23001, true }, + { 23013, true }, + { 23025, true }, + { 23036, true }, + { 23050, true }, + { 23065, true }, + { 23079, true }, + { 23086, true }, + { 23100, false }, + { 23120, true }, + { 23139, true }, { 23154, true }, - { 23161, true }, - { 23175, false }, - { 23195, true }, - { 23214, true }, - { 23229, true }, - { 23241, true }, - { 23252, true }, - { 23264, true }, - { 23277, false }, - { 23290, true }, + { 23166, true }, + { 23177, true }, + { 23189, true }, + { 23202, false }, + { 23215, true }, + { 23231, true }, + { 23244, true }, + { 23256, true }, + { 23271, true }, + { 23281, true }, { 23306, true }, - { 23319, true }, - { 23331, true }, - { 23346, true }, - { 23356, true }, - { 23381, true }, - { 23396, true }, - { 23416, true }, - { 23428, true }, - { 23444, true }, - { 23472, false }, - { 23484, true }, - { 23497, true }, - { 23506, true }, - { 23516, true }, + { 23321, true }, + { 23341, true }, + { 23353, true }, + { 23369, true }, + { 23397, false }, + { 23409, true }, + { 23422, true }, + { 23431, true }, + { 23441, true }, + { 23450, true }, + { 23459, true }, + { 23466, true }, + { 23481, true }, + { 23492, false }, + { 23508, true }, { 23525, true }, - { 23534, true }, - { 23541, true }, - { 23556, true }, - { 23567, false }, - { 23583, true }, + { 23539, true }, + { 23549, true }, + { 23569, true }, + { 23589, true }, { 23600, true }, { 23614, true }, - { 23624, true }, - { 23644, true }, - { 23664, true }, - { 23675, true }, - { 23689, true }, - { 23704, true }, - { 23717, true }, - { 23732, true }, - { 23749, true }, - { 23757, true }, - { 23771, true }, - { 23783, true }, - { 23800, false }, - { 23821, false }, - { 23843, false }, - { 23862, false }, - { 23880, true }, - { 23896, true }, - { 23920, true }, - { 23948, true }, - { 23959, true }, - { 23974, true }, - { 23993, true }, - { 24016, true }, + { 23629, true }, + { 23642, true }, + { 23657, true }, + { 23674, true }, + { 23682, true }, + { 23696, true }, + { 23708, true }, + { 23725, false }, + { 23746, false }, + { 23768, false }, + { 23787, false }, + { 23805, true }, + { 23821, true }, + { 23845, true }, + { 23873, true }, + { 23884, true }, + { 23899, true }, + { 23918, true }, + { 23941, true }, + { 23965, true }, + { 23982, true }, + { 23996, true }, + { 24007, true }, + { 24025, true }, { 24040, true }, - { 24057, true }, - { 24071, true }, - { 24082, true }, - { 24100, true }, - { 24115, true }, - { 24128, true }, - { 24141, true }, - { 24156, true }, - { 24171, true }, - { 24183, true }, - { 24198, true }, - { 24217, true }, - { 24235, true }, - { 24243, true }, - { 24251, true }, + { 24053, true }, + { 24066, true }, + { 24081, true }, + { 24096, true }, + { 24108, true }, + { 24123, true }, + { 24142, true }, + { 24160, true }, + { 24168, true }, + { 24176, true }, + { 24188, true }, + { 24200, true }, + { 24218, true }, + { 24233, true }, + { 24248, true }, { 24263, true }, - { 24275, true }, - { 24293, true }, - { 24308, true }, - { 24323, true }, - { 24338, true }, - { 24354, true }, - { 24371, true }, - { 24380, true }, - { 24393, true }, - { 24403, true }, - { 24416, false }, + { 24279, true }, + { 24296, true }, + { 24305, true }, + { 24318, true }, + { 24328, true }, + { 24341, false }, + { 24355, true }, + { 24368, true }, + { 24384, false }, + { 24391, true }, + { 24401, true }, + { 24415, true }, { 24430, true }, - { 24443, true }, - { 24459, false }, - { 24466, true }, - { 24476, true }, - { 24490, true }, - { 24505, true }, - { 24513, true }, - { 24521, true }, - { 24531, true }, - { 24549, true }, - { 24562, true }, - { 24575, true }, - { 24584, true }, - { 24594, true }, - { 24609, true }, - { 24638, true }, - { 24655, true }, - { 24673, true }, - { 24683, true }, - { 24697, true }, - { 24708, true }, - { 24725, true }, - { 24739, true }, - { 24761, true }, - { 24786, true }, - { 24799, true }, - { 24812, true }, - { 24829, true }, + { 24438, true }, + { 24446, true }, + { 24456, true }, + { 24474, true }, + { 24487, true }, + { 24500, true }, + { 24509, true }, + { 24519, true }, + { 24534, true }, + { 24563, true }, + { 24580, true }, + { 24598, true }, + { 24608, true }, + { 24622, true }, + { 24633, true }, + { 24650, true }, + { 24664, true }, + { 24686, true }, + { 24711, true }, + { 24724, true }, + { 24737, true }, + { 24754, true }, + { 24772, true }, + { 24787, true }, + { 24797, true }, + { 24818, true }, + { 24828, false }, { 24847, true }, - { 24862, true }, + { 24859, true }, { 24872, true }, - { 24893, true }, - { 24903, false }, + { 24901, true }, { 24922, true }, - { 24934, true }, - { 24947, true }, + { 24936, true }, + { 24962, true }, { 24976, true }, + { 24984, true }, { 24997, true }, - { 25011, true }, + { 25009, true }, + { 25021, true }, { 25037, true }, { 25051, true }, - { 25059, true }, - { 25072, true }, - { 25084, true }, + { 25070, true }, + { 25083, true }, { 25096, true }, - { 25112, true }, - { 25126, true }, - { 25145, true }, - { 25158, true }, - { 25171, true }, - { 25190, false }, - { 25200, true }, - { 25222, true }, - { 25236, true }, - { 25252, true }, - { 25267, true }, - { 25283, true }, - { 25300, true }, - { 25311, false }, - { 25319, true }, + { 25115, true }, + { 25128, false }, + { 25138, true }, + { 25160, true }, + { 25174, true }, + { 25190, true }, + { 25205, true }, + { 25221, true }, + { 25238, true }, + { 25249, false }, + { 25257, true }, + { 25273, true }, + { 25293, true }, + { 25307, true }, + { 25322, true }, { 25335, true }, - { 25355, true }, - { 25369, true }, - { 25384, true }, - { 25397, true }, - { 25409, true }, - { 25421, true }, - { 25434, true }, - { 25447, false }, - { 25469, true }, - { 25493, true }, - { 25516, true }, - { 25534, true }, - { 25560, true }, - { 25587, true }, - { 25610, true }, - { 25626, true }, - { 25651, true }, - { 25680, true }, - { 25696, true }, - { 25708, true }, - { 25721, true }, - { 25734, true }, - { 25743, true }, - { 25752, true }, - { 25769, true }, - { 25782, true }, - { 25791, true }, - { 25800, true }, + { 25347, true }, + { 25359, true }, + { 25372, true }, + { 25385, false }, + { 25407, true }, + { 25431, true }, + { 25454, true }, + { 25472, true }, + { 25498, true }, + { 25525, true }, + { 25548, true }, + { 25564, true }, + { 25589, true }, + { 25618, true }, + { 25634, true }, + { 25646, true }, + { 25659, true }, + { 25672, true }, + { 25681, true }, + { 25690, true }, + { 25707, true }, + { 25720, true }, + { 25729, true }, + { 25738, true }, + { 25746, true }, + { 25755, true }, + { 25764, true }, + { 25788, true }, + { 25798, true }, { 25808, true }, { 25817, true }, - { 25826, true }, - { 25850, true }, - { 25860, true }, + { 25830, true }, + { 25842, true }, + { 25856, true }, { 25870, true }, - { 25879, true }, - { 25892, true }, - { 25904, true }, - { 25918, true }, - { 25932, true }, - { 25950, true }, - { 25965, true }, - { 25979, true }, - { 25991, true }, - { 26007, true }, - { 26020, true }, - { 26035, true }, - { 26047, true }, - { 26062, true }, - { 26076, true }, - { 26085, true }, - { 26094, true }, - { 26108, true }, - { 26117, true }, - { 26131, true }, - { 26140, true }, - { 26153, true }, - { 26163, true }, - { 26173, true }, - { 26188, true }, - { 26203, true }, - { 26217, true }, + { 25888, true }, + { 25903, true }, + { 25917, true }, + { 25929, true }, + { 25945, true }, + { 25958, true }, + { 25973, true }, + { 25985, true }, + { 26000, true }, + { 26014, true }, + { 26023, true }, + { 26032, true }, + { 26046, true }, + { 26055, true }, + { 26069, true }, + { 26078, true }, + { 26091, true }, + { 26101, true }, + { 26111, true }, + { 26126, true }, + { 26141, true }, + { 26155, true }, + { 26170, true }, + { 26183, true }, + { 26202, true }, + { 26218, true }, { 26232, true }, - { 26245, true }, - { 26264, true }, - { 26280, true }, - { 26294, true }, - { 26310, true }, - { 26321, true }, - { 26335, true }, - { 26345, true }, - { 26357, true }, - { 26373, true }, - { 26387, true }, - { 26392, true }, - { 26403, true }, - { 26411, true }, - { 26418, true }, - { 26427, true }, - { 26442, false }, - { 26462, true }, - { 26472, true }, - { 26485, true }, - { 26503, true }, - { 26516, true }, - { 26532, true }, - { 26544, true }, - { 26556, true }, - { 26569, true }, - { 26580, true }, - { 26598, true }, - { 26611, true }, - { 26624, true }, - { 26640, true }, - { 26660, true }, - { 26676, true }, - { 26684, true }, - { 26695, false }, - { 26705, true }, - { 26717, true }, + { 26248, true }, + { 26259, true }, + { 26273, true }, + { 26283, true }, + { 26295, true }, + { 26311, true }, + { 26325, true }, + { 26330, true }, + { 26341, true }, + { 26349, true }, + { 26356, true }, + { 26365, true }, + { 26380, false }, + { 26400, true }, + { 26410, true }, + { 26423, true }, + { 26441, true }, + { 26454, true }, + { 26470, true }, + { 26482, true }, + { 26494, true }, + { 26507, true }, + { 26518, true }, + { 26529, true }, + { 26547, true }, + { 26560, true }, + { 26573, true }, + { 26589, true }, + { 26609, true }, + { 26625, true }, + { 26633, true }, + { 26644, false }, + { 26654, true }, + { 26666, true }, + { 26680, true }, + { 26699, true }, + { 26707, true }, { 26731, true }, { 26750, true }, - { 26758, true }, - { 26782, true }, - { 26801, true }, - { 26815, false }, - { 26831, true }, - { 26845, true }, - { 26857, false }, - { 26872, true }, - { 26884, true }, - { 26896, true }, - { 26910, false }, - { 26922, true }, - { 26934, true }, - { 26945, true }, - { 26959, true }, - { 26972, true }, + { 26764, false }, + { 26780, true }, + { 26794, true }, + { 26806, false }, + { 26821, true }, + { 26833, false }, + { 26841, true }, + { 26853, true }, + { 26867, false }, + { 26879, true }, + { 26891, true }, + { 26902, true }, + { 26916, true }, + { 26929, true }, + { 26941, true }, + { 26954, true }, + { 26974, true }, { 26984, true }, - { 26997, true }, - { 27017, true }, - { 27027, true }, - { 27046, true }, - { 27058, true }, - { 27069, true }, - { 27081, true }, - { 27104, true }, - { 27127, true }, - { 27138, true }, - { 27153, true }, - { 27169, true }, - { 27185, true }, + { 27003, true }, + { 27015, true }, + { 27026, true }, + { 27038, true }, + { 27061, true }, + { 27084, true }, + { 27095, true }, + { 27110, true }, + { 27126, true }, + { 27142, true }, + { 27160, false }, + { 27183, true }, { 27203, true }, - { 27223, true }, - { 27237, true }, - { 27260, true }, - { 27279, true }, - { 27297, true }, - { 27314, true }, - { 27340, true }, - { 27359, true }, - { 27375, true }, - { 27389, true }, - { 27410, true }, - { 27426, true }, - { 27451, true }, - { 27465, true }, - { 27483, true }, - { 27492, true }, - { 27504, true }, - { 27517, true }, - { 27529, true }, - { 27542, true }, - { 27556, true }, - { 27566, true }, - { 27579, true }, - { 27587, true }, - { 27594, true }, + { 27217, true }, + { 27240, true }, + { 27259, true }, + { 27277, true }, + { 27294, true }, + { 27320, true }, + { 27339, true }, + { 27355, true }, + { 27369, true }, + { 27390, true }, + { 27406, true }, + { 27431, true }, + { 27445, true }, + { 27463, true }, + { 27472, true }, + { 27484, true }, + { 27497, true }, + { 27509, true }, + { 27522, true }, + { 27536, true }, + { 27546, true }, + { 27559, true }, + { 27567, true }, + { 27574, true }, + { 27586, true }, { 27606, true }, - { 27626, true }, - { 27638, true }, - { 27653, true }, - { 27679, true }, - { 27701, true }, - { 27715, true }, - { 27727, true }, - { 27737, true }, - { 27750, true }, - { 27758, true }, - { 27772, true }, - { 27796, true }, - { 27810, true }, + { 27618, true }, + { 27633, true }, + { 27659, true }, + { 27681, true }, + { 27695, true }, + { 27707, true }, + { 27717, true }, + { 27730, true }, + { 27738, true }, + { 27752, true }, + { 27776, true }, + { 27790, true }, + { 27814, true }, { 27834, true }, + { 27845, true }, { 27854, true }, - { 27865, true }, - { 27874, true }, - { 27896, true }, - { 27919, true }, - { 27943, true }, - { 27966, false }, - { 27997, false }, - { 28012, true }, + { 27876, true }, + { 27899, true }, + { 27923, true }, + { 27946, false }, + { 27977, false }, + { 27992, true }, + { 28004, true }, { 28024, true }, - { 28044, true }, - { 28059, true }, - { 28075, true }, - { 28086, true }, - { 28102, true }, - { 28113, true }, - { 28127, true }, - { 28137, true }, - { 28146, false }, - { 28159, true }, - { 28176, true }, - { 28190, true }, - { 28204, true }, - { 28216, true }, - { 28233, true }, - { 28252, true }, + { 28039, true }, + { 28055, true }, + { 28066, true }, + { 28082, true }, + { 28093, true }, + { 28107, true }, + { 28117, true }, + { 28126, false }, + { 28139, true }, + { 28156, true }, + { 28170, true }, + { 28184, true }, + { 28196, true }, + { 28213, true }, + { 28232, true }, + { 28249, true }, { 28269, true }, - { 28289, true }, - { 28311, true }, - { 28324, true }, - { 28335, true }, - { 28349, true }, - { 28360, true }, - { 28376, true }, - { 28385, true }, - { 28400, true }, - { 28414, true }, - { 28430, true }, - { 28443, true }, - { 28456, true }, - { 28468, true }, - { 28481, true }, - { 28494, true }, - { 28506, true }, - { 28519, true }, - { 28531, true }, - { 28550, true }, - { 28565, true }, - { 28581, true }, - { 28599, true }, - { 28610, true }, - { 28618, false }, - { 28641, true }, - { 28656, true }, - { 28669, true }, - { 28680, true }, - { 28692, false }, - { 28702, true }, - { 28718, false }, - { 28729, true }, - { 28738, true }, - { 28751, true }, - { 28769, true }, - { 28780, true }, - { 28790, true }, - { 28801, true }, - { 28813, true }, - { 28830, true }, - { 28846, true }, - { 28856, true }, - { 28864, false }, - { 28872, true }, - { 28887, true }, - { 28901, true }, - { 28915, true }, - { 28925, true }, - { 28933, true }, - { 28947, true }, - { 28961, true }, - { 28977, true }, - { 28992, true }, - { 29003, false }, - { 29016, true }, - { 29029, true }, - { 29047, true }, - { 29063, true }, - { 29074, true }, - { 29092, true }, - { 29114, false }, - { 29131, true }, - { 29146, true }, - { 29162, true }, - { 29178, true }, - { 29197, true }, - { 29214, true }, - { 29229, true }, - { 29244, true }, - { 29259, true }, - { 29280, true }, - { 29298, true }, - { 29310, true }, - { 29323, true }, - { 29336, true }, - { 29350, true }, - { 29365, true }, - { 29379, true }, - { 29392, true }, - { 29403, true }, - { 29413, true }, - { 29430, true }, - { 29446, true }, - { 29462, true }, - { 29477, true }, - { 29489, true }, - { 29500, false }, - { 29508, true }, - { 29529, true }, - { 29537, true }, - { 29550, true }, - { 29558, true }, - { 29566, true }, - { 29584, true }, - { 29598, true }, - { 29612, true }, - { 29620, true }, - { 29630, true }, - { 29638, true }, + { 28291, true }, + { 28304, true }, + { 28315, true }, + { 28329, true }, + { 28340, true }, + { 28356, true }, + { 28365, true }, + { 28380, true }, + { 28394, true }, + { 28410, true }, + { 28423, true }, + { 28436, true }, + { 28448, true }, + { 28461, true }, + { 28474, true }, + { 28486, true }, + { 28499, true }, + { 28511, true }, + { 28530, true }, + { 28545, true }, + { 28561, true }, + { 28579, true }, + { 28590, true }, + { 28598, false }, + { 28621, true }, + { 28636, true }, + { 28649, true }, + { 28660, true }, + { 28672, false }, + { 28682, true }, + { 28698, false }, + { 28709, true }, + { 28718, true }, + { 28731, true }, + { 28749, true }, + { 28760, true }, + { 28770, true }, + { 28781, true }, + { 28793, true }, + { 28810, true }, + { 28826, true }, + { 28836, true }, + { 28844, false }, + { 28852, true }, + { 28867, true }, + { 28881, true }, + { 28895, true }, + { 28905, true }, + { 28913, true }, + { 28927, true }, + { 28941, true }, + { 28957, true }, + { 28972, true }, + { 28983, false }, + { 28996, true }, + { 29009, true }, + { 29027, true }, + { 29043, true }, + { 29054, true }, + { 29072, true }, + { 29094, false }, + { 29111, true }, + { 29126, true }, + { 29142, true }, + { 29158, true }, + { 29177, true }, + { 29194, true }, + { 29209, true }, + { 29224, true }, + { 29239, true }, + { 29260, true }, + { 29278, true }, + { 29290, true }, + { 29303, true }, + { 29316, true }, + { 29330, true }, + { 29345, true }, + { 29359, true }, + { 29372, true }, + { 29383, true }, + { 29393, true }, + { 29410, true }, + { 29426, true }, + { 29442, true }, + { 29457, true }, + { 29469, true }, + { 29480, false }, + { 29488, true }, + { 29509, true }, + { 29517, true }, + { 29530, true }, + { 29538, true }, + { 29546, true }, + { 29564, true }, + { 29578, true }, + { 29592, true }, + { 29600, true }, + { 29610, true }, + { 29618, true }, + { 29632, true }, { 29652, true }, - { 29672, true }, - { 29680, true }, - { 29689, false }, - { 29709, true }, - { 29727, true }, - { 29738, true }, - { 29756, true }, - { 29774, true }, - { 29786, true }, - { 29798, true }, - { 29814, true }, - { 29828, true }, - { 29845, true }, - { 29858, true }, - { 29875, true }, - { 29888, true }, - { 29902, true }, - { 29916, true }, - { 29926, true }, + { 29660, true }, + { 29669, false }, + { 29689, true }, + { 29707, true }, + { 29718, true }, + { 29736, true }, + { 29754, true }, + { 29766, true }, + { 29778, true }, + { 29794, true }, + { 29808, true }, + { 29825, true }, + { 29838, true }, + { 29855, true }, + { 29868, true }, + { 29882, true }, + { 29896, true }, + { 29906, true }, + { 29923, true }, { 29943, true }, - { 29963, true }, + { 29952, true }, { 29972, true }, - { 29992, true }, + { 29989, true }, { 30009, true }, - { 30029, true }, + { 30023, true }, { 30043, true }, - { 30063, true }, - { 30081, true }, - { 30095, true }, - { 30113, true }, - { 30123, true }, - { 30153, true }, - { 30168, true }, - { 30181, true }, - { 30194, true }, - { 30208, true }, - { 30223, true }, - { 30243, false }, - { 30253, true }, - { 30270, true }, - { 30280, true }, - { 30291, true }, - { 30306, true }, - { 30314, true }, - { 30327, true }, - { 30348, true }, - { 30369, true }, - { 30390, false }, - { 30406, true }, - { 30419, true }, - { 30434, true }, - { 30446, false }, + { 30061, true }, + { 30075, true }, + { 30093, true }, + { 30103, true }, + { 30133, true }, + { 30148, true }, + { 30161, true }, + { 30174, true }, + { 30188, true }, + { 30203, true }, + { 30223, false }, + { 30233, true }, + { 30250, true }, + { 30260, true }, + { 30271, true }, + { 30286, true }, + { 30294, true }, + { 30307, true }, + { 30328, true }, + { 30349, true }, + { 30370, false }, + { 30386, true }, + { 30399, true }, + { 30414, true }, + { 30426, false }, + { 30447, true }, { 30467, true }, - { 30487, true }, - { 30509, true }, - { 30523, true }, + { 30489, true }, + { 30503, true }, + { 30521, true }, { 30541, true }, - { 30561, true }, - { 30574, true }, - { 30588, true }, - { 30604, true }, - { 30622, true }, - { 30633, true }, - { 30646, true }, - { 30658, true }, - { 30672, true }, - { 30687, true }, - { 30706, true }, - { 30718, false }, - { 30740, true }, - { 30748, true }, - { 30763, true }, - { 30777, true }, - { 30794, true }, - { 30812, true }, - { 30823, true }, - { 30847, true }, - { 30863, true }, - { 30879, true }, - { 30894, true }, - { 30907, true }, - { 30928, true }, - { 30943, true }, - { 30952, true }, - { 30967, true }, - { 30980, false }, - { 30990, true }, - { 31009, true }, + { 30554, true }, + { 30568, true }, + { 30584, true }, + { 30602, true }, + { 30613, true }, + { 30626, true }, + { 30638, true }, + { 30652, true }, + { 30667, true }, + { 30686, true }, + { 30698, false }, + { 30720, true }, + { 30728, true }, + { 30743, true }, + { 30757, true }, + { 30774, true }, + { 30792, true }, + { 30803, true }, + { 30827, true }, + { 30843, true }, + { 30859, true }, + { 30874, true }, + { 30887, true }, + { 30908, true }, + { 30923, true }, + { 30932, true }, + { 30947, true }, + { 30960, false }, + { 30970, true }, + { 30989, true }, + { 31003, true }, { 31023, true }, - { 31043, true }, - { 31052, true }, - { 31070, false }, - { 31092, true }, - { 31101, true }, - { 31120, false }, - { 31136, false }, - { 31150, true }, - { 31166, true }, - { 31181, true }, - { 31199, true }, + { 31032, true }, + { 31050, false }, + { 31072, true }, + { 31081, true }, + { 31100, false }, + { 31116, false }, + { 31130, true }, + { 31146, true }, + { 31161, true }, + { 31179, true }, + { 31197, true }, { 31217, true }, - { 31237, true }, - { 31259, true }, - { 31277, true }, - { 31301, true }, - { 31318, true }, - { 31333, true }, - { 31348, true }, - { 31363, true }, - { 31380, false }, - { 31396, true }, - { 31410, true }, - { 31424, true }, - { 31443, true }, - { 31460, true }, - { 31475, true }, + { 31239, true }, + { 31257, true }, + { 31281, true }, + { 31298, true }, + { 31313, true }, + { 31328, true }, + { 31343, true }, + { 31360, false }, + { 31376, true }, + { 31390, true }, + { 31404, true }, + { 31423, true }, + { 31440, true }, + { 31455, true }, + { 31482, true }, { 31502, true }, - { 31522, true }, - { 31544, false }, - { 31563, true }, + { 31524, false }, + { 31543, true }, + { 31566, true }, { 31586, true }, - { 31606, true }, - { 31624, true }, - { 31646, true }, + { 31604, true }, + { 31626, true }, + { 31645, true }, { 31665, true }, - { 31685, true }, - { 31708, true }, - { 31725, true }, - { 31739, true }, - { 31752, true }, - { 31789, false }, - { 31800, true }, + { 31688, true }, + { 31705, true }, + { 31719, true }, + { 31732, true }, + { 31769, false }, + { 31780, true }, + { 31798, true }, { 31818, true }, - { 31838, true }, - { 31861, true }, - { 31886, false }, - { 31917, true }, + { 31841, true }, + { 31866, false }, + { 31897, true }, + { 31911, true }, + { 31920, true }, { 31931, true }, - { 31940, true }, - { 31951, true }, - { 31963, true }, - { 31975, true }, - { 31984, true }, - { 31996, true }, - { 32013, true }, - { 32031, false }, - { 32039, true }, - { 32050, true }, - { 32069, true }, - { 32081, false }, - { 32099, true }, - { 32112, true }, - { 32121, false }, - { 32134, true }, - { 32147, true }, - { 32164, true }, - { 32180, true }, - { 32191, true }, - { 32205, true }, - { 32217, true }, - { 32232, true }, - { 32240, true }, - { 32254, true }, - { 32266, true }, - { 32278, true }, + { 31943, true }, + { 31955, true }, + { 31964, true }, + { 31976, true }, + { 31993, true }, + { 32003, true }, + { 32021, false }, + { 32029, true }, + { 32040, true }, + { 32059, true }, + { 32071, false }, + { 32089, true }, + { 32102, true }, + { 32111, false }, + { 32124, true }, + { 32137, true }, + { 32154, true }, + { 32170, true }, + { 32181, true }, + { 32195, true }, + { 32207, true }, + { 32222, true }, + { 32230, true }, + { 32244, true }, + { 32256, true }, + { 32268, true }, + { 32280, true }, { 32290, true }, - { 32300, true }, - { 32311, true }, - { 32322, true }, - { 32336, true }, - { 32359, true }, - { 32375, true }, - { 32383, true }, - { 32398, true }, - { 32417, true }, - { 32436, true }, + { 32301, true }, + { 32312, true }, + { 32326, true }, + { 32349, true }, + { 32365, true }, + { 32373, true }, + { 32388, true }, + { 32407, true }, + { 32426, true }, + { 32442, true }, { 32452, true }, - { 32462, true }, - { 32481, true }, - { 32494, true }, - { 32502, true }, - { 32517, true }, - { 32529, true }, - { 32537, true }, - { 32543, true }, - { 32556, true }, - { 32565, true }, - { 32579, true }, - { 32593, true }, - { 32606, false }, - { 32626, true }, - { 32642, true }, - { 32654, true }, - { 32670, true }, - { 32683, true }, - { 32703, true }, - { 32717, true }, - { 32733, true }, - { 32747, true }, - { 32767, true }, - { 32781, true }, - { 32796, true }, - { 32810, true }, - { 32823, true }, + { 32471, true }, + { 32484, true }, + { 32492, true }, + { 32507, true }, + { 32519, true }, + { 32527, true }, + { 32533, true }, + { 32546, true }, + { 32555, true }, + { 32569, true }, + { 32583, true }, + { 32596, false }, + { 32616, true }, + { 32632, true }, + { 32644, true }, + { 32660, true }, + { 32673, true }, + { 32693, true }, + { 32707, true }, + { 32723, true }, + { 32737, true }, + { 32757, true }, + { 32771, true }, + { 32786, true }, + { 32800, true }, + { 32813, true }, + { 32822, true }, { 32832, true }, - { 32842, true }, - { 32855, false }, - { 32865, true }, - { 32881, true }, - { 32903, true }, - { 32935, true }, - { 32954, true }, - { 32970, true }, - { 32991, true }, - { 33011, true }, - { 33024, true }, - { 33041, true }, - { 33061, true }, - { 33075, true }, - { 33094, true }, - { 33113, true }, - { 33128, true }, - { 33141, true }, - { 33156, true }, - { 33172, true }, - { 33184, true }, - { 33199, true }, - { 33222, true }, - { 33238, true }, - { 33250, false }, - { 33271, true }, - { 33279, true }, - { 33288, true }, - { 33302, true }, - { 33311, true }, - { 33323, true }, - { 33339, true }, - { 33356, false }, - { 33366, true }, - { 33377, true }, - { 33389, true }, - { 33402, true }, - { 33420, true }, - { 33437, true }, - { 33454, false }, - { 33464, true }, - { 33482, true }, - { 33496, true }, - { 33513, true }, - { 33535, true }, - { 33548, true }, - { 33563, true }, - { 33584, true }, - { 33606, true }, - { 33622, true }, - { 33637, true }, - { 33651, true }, - { 33677, true }, - { 33702, true }, - { 33722, true }, - { 33736, true }, - { 33751, true }, - { 33764, true }, + { 32845, false }, + { 32855, true }, + { 32871, true }, + { 32893, true }, + { 32925, true }, + { 32944, true }, + { 32960, true }, + { 32981, true }, + { 33001, true }, + { 33014, true }, + { 33031, true }, + { 33051, true }, + { 33065, true }, + { 33084, true }, + { 33103, true }, + { 33118, true }, + { 33131, true }, + { 33146, true }, + { 33162, true }, + { 33174, true }, + { 33189, true }, + { 33212, true }, + { 33228, true }, + { 33240, false }, + { 33261, true }, + { 33269, true }, + { 33278, true }, + { 33292, true }, + { 33301, true }, + { 33313, true }, + { 33329, true }, + { 33346, false }, + { 33356, true }, + { 33367, true }, + { 33379, true }, + { 33392, true }, + { 33410, true }, + { 33427, true }, + { 33444, false }, + { 33454, true }, + { 33472, true }, + { 33486, true }, + { 33503, true }, + { 33525, true }, + { 33538, true }, + { 33553, true }, + { 33574, true }, + { 33596, true }, + { 33612, true }, + { 33627, true }, + { 33641, true }, + { 33667, true }, + { 33692, true }, + { 33712, true }, + { 33726, true }, + { 33741, true }, + { 33754, true }, + { 33766, true }, { 33776, true }, - { 33786, true }, + { 33791, true }, { 33801, true }, - { 33811, true }, - { 33820, true }, - { 33834, true }, - { 33845, true }, - { 33856, true }, - { 33871, true }, - { 33883, true }, - { 33897, true }, - { 33910, true }, - { 33926, true }, + { 33810, true }, + { 33824, true }, + { 33835, true }, + { 33846, true }, + { 33861, true }, + { 33873, true }, + { 33887, true }, + { 33900, true }, + { 33916, true }, + { 33934, true }, { 33944, true }, { 33954, true }, - { 33964, true }, - { 33973, true }, - { 33985, true }, - { 33996, true }, - { 34005, true }, - { 34021, true }, + { 33963, true }, + { 33975, true }, + { 33986, true }, + { 33995, true }, + { 34011, true }, + { 34026, true }, { 34036, true }, - { 34046, true }, - { 34057, true }, - { 34068, false }, - { 34088, true }, - { 34112, true }, + { 34047, true }, + { 34058, false }, + { 34078, true }, + { 34102, true }, + { 34123, true }, { 34133, true }, - { 34143, true }, - { 34157, true }, - { 34177, false }, - { 34187, true }, - { 34205, false }, - { 34219, true }, - { 34238, true }, - { 34255, true }, - { 34269, false }, - { 34287, true }, - { 34295, true }, - { 34311, true }, - { 34322, true }, - { 34335, true }, - { 34350, false }, - { 34365, true }, - { 34377, true }, - { 34390, true }, - { 34402, true }, - { 34422, true }, - { 34435, true }, - { 34447, true }, - { 34462, true }, - { 34475, true }, - { 34488, false }, - { 34511, false }, - { 34535, true }, - { 34552, true }, - { 34565, true }, - { 34576, true }, - { 34588, true }, - { 34608, true }, - { 34622, true }, - { 34633, true }, - { 34652, true }, - { 34669, true }, - { 34691, true }, - { 34705, true }, + { 34147, true }, + { 34167, false }, + { 34177, true }, + { 34195, false }, + { 34209, true }, + { 34228, true }, + { 34245, true }, + { 34259, false }, + { 34277, true }, + { 34285, true }, + { 34301, true }, + { 34312, true }, + { 34325, true }, + { 34340, false }, + { 34355, true }, + { 34367, true }, + { 34380, true }, + { 34392, true }, + { 34412, true }, + { 34425, true }, + { 34437, true }, + { 34452, true }, + { 34465, true }, + { 34478, false }, + { 34501, false }, + { 34525, true }, + { 34542, true }, + { 34555, true }, + { 34566, true }, + { 34578, true }, + { 34598, true }, + { 34612, true }, + { 34623, true }, + { 34642, true }, + { 34659, true }, + { 34681, true }, + { 34695, true }, + { 34714, true }, { 34724, true }, - { 34734, true }, - { 34748, true }, - { 34769, true }, - { 34781, true }, - { 34796, true }, - { 34810, true }, - { 34821, true }, - { 34835, true }, - { 34848, true }, - { 34864, true }, - { 34877, true }, - { 34897, true }, - { 34905, true }, - { 34917, false }, - { 34929, true }, - { 34940, true }, - { 34962, true }, - { 34982, true }, - { 34994, true }, - { 35006, true }, - { 35024, true }, - { 35038, true }, - { 35053, true }, - { 35072, true }, - { 35087, true }, - { 35101, true }, - { 35113, true }, - { 35129, true }, - { 35150, true }, - { 35169, true }, - { 35186, true }, - { 35213, false }, - { 35232, true }, - { 35246, true }, - { 35266, true }, - { 35286, true }, - { 35299, true }, - { 35320, true }, - { 35341, true }, - { 35354, true }, - { 35361, true }, - { 35373, true }, - { 35395, true }, - { 35411, true }, - { 35426, true }, - { 35439, true }, - { 35459, true }, - { 35473, true }, + { 34738, true }, + { 34759, true }, + { 34771, true }, + { 34786, true }, + { 34800, true }, + { 34811, true }, + { 34825, true }, + { 34838, true }, + { 34854, true }, + { 34867, true }, + { 34887, true }, + { 34895, true }, + { 34907, false }, + { 34919, true }, + { 34930, true }, + { 34952, true }, + { 34972, true }, + { 34984, true }, + { 34996, true }, + { 35014, true }, + { 35028, true }, + { 35043, true }, + { 35062, true }, + { 35077, true }, + { 35091, true }, + { 35103, true }, + { 35119, true }, + { 35140, true }, + { 35159, true }, + { 35176, true }, + { 35203, false }, + { 35222, true }, + { 35236, true }, + { 35256, true }, + { 35276, true }, + { 35289, true }, + { 35310, true }, + { 35331, true }, + { 35344, true }, + { 35351, true }, + { 35363, true }, + { 35385, true }, + { 35401, true }, + { 35416, true }, + { 35429, true }, + { 35449, true }, + { 35463, true }, + { 35478, true }, { 35488, true }, - { 35498, true }, + { 35502, true }, { 35512, true }, - { 35522, true }, - { 35534, true }, - { 35546, true }, - { 35564, true }, - { 35583, true }, - { 35598, true }, - { 35619, false }, - { 35640, true }, - { 35660, true }, - { 35680, true }, + { 35524, true }, + { 35536, true }, + { 35554, true }, + { 35573, true }, + { 35588, true }, + { 35609, false }, + { 35630, true }, + { 35650, true }, + { 35670, true }, + { 35702, true }, { 35712, true }, - { 35722, true }, - { 35735, true }, - { 35754, true }, - { 35771, false }, - { 35795, false }, - { 35817, true }, - { 35841, true }, - { 35871, true }, - { 35895, true }, - { 35911, true }, - { 35928, true }, - { 35946, true }, - { 35961, true }, - { 35976, true }, - { 35993, true }, - { 36007, true }, - { 36029, true }, - { 36054, true }, - { 36067, true }, - { 36082, true }, - { 36101, true }, - { 36116, true }, - { 36140, true }, - { 36154, true }, - { 36169, true }, - { 36185, true }, - { 36204, true }, - { 36221, true }, - { 36239, true }, - { 36263, false }, - { 36285, true }, - { 36298, true }, + { 35725, true }, + { 35744, true }, + { 35761, false }, + { 35785, false }, + { 35807, true }, + { 35831, true }, + { 35861, true }, + { 35885, true }, + { 35901, true }, + { 35918, true }, + { 35936, true }, + { 35951, true }, + { 35966, true }, + { 35983, true }, + { 35997, true }, + { 36019, true }, + { 36044, true }, + { 36057, true }, + { 36072, true }, + { 36091, true }, + { 36106, true }, + { 36130, true }, + { 36151, true }, + { 36165, true }, + { 36180, true }, + { 36196, true }, + { 36215, true }, + { 36232, true }, + { 36250, true }, + { 36274, false }, + { 36296, false }, { 36309, true }, - { 36321, true }, - { 36339, true }, - { 36358, true }, - { 36373, false }, - { 36384, true }, - { 36412, true }, - { 36427, true }, - { 36450, true }, - { 36463, true }, + { 36320, true }, + { 36332, true }, + { 36350, true }, + { 36369, true }, + { 36384, false }, + { 36395, true }, + { 36423, true }, + { 36438, true }, + { 36461, true }, { 36474, true }, - { 36487, true }, - { 36505, true }, - { 36527, true }, - { 36552, true }, - { 36575, true }, - { 36589, true }, - { 36602, true }, - { 36618, true }, - { 36631, true }, - { 36649, true }, - { 36659, true }, - { 36672, true }, - { 36690, true }, - { 36711, true }, - { 36726, true }, - { 36741, true }, - { 36765, true }, - { 36779, true }, - { 36804, true }, - { 36819, true }, - { 36842, true }, - { 36851, true }, - { 36872, true }, - { 36889, true }, + { 36485, true }, + { 36498, true }, + { 36516, true }, + { 36538, true }, + { 36563, true }, + { 36586, true }, + { 36600, true }, + { 36613, true }, + { 36629, true }, + { 36642, true }, + { 36660, true }, + { 36670, true }, + { 36683, true }, + { 36701, true }, + { 36722, true }, + { 36737, true }, + { 36752, true }, + { 36776, true }, + { 36790, true }, + { 36815, true }, + { 36830, true }, + { 36853, true }, + { 36862, true }, + { 36883, true }, { 36900, true }, - { 36913, true }, - { 36926, false }, - { 36965, true }, - { 36978, true }, - { 36994, true }, - { 37008, false }, - { 37023, true }, - { 37043, false }, - { 37059, true }, - { 37078, true }, + { 36911, true }, + { 36924, true }, + { 36937, false }, + { 36976, true }, + { 36989, true }, + { 37005, true }, + { 37019, false }, + { 37034, true }, + { 37054, false }, + { 37070, true }, { 37089, true }, - { 37102, true }, - { 37114, true }, - { 37137, true }, - { 37149, true }, - { 37158, true }, - { 37168, true }, - { 37182, true }, - { 37197, true }, - { 37211, true }, + { 37100, true }, + { 37113, true }, + { 37125, true }, + { 37148, true }, + { 37160, true }, + { 37169, true }, + { 37179, true }, + { 37193, true }, + { 37208, true }, { 37222, true }, - { 37238, true }, - { 37254, true }, - { 37271, true }, - { 37283, true }, - { 37306, true }, - { 37331, true }, - { 37351, true }, - { 37363, true }, - { 37378, true }, - { 37397, true }, - { 37410, true }, - { 37432, true }, - { 37444, true }, - { 37474, true }, - { 37488, true }, - { 37512, true }, - { 37535, true }, - { 37549, true }, - { 37562, true }, - { 37574, true }, - { 37594, true }, - { 37606, true }, - { 37629, true }, - { 37648, true }, - { 37659, true }, - { 37673, true }, - { 37685, true }, - { 37703, true }, - { 37719, true }, - { 37737, true }, - { 37753, true }, - { 37766, true }, - { 37777, true }, - { 37795, true }, - { 37813, true }, - { 37836, true }, - { 37853, false }, - { 37868, true }, - { 37880, true }, - { 37892, true }, - { 37905, true }, - { 37914, true }, - { 37929, true }, - { 37948, true }, - { 37962, true }, - { 37977, true }, - { 37989, true }, - { 38001, true }, - { 38015, false }, - { 38032, true }, - { 38043, true }, - { 38056, true }, - { 38073, true }, - { 38092, true }, - { 38105, true }, - { 38123, true }, - { 38149, true }, - { 38166, true }, - { 38185, true }, - { 38200, true }, - { 38214, true }, - { 38231, true }, + { 37233, true }, + { 37249, true }, + { 37265, true }, + { 37282, true }, + { 37294, true }, + { 37317, true }, + { 37342, true }, + { 37362, true }, + { 37374, true }, + { 37389, true }, + { 37408, true }, + { 37421, true }, + { 37443, true }, + { 37455, true }, + { 37485, true }, + { 37499, true }, + { 37523, true }, + { 37546, true }, + { 37560, true }, + { 37573, true }, + { 37593, true }, + { 37605, true }, + { 37628, true }, + { 37647, true }, + { 37658, true }, + { 37672, true }, + { 37684, true }, + { 37702, true }, + { 37718, true }, + { 37736, true }, + { 37752, true }, + { 37769, true }, + { 37782, true }, + { 37793, true }, + { 37811, true }, + { 37829, true }, + { 37852, true }, + { 37869, false }, + { 37884, true }, + { 37896, true }, + { 37908, true }, + { 37921, true }, + { 37930, true }, + { 37945, true }, + { 37964, true }, + { 37978, true }, + { 37993, true }, + { 38005, true }, + { 38017, true }, + { 38031, false }, + { 38048, true }, + { 38059, true }, + { 38072, true }, + { 38089, true }, + { 38108, true }, + { 38121, true }, + { 38139, true }, + { 38165, true }, + { 38182, true }, + { 38201, true }, + { 38216, true }, + { 38230, true }, { 38247, true }, - { 38266, true }, - { 38285, true }, - { 38305, true }, + { 38263, true }, + { 38282, true }, + { 38301, true }, { 38321, true }, { 38337, true }, - { 38351, false }, - { 38361, true }, - { 38369, true }, - { 38395, true }, - { 38412, true }, - { 38433, true }, - { 38451, true }, - { 38465, true }, - { 38484, true }, - { 38496, true }, - { 38512, false }, - { 38531, true }, - { 38540, true }, - { 38554, true }, - { 38569, true }, - { 38580, true }, - { 38599, true }, - { 38612, true }, - { 38634, true }, - { 38648, false }, - { 38662, true }, - { 38678, true }, - { 38693, true }, - { 38705, true }, - { 38728, true }, - { 38740, true }, - { 38763, true }, - { 38782, true }, - { 38790, true }, - { 38806, true }, - { 38821, true }, - { 38831, true }, - { 38838, true }, - { 38849, true }, - { 38866, true }, - { 38880, true }, - { 38889, true }, - { 38897, true }, - { 38916, false }, - { 38927, true }, - { 38943, false }, - { 38953, true }, - { 38966, true }, - { 38980, true }, - { 38995, true }, - { 39011, true }, - { 39033, true }, - { 39047, true }, - { 39060, true }, - { 39074, true }, - { 39088, true }, - { 39103, true }, - { 39118, true }, - { 39137, true }, - { 39162, true }, - { 39182, true }, - { 39198, true }, - { 39211, true }, - { 39224, true }, - { 39236, true }, - { 39251, true }, - { 39261, true }, - { 39277, true }, - { 39285, false }, - { 39297, true }, - { 39308, true }, - { 39317, true }, - { 39332, true }, - { 39349, true }, - { 39365, true }, - { 39378, true }, - { 39391, true }, - { 39408, true }, - { 39417, true }, - { 39425, true }, - { 39436, true }, - { 39445, true }, - { 39456, true }, - { 39470, true }, - { 39483, true }, - { 39491, true }, - { 39509, true }, - { 39518, true }, - { 39527, true }, - { 39535, true }, - { 39543, true }, - { 39562, true }, - { 39581, true }, - { 39590, true }, - { 39610, true }, - { 39633, true }, - { 39643, true }, - { 39653, true }, - { 39671, true }, - { 39691, true }, - { 39704, true }, - { 39718, true }, - { 39734, true }, - { 39744, true }, - { 39755, true }, - { 39765, true }, - { 39782, true }, - { 39798, true }, - { 39813, true }, - { 39824, true }, - { 39831, true }, + { 38353, true }, + { 38367, false }, + { 38377, true }, + { 38385, true }, + { 38411, true }, + { 38428, true }, + { 38449, true }, + { 38467, true }, + { 38481, true }, + { 38500, true }, + { 38512, true }, + { 38528, false }, + { 38547, true }, + { 38556, true }, + { 38570, true }, + { 38585, true }, + { 38602, true }, + { 38613, true }, + { 38632, true }, + { 38645, true }, + { 38667, true }, + { 38681, false }, + { 38695, true }, + { 38711, true }, + { 38726, true }, + { 38738, true }, + { 38761, true }, + { 38773, true }, + { 38796, true }, + { 38815, true }, + { 38823, true }, + { 38839, true }, + { 38854, true }, + { 38864, true }, + { 38871, true }, + { 38882, true }, + { 38899, true }, + { 38913, true }, + { 38922, true }, + { 38930, true }, + { 38944, true }, + { 38963, false }, + { 38974, true }, + { 38990, false }, + { 39000, true }, + { 39013, true }, + { 39027, true }, + { 39042, true }, + { 39058, true }, + { 39080, true }, + { 39094, true }, + { 39107, true }, + { 39121, true }, + { 39135, true }, + { 39150, true }, + { 39165, true }, + { 39184, true }, + { 39209, true }, + { 39229, true }, + { 39245, true }, + { 39258, true }, + { 39271, true }, + { 39301, true }, + { 39313, true }, + { 39328, true }, + { 39338, true }, + { 39354, true }, + { 39362, false }, + { 39374, true }, + { 39385, true }, + { 39394, true }, + { 39409, true }, + { 39426, true }, + { 39442, true }, + { 39455, true }, + { 39468, true }, + { 39485, true }, + { 39494, true }, + { 39502, true }, + { 39513, true }, + { 39522, true }, + { 39533, true }, + { 39547, true }, + { 39560, true }, + { 39568, true }, + { 39586, true }, + { 39595, true }, + { 39604, true }, + { 39612, true }, + { 39620, true }, + { 39639, true }, + { 39658, true }, + { 39667, true }, + { 39687, true }, + { 39710, true }, + { 39720, true }, + { 39730, true }, + { 39748, true }, + { 39768, true }, + { 39781, true }, + { 39795, true }, + { 39811, true }, + { 39821, true }, + { 39832, true }, { 39842, true }, - { 39853, true }, - { 39861, true }, - { 39881, true }, - { 39902, true }, - { 39921, true }, - { 39936, true }, - { 39958, true }, - { 39970, false }, - { 39992, true }, - { 40011, true }, + { 39859, true }, + { 39875, true }, + { 39890, true }, + { 39901, true }, + { 39908, true }, + { 39919, true }, + { 39930, true }, + { 39950, true }, + { 39971, true }, + { 39990, true }, + { 40005, true }, { 40027, true }, - { 40045, true }, - { 40060, true }, - { 40077, true }, - { 40092, true }, - { 40111, true }, - { 40123, true }, - { 40143, true }, - { 40160, true }, - { 40174, true }, - { 40183, true }, - { 40195, true }, - { 40205, true }, - { 40214, true }, - { 40223, true }, - { 40232, true }, - { 40241, true }, - { 40251, true }, - { 40261, true }, - { 40270, true }, - { 40279, true }, - { 40297, true }, - { 40313, true }, - { 40321, true }, - { 40328, true }, - { 40341, true }, - { 40358, true }, - { 40372, true }, - { 40379, true }, - { 40389, true }, - { 40400, true }, - { 40417, true }, - { 40437, true }, - { 40456, false }, - { 40470, true }, - { 40488, true }, - { 40501, true }, - { 40518, true }, - { 40532, true }, - { 40546, true }, - { 40559, true }, - { 40576, true }, - { 40602, true }, - { 40616, true }, - { 40633, true }, - { 40648, true }, - { 40662, true }, - { 40673, true }, - { 40686, true }, - { 40696, true }, - { 40707, true }, - { 40726, true }, - { 40741, true }, - { 40756, true }, - { 40783, true }, - { 40793, true }, - { 40805, true }, - { 40817, true }, + { 40039, false }, + { 40061, true }, + { 40080, true }, + { 40096, true }, + { 40114, true }, + { 40129, true }, + { 40146, true }, + { 40161, true }, + { 40180, true }, + { 40192, true }, + { 40212, true }, + { 40229, true }, + { 40243, true }, + { 40252, true }, + { 40264, true }, + { 40274, true }, + { 40283, true }, + { 40292, true }, + { 40301, true }, + { 40310, true }, + { 40320, true }, + { 40330, true }, + { 40339, true }, + { 40348, true }, + { 40366, true }, + { 40382, true }, + { 40390, true }, + { 40397, true }, + { 40410, true }, + { 40427, true }, + { 40441, true }, + { 40448, true }, + { 40458, true }, + { 40469, true }, + { 40486, true }, + { 40506, true }, + { 40525, false }, + { 40539, true }, + { 40557, true }, + { 40570, true }, + { 40587, true }, + { 40601, true }, + { 40615, true }, + { 40628, true }, + { 40645, true }, + { 40671, true }, + { 40685, true }, + { 40702, true }, + { 40717, true }, + { 40731, true }, + { 40742, true }, + { 40755, true }, + { 40765, true }, + { 40776, true }, + { 40795, true }, + { 40810, true }, { 40825, true }, - { 40836, true }, - { 40845, true }, - { 40853, true }, - { 40864, true }, - { 40891, true }, - { 40901, true }, - { 40912, true }, - { 40923, true }, + { 40852, true }, + { 40862, true }, + { 40874, true }, + { 40886, true }, + { 40894, true }, + { 40905, true }, + { 40914, true }, + { 40922, true }, { 40933, true }, - { 40947, true }, - { 40961, true }, - { 40972, true }, - { 40979, true }, - { 40987, true }, - { 40995, true }, - { 41011, true }, - { 41025, true }, - { 41039, true }, - { 41048, true }, - { 41060, true }, - { 41067, true }, - { 41074, true }, - { 41090, true }, - { 41102, true }, - { 41116, true }, - { 41138, true }, + { 40960, true }, + { 40971, true }, + { 40982, true }, + { 40992, true }, + { 41006, true }, + { 41020, true }, + { 41031, true }, + { 41038, true }, + { 41046, true }, + { 41054, true }, + { 41070, true }, + { 41084, true }, + { 41098, true }, + { 41107, true }, + { 41119, true }, + { 41126, true }, + { 41133, true }, { 41149, true }, - { 41167, true }, - { 41178, true }, - { 41189, true }, - { 41200, true }, - { 41216, true }, - { 41233, true }, - { 41246, true }, - { 41272, false }, - { 41295, true }, - { 41311, true }, - { 41321, true }, - { 41334, true }, - { 41345, true }, - { 41360, true }, - { 41378, true }, - { 41390, false }, - { 41402, true }, + { 41161, true }, + { 41175, true }, + { 41197, true }, + { 41208, true }, + { 41226, true }, + { 41237, true }, + { 41248, true }, + { 41259, true }, + { 41275, true }, + { 41292, true }, + { 41305, true }, + { 41331, false }, + { 41354, true }, + { 41366, true }, + { 41382, true }, + { 41392, true }, + { 41405, true }, { 41416, true }, - { 41430, true }, - { 41447, true }, - { 41465, true }, - { 41478, true }, - { 41497, true }, - { 41507, true }, + { 41431, true }, + { 41449, true }, + { 41461, false }, + { 41473, true }, + { 41487, true }, + { 41501, true }, { 41518, true }, - { 41531, true }, - { 41548, true }, - { 41566, true }, - { 41582, true }, - { 41595, true }, - { 41613, true }, - { 41627, true }, - { 41645, true }, - { 41660, true }, - { 41675, true }, - { 41696, true }, - { 41712, true }, - { 41733, true }, - { 41749, true }, - { 41768, true }, - { 41789, true }, - { 41809, true }, - { 41829, true }, - { 41849, true }, - { 41865, true }, - { 41882, true }, - { 41901, true }, - { 41919, true }, - { 41939, true }, - { 41955, true }, - { 41966, false }, - { 41976, true }, - { 41985, true }, - { 42003, true }, - { 42021, true }, - { 42034, true }, - { 42049, true }, - { 42064, true }, - { 42072, true }, + { 41536, true }, + { 41549, true }, + { 41568, true }, + { 41578, true }, + { 41589, true }, + { 41602, true }, + { 41619, true }, + { 41637, true }, + { 41653, true }, + { 41666, true }, + { 41684, true }, + { 41698, true }, + { 41716, true }, + { 41731, true }, + { 41746, true }, + { 41767, true }, + { 41783, true }, + { 41804, true }, + { 41820, true }, + { 41839, true }, + { 41860, true }, + { 41880, true }, + { 41900, true }, + { 41920, true }, + { 41936, true }, + { 41953, true }, + { 41972, true }, + { 41990, true }, + { 42010, true }, + { 42026, true }, + { 42037, false }, + { 42047, true }, + { 42056, true }, + { 42074, true }, + { 42088, true }, { 42106, true }, - { 42117, false }, - { 42131, true }, + { 42119, true }, + { 42134, true }, { 42149, true }, - { 42167, true }, - { 42182, true }, - { 42196, true }, - { 42211, true }, - { 42228, true }, - { 42243, true }, - { 42255, true }, - { 42284, true }, - { 42317, true }, - { 42329, true }, - { 42341, true }, - { 42355, true }, - { 42372, true }, - { 42384, true }, - { 42396, true }, - { 42411, false }, - { 42423, true }, - { 42432, true }, - { 42448, true }, - { 42460, true }, - { 42477, true }, - { 42492, false }, - { 42506, true }, - { 42526, false }, - { 42540, true }, - { 42551, true }, - { 42564, true }, - { 42574, false }, - { 42590, true }, - { 42604, true }, - { 42618, true }, - { 42629, true }, - { 42642, true }, - { 42658, true }, - { 42669, true }, - { 42686, true }, - { 42712, true }, - { 42732, true }, - { 42746, true }, - { 42763, true }, - { 42777, true }, - { 42791, false }, - { 42809, true }, - { 42825, true }, - { 42852, true }, - { 42863, true }, + { 42157, true }, + { 42191, true }, + { 42202, false }, + { 42216, true }, + { 42234, true }, + { 42252, true }, + { 42267, true }, + { 42281, true }, + { 42296, true }, + { 42313, true }, + { 42328, true }, + { 42340, true }, + { 42369, true }, + { 42402, true }, + { 42414, true }, + { 42426, true }, + { 42440, true }, + { 42457, true }, + { 42469, true }, + { 42481, true }, + { 42496, false }, + { 42508, true }, + { 42517, true }, + { 42529, true }, + { 42546, true }, + { 42561, false }, + { 42575, false }, + { 42595, false }, + { 42609, true }, + { 42620, true }, + { 42633, true }, + { 42643, false }, + { 42659, true }, + { 42673, true }, + { 42687, true }, + { 42698, true }, + { 42711, true }, + { 42727, true }, + { 42738, true }, + { 42755, true }, + { 42781, true }, + { 42801, true }, + { 42815, true }, + { 42832, true }, + { 42846, true }, + { 42860, false }, { 42878, true }, - { 42890, true }, - { 42905, true }, - { 42927, true }, - { 42945, true }, - { 42961, true }, - { 42975, true }, - { 42991, true }, - { 43009, true }, - { 43022, true }, - { 43039, true }, - { 43052, true }, - { 43067, true }, - { 43082, true }, - { 43098, true }, - { 43117, true }, - { 43138, true }, - { 43155, true }, - { 43170, true }, + { 42894, true }, + { 42921, true }, + { 42932, true }, + { 42947, true }, + { 42959, true }, + { 42974, true }, + { 42996, true }, + { 43014, true }, + { 43030, true }, + { 43044, true }, + { 43060, true }, + { 43078, true }, + { 43091, true }, + { 43108, true }, + { 43121, true }, + { 43136, true }, + { 43151, true }, + { 43167, true }, { 43186, true }, - { 43198, true }, - { 43211, true }, - { 43237, true }, - { 43257, true }, - { 43268, true }, - { 43286, true }, - { 43305, true }, - { 43319, true }, - { 43328, true }, - { 43345, true }, - { 43356, true }, - { 43368, true }, - { 43378, true }, - { 43389, true }, - { 43410, true }, - { 43422, true }, - { 43433, true }, - { 43441, true }, - { 43449, true }, - { 43460, true }, - { 43476, true }, - { 43486, true }, - { 43499, true }, - { 43508, true }, - { 43521, true }, - { 43536, true }, - { 43553, true }, - { 43575, true }, - { 43596, true }, - { 43604, true }, - { 43617, true }, - { 43628, false }, - { 43648, true }, - { 43663, true }, - { 43676, true }, - { 43688, true }, - { 43709, true }, - { 43723, true }, - { 43737, true }, - { 43754, true }, - { 43769, true }, - { 43783, true }, - { 43797, true }, - { 43811, true }, - { 43825, true }, - { 43839, true }, - { 43854, true }, + { 43207, true }, + { 43224, true }, + { 43239, true }, + { 43255, true }, + { 43267, true }, + { 43280, true }, + { 43306, true }, + { 43326, true }, + { 43337, true }, + { 43355, true }, + { 43374, true }, + { 43388, true }, + { 43397, true }, + { 43414, true }, + { 43425, true }, + { 43437, true }, + { 43447, true }, + { 43458, true }, + { 43479, true }, + { 43491, true }, + { 43502, true }, + { 43510, true }, + { 43518, true }, + { 43529, true }, + { 43545, true }, + { 43555, true }, + { 43568, true }, + { 43577, true }, + { 43590, true }, + { 43605, true }, + { 43622, true }, + { 43644, true }, + { 43665, true }, + { 43673, true }, + { 43686, true }, + { 43697, false }, + { 43717, true }, + { 43732, true }, + { 43745, true }, + { 43757, true }, + { 43778, true }, + { 43792, true }, + { 43806, true }, + { 43823, true }, + { 43838, true }, + { 43852, true }, { 43866, true }, { 43880, true }, - { 43898, true }, - { 43913, true }, + { 43894, true }, + { 43908, true }, { 43923, true }, - { 43939, true }, - { 43950, true }, - { 43971, true }, - { 43986, true }, - { 43999, true }, - { 44014, true }, - { 44026, true }, - { 44041, true }, - { 44058, true }, - { 44075, true }, - { 44087, true }, - { 44096, true }, - { 44116, true }, + { 43935, true }, + { 43949, true }, + { 43967, true }, + { 43982, true }, + { 43992, true }, + { 44008, true }, + { 44019, true }, + { 44040, true }, + { 44055, true }, + { 44068, true }, + { 44083, true }, + { 44095, true }, + { 44110, true }, { 44127, true }, - { 44142, true }, - { 44158, true }, + { 44144, true }, + { 44156, true }, { 44165, true }, - { 44188, true }, - { 44202, true }, - { 44217, true }, - { 44232, true }, - { 44247, true }, - { 44258, true }, - { 44268, true }, - { 44277, true }, - { 44288, true }, - { 44300, true }, - { 44311, true }, - { 44322, true }, - { 44335, true }, - { 44351, true }, - { 44366, true }, - { 44382, true }, - { 44399, true }, - { 44416, true }, - { 44427, true }, - { 44441, true }, - { 44456, true }, - { 44472, true }, - { 44487, true }, - { 44497, true }, + { 44185, true }, + { 44196, true }, + { 44211, true }, + { 44227, true }, + { 44234, true }, + { 44257, true }, + { 44271, true }, + { 44286, true }, + { 44301, true }, + { 44316, true }, + { 44327, true }, + { 44337, true }, + { 44346, true }, + { 44357, true }, + { 44369, true }, + { 44380, true }, + { 44391, true }, + { 44404, true }, + { 44420, true }, + { 44435, true }, + { 44451, true }, + { 44468, true }, + { 44485, true }, + { 44496, true }, { 44510, true }, - { 44522, true }, - { 44550, true }, - { 44562, true }, - { 44576, true }, - { 44592, true }, - { 44605, true }, - { 44616, true }, - { 44638, true }, - { 44658, true }, - { 44679, true }, - { 44694, true }, - { 44708, true }, - { 44718, true }, - { 44729, true }, + { 44525, true }, + { 44541, true }, + { 44556, true }, + { 44566, true }, + { 44579, true }, + { 44591, true }, + { 44619, true }, + { 44631, true }, + { 44645, true }, + { 44661, true }, + { 44674, true }, + { 44685, true }, + { 44707, true }, + { 44727, true }, { 44748, true }, - { 44765, true }, - { 44778, true }, - { 44792, false }, - { 44805, true }, + { 44763, true }, + { 44777, true }, + { 44787, true }, + { 44798, true }, { 44817, true }, - { 44830, true }, - { 44842, true }, - { 44855, true }, - { 44868, true }, - { 44879, true }, - { 44897, true }, - { 44915, true }, - { 44927, true }, - { 44942, true }, - { 44956, true }, - { 44970, true }, - { 44978, true }, - { 45007, true }, - { 45026, true }, + { 44834, true }, + { 44847, true }, + { 44861, false }, + { 44874, true }, + { 44886, true }, + { 44899, true }, + { 44911, true }, + { 44924, true }, + { 44937, true }, + { 44948, true }, + { 44966, true }, + { 44984, true }, + { 44996, true }, + { 45011, true }, + { 45025, true }, { 45039, true }, - { 45064, true }, - { 45081, true }, - { 45101, true }, - { 45122, true }, - { 45134, true }, - { 45158, true }, + { 45047, true }, + { 45076, true }, + { 45095, true }, + { 45108, true }, + { 45133, true }, + { 45150, true }, + { 45170, true }, { 45191, true }, - { 45203, true }, - { 45225, true }, - { 45242, true }, - { 45257, true }, - { 45271, true }, - { 45297, true }, - { 45307, true }, + { 45203, false }, + { 45227, true }, + { 45260, true }, + { 45272, true }, + { 45294, true }, + { 45311, true }, { 45326, true }, - { 45339, true }, - { 45349, true }, - { 45359, true }, - { 45377, true }, + { 45340, true }, + { 45366, true }, + { 45376, true }, { 45395, true }, - { 45422, true }, - { 45438, true }, - { 45463, true }, - { 45478, true }, - { 45498, false }, - { 45519, true }, - { 45534, true }, - { 45549, true }, - { 45570, true }, - { 45581, true }, - { 45605, true }, + { 45408, true }, + { 45418, true }, + { 45428, true }, + { 45446, true }, + { 45464, true }, + { 45491, true }, + { 45507, false }, + { 45532, true }, + { 45547, true }, + { 45567, false }, + { 45588, true }, + { 45603, true }, { 45618, true }, - { 45628, false }, - { 45642, true }, - { 45653, true }, - { 45667, true }, - { 45686, true }, - { 45701, true }, - { 45716, true }, - { 45725, true }, - { 45735, true }, - { 45746, true }, - { 45763, true }, - { 45771, true }, - { 45780, true }, - { 45790, true }, - { 45800, true }, - { 45814, false }, - { 45839, true }, - { 45857, false }, - { 45881, true }, - { 45895, true }, - { 45914, true }, - { 45941, true }, - { 45953, true }, - { 45962, true }, - { 45976, true }, - { 45993, true }, - { 46009, true }, - { 46024, true }, - { 46036, true }, - { 46053, true }, - { 46065, true }, - { 46077, true }, - { 46087, true }, - { 46099, true }, - { 46112, true }, - { 46126, true }, - { 46143, true }, - { 46154, true }, - { 46172, false }, - { 46192, true }, - { 46204, true }, - { 46216, true }, - { 46226, true }, - { 46239, true }, - { 46261, true }, - { 46275, true }, - { 46284, true }, - { 46296, true }, - { 46303, true }, - { 46315, true }, - { 46324, true }, - { 46334, true }, - { 46348, true }, - { 46365, true }, - { 46376, true }, - { 46390, true }, - { 46399, true }, - { 46408, true }, - { 46423, true }, - { 46435, true }, - { 46451, true }, - { 46467, true }, - { 46484, true }, - { 46506, true }, - { 46515, true }, - { 46527, true }, - { 46541, true }, - { 46574, true }, - { 46599, true }, - { 46608, true }, - { 46624, true }, - { 46636, true }, - { 46647, true }, - { 46672, true }, - { 46687, true }, - { 46709, true }, - { 46734, true }, - { 46765, true }, - { 46776, true }, - { 46792, true }, - { 46806, true }, - { 46824, true }, - { 46838, true }, - { 46853, false }, - { 46870, true }, + { 45639, true }, + { 45650, true }, + { 45674, true }, + { 45687, true }, + { 45697, false }, + { 45711, true }, + { 45722, true }, + { 45736, true }, + { 45755, true }, + { 45770, true }, + { 45785, true }, + { 45794, true }, + { 45804, true }, + { 45815, true }, + { 45832, true }, + { 45840, true }, + { 45849, true }, + { 45859, true }, + { 45872, true }, + { 45882, true }, + { 45896, false }, + { 45921, true }, + { 45939, false }, + { 45963, true }, + { 45977, true }, + { 45996, true }, + { 46023, true }, + { 46035, true }, + { 46044, true }, + { 46058, true }, + { 46075, true }, + { 46091, true }, + { 46106, true }, + { 46118, true }, + { 46135, true }, + { 46147, true }, + { 46159, true }, + { 46169, true }, + { 46181, true }, + { 46194, true }, + { 46208, true }, + { 46225, true }, + { 46236, true }, + { 46254, false }, + { 46274, true }, + { 46286, true }, + { 46298, true }, + { 46308, true }, + { 46321, true }, + { 46343, true }, + { 46357, true }, + { 46366, true }, + { 46378, true }, + { 46385, true }, + { 46397, true }, + { 46406, true }, + { 46416, true }, + { 46430, true }, + { 46447, true }, + { 46458, true }, + { 46472, true }, + { 46481, true }, + { 46490, true }, + { 46505, true }, + { 46517, true }, + { 46533, true }, + { 46549, true }, + { 46566, true }, + { 46588, true }, + { 46597, true }, + { 46609, true }, + { 46623, true }, + { 46656, true }, + { 46681, true }, + { 46690, true }, + { 46706, true }, + { 46718, true }, + { 46729, true }, + { 46754, true }, + { 46769, true }, + { 46791, true }, + { 46816, true }, + { 46847, true }, + { 46858, true }, + { 46874, true }, { 46888, true }, - { 46901, true }, - { 46911, true }, - { 46923, true }, - { 46938, true }, - { 46949, true }, - { 46963, true }, - { 46976, true }, - { 46988, true }, - { 47000, true }, - { 47013, true }, - { 47024, true }, - { 47040, true }, - { 47053, true }, - { 47065, false }, + { 46906, true }, + { 46920, true }, + { 46935, false }, + { 46952, true }, + { 46970, true }, + { 46983, true }, + { 46993, true }, + { 47005, true }, + { 47020, true }, + { 47031, true }, + { 47045, true }, + { 47058, true }, + { 47070, true }, { 47082, true }, - { 47102, true }, - { 47119, true }, - { 47134, true }, - { 47150, true }, - { 47165, true }, - { 47180, true }, - { 47203, true }, - { 47229, true }, - { 47249, true }, - { 47264, false }, - { 47282, true }, - { 47301, true }, - { 47318, true }, + { 47095, true }, + { 47106, true }, + { 47122, false }, + { 47135, true }, + { 47147, false }, + { 47164, true }, + { 47184, true }, + { 47201, true }, + { 47216, true }, + { 47232, true }, + { 47247, true }, + { 47262, true }, + { 47285, true }, + { 47311, true }, { 47331, true }, - { 47348, true }, - { 47358, false }, - { 47375, true }, - { 47394, true }, - { 47411, true }, - { 47424, true }, - { 47438, true }, - { 47455, true }, - { 47463, true }, - { 47475, true }, - { 47485, true }, - { 47496, true }, - { 47510, true }, + { 47346, false }, + { 47364, true }, + { 47383, true }, + { 47400, true }, + { 47413, true }, + { 47430, true }, + { 47440, false }, + { 47457, true }, + { 47476, true }, + { 47493, true }, + { 47506, true }, { 47520, true }, - { 47533, true }, - { 47547, true }, - { 47558, true }, - { 47571, true }, - { 47590, false }, - { 47598, true }, - { 47609, true }, - { 47622, true }, - { 47635, true }, - { 47654, true }, - { 47670, true }, - { 47682, true }, - { 47696, true }, - { 47708, true }, - { 47724, true }, - { 47736, true }, - { 47751, true }, - { 47769, true }, - { 47784, true }, - { 47799, true }, - { 47815, true }, - { 47829, true }, - { 47850, true }, - { 47863, true }, - { 47879, true }, - { 47898, true }, - { 47917, true }, - { 47934, false }, - { 47954, true }, - { 47984, true }, - { 48010, true }, - { 48027, true }, - { 48039, true }, - { 48059, true }, - { 48073, true }, - { 48092, true }, - { 48110, true }, - { 48125, true }, - { 48136, true }, - { 48147, true }, - { 48165, true }, - { 48184, true }, - { 48194, true }, - { 48212, true }, - { 48221, false }, - { 48232, false }, - { 48246, false }, - { 48266, true }, - { 48274, true }, - { 48288, true }, - { 48301, true }, - { 48317, true }, - { 48328, true }, - { 48338, true }, - { 48347, true }, - { 48367, false }, - { 48382, false }, - { 48399, true }, - { 48408, true }, - { 48417, true }, - { 48433, true }, - { 48450, true }, - { 48459, true }, - { 48466, true }, - { 48474, true }, + { 47537, true }, + { 47545, true }, + { 47557, true }, + { 47567, true }, + { 47578, true }, + { 47588, true }, + { 47601, true }, + { 47615, true }, + { 47626, true }, + { 47639, true }, + { 47658, false }, + { 47666, true }, + { 47677, true }, + { 47690, true }, + { 47703, true }, + { 47722, true }, + { 47738, true }, + { 47750, true }, + { 47764, true }, + { 47776, true }, + { 47792, true }, + { 47804, true }, + { 47819, true }, + { 47837, true }, + { 47852, true }, + { 47867, true }, + { 47883, true }, + { 47897, true }, + { 47918, true }, + { 47931, true }, + { 47947, true }, + { 47966, true }, + { 47985, true }, + { 48002, false }, + { 48022, true }, + { 48052, true }, + { 48078, true }, + { 48095, true }, + { 48107, true }, + { 48127, true }, + { 48141, true }, + { 48160, true }, + { 48178, true }, + { 48193, true }, + { 48204, true }, + { 48215, true }, + { 48225, true }, + { 48243, true }, + { 48262, true }, + { 48272, true }, + { 48290, true }, + { 48299, false }, + { 48310, false }, + { 48324, false }, + { 48344, true }, + { 48352, true }, + { 48366, true }, + { 48379, true }, + { 48395, true }, + { 48406, true }, + { 48416, true }, + { 48425, true }, + { 48445, false }, + { 48460, false }, + { 48477, true }, { 48486, true }, { 48495, true }, - { 48505, true }, - { 48515, true }, - { 48523, true }, - { 48531, true }, - { 48538, true }, - { 48549, true }, - { 48562, true }, - { 48569, true }, - { 48579, true }, - { 48594, true }, + { 48511, true }, + { 48528, true }, + { 48537, true }, + { 48544, true }, + { 48552, true }, + { 48564, true }, + { 48573, true }, + { 48583, true }, + { 48593, true }, + { 48601, true }, { 48609, true }, - { 48622, true }, - { 48634, true }, - { 48649, true }, - { 48660, true }, - { 48670, true }, - { 48678, true }, + { 48616, true }, + { 48627, true }, + { 48640, true }, + { 48647, true }, + { 48657, true }, + { 48672, true }, { 48687, true }, - { 48695, true }, - { 48709, true }, - { 48721, true }, - { 48736, true }, - { 48746, true }, - { 48763, true }, - { 48772, true }, - { 48782, true }, - { 48798, true }, + { 48700, true }, + { 48712, true }, + { 48727, true }, + { 48738, true }, + { 48748, true }, + { 48756, true }, + { 48765, true }, + { 48773, true }, + { 48787, true }, + { 48799, true }, { 48814, true }, - { 48833, true }, - { 48847, true }, - { 48863, true }, + { 48824, true }, + { 48841, true }, + { 48850, true }, + { 48860, true }, { 48876, true }, - { 48891, true }, - { 48904, true }, - { 48915, true }, - { 48927, true }, - { 48952, false }, - { 48961, true }, - { 48974, true }, - { 48983, true }, - { 48999, true }, - { 49020, true }, - { 49034, true }, - { 49046, true }, - { 49068, false }, - { 49079, true }, - { 49091, true }, - { 49102, true }, - { 49116, true }, - { 49136, true }, - { 49150, true }, - { 49173, true }, - { 49188, true }, - { 49205, true }, - { 49219, true }, - { 49238, true }, - { 49254, true }, + { 48892, true }, + { 48911, true }, + { 48925, true }, + { 48941, true }, + { 48954, true }, + { 48969, true }, + { 48982, true }, + { 48993, true }, + { 49005, true }, + { 49030, false }, + { 49039, true }, + { 49052, true }, + { 49061, true }, + { 49077, true }, + { 49098, true }, + { 49112, true }, + { 49126, true }, + { 49138, true }, + { 49160, false }, + { 49171, true }, + { 49183, true }, + { 49194, true }, + { 49208, true }, + { 49228, true }, + { 49242, true }, { 49265, true }, - { 49276, true }, - { 49288, true }, - { 49309, false }, + { 49279, true }, + { 49294, true }, + { 49311, true }, { 49325, true }, - { 49342, true }, + { 49344, true }, { 49360, true }, - { 49375, true }, - { 49403, false }, - { 49413, false }, - { 49423, true }, - { 49442, false }, - { 49454, true }, - { 49468, true }, + { 49371, true }, + { 49382, true }, + { 49394, true }, + { 49415, false }, + { 49431, true }, + { 49448, true }, + { 49466, true }, { 49481, true }, - { 49500, true }, - { 49516, true }, - { 49531, true }, - { 49554, true }, - { 49567, true }, - { 49584, true }, - { 49593, true }, - { 49614, true }, - { 49629, true }, - { 49645, true }, - { 49658, true }, - { 49671, true }, - { 49683, true }, - { 49697, true }, - { 49714, true }, - { 49731, true }, - { 49742, true }, - { 49756, true }, - { 49763, true }, - { 49772, true }, - { 49787, true }, - { 49798, true }, - { 49822, true }, - { 49833, true }, - { 49843, true }, - { 49856, true }, - { 49867, true }, - { 49879, true }, - { 49900, true }, - { 49914, true }, - { 49929, true }, - { 49944, true }, - { 49956, true }, + { 49509, false }, + { 49519, false }, + { 49529, true }, + { 49548, false }, + { 49560, true }, + { 49574, true }, + { 49587, true }, + { 49606, true }, + { 49622, true }, + { 49637, true }, + { 49660, true }, + { 49673, true }, + { 49690, true }, + { 49699, true }, + { 49720, true }, + { 49735, true }, + { 49751, true }, + { 49764, true }, + { 49777, true }, + { 49789, true }, + { 49803, true }, + { 49820, true }, + { 49837, true }, + { 49848, true }, + { 49862, true }, + { 49869, true }, + { 49878, true }, + { 49893, true }, + { 49904, true }, + { 49928, true }, + { 49939, true }, + { 49949, true }, + { 49962, true }, { 49973, true }, - { 49989, true }, - { 50005, true }, - { 50026, true }, - { 50043, true }, - { 50072, true }, - { 50086, true }, - { 50097, false }, + { 49985, true }, + { 50006, true }, + { 50020, true }, + { 50035, true }, + { 50050, true }, + { 50062, true }, + { 50079, true }, + { 50095, true }, { 50111, true }, - { 50120, true }, - { 50138, true }, - { 50153, true }, - { 50170, true }, - { 50187, true }, - { 50198, true }, - { 50216, true }, - { 50239, true }, - { 50253, true }, - { 50272, true }, - { 50291, true }, - { 50305, true }, - { 50316, true }, - { 50326, true }, - { 50339, true }, - { 50355, true }, - { 50375, true }, - { 50394, true }, - { 50423, true }, - { 50439, true }, - { 50455, true }, - { 50465, true }, + { 50132, true }, + { 50149, true }, + { 50178, true }, + { 50192, true }, + { 50203, false }, + { 50217, true }, + { 50226, true }, + { 50244, true }, + { 50259, true }, + { 50276, true }, + { 50293, true }, + { 50304, true }, + { 50322, true }, + { 50345, true }, + { 50359, true }, + { 50378, true }, + { 50397, true }, + { 50411, true }, + { 50422, true }, + { 50432, true }, + { 50445, true }, + { 50461, true }, { 50481, true }, - { 50490, true }, - { 50505, true }, - { 50517, true }, - { 50531, true }, - { 50546, true }, - { 50559, true }, - { 50575, false }, - { 50585, true }, - { 50602, true }, - { 50615, true }, - { 50633, true }, - { 50655, true }, - { 50666, true }, - { 50675, true }, - { 50696, true }, - { 50708, false }, + { 50500, true }, + { 50529, true }, + { 50545, true }, + { 50561, true }, + { 50571, true }, + { 50587, true }, + { 50596, true }, + { 50611, true }, + { 50623, true }, + { 50637, true }, + { 50652, true }, + { 50665, true }, + { 50681, false }, + { 50691, true }, + { 50708, true }, { 50721, true }, - { 50733, true }, - { 50746, true }, + { 50739, true }, { 50761, true }, - { 50773, true }, - { 50790, true }, - { 50805, true }, - { 50836, true }, - { 50868, true }, + { 50772, true }, + { 50781, true }, + { 50802, true }, + { 50814, false }, + { 50827, true }, + { 50839, true }, + { 50852, true }, + { 50867, true }, + { 50879, true }, { 50896, true }, - { 50926, true }, - { 50938, true }, - { 50952, true }, - { 50968, true }, - { 50978, true }, - { 50988, true }, - { 51003, true }, - { 51025, true }, - { 51039, true }, - { 51049, true }, - { 51060, true }, - { 51076, true }, - { 51094, true }, - { 51113, true }, - { 51121, true }, - { 51135, true }, - { 51150, true }, - { 51158, true }, - { 51167, true }, - { 51190, true }, - { 51205, true }, - { 51223, true }, - { 51235, true }, - { 51251, true }, - { 51266, true }, - { 51279, true }, - { 51290, true }, - { 51305, true }, - { 51322, true }, - { 51333, true }, - { 51342, true }, - { 51354, true }, - { 51370, true }, - { 51380, true }, - { 51399, true }, - { 51413, true }, - { 51421, true }, - { 51430, true }, - { 51440, true }, - { 51461, true }, - { 51470, true }, - { 51481, true }, - { 51497, true }, - { 51507, true }, - { 51526, true }, - { 51540, true }, - { 51553, true }, - { 51571, true }, - { 51591, true }, - { 51611, true }, - { 51619, true }, + { 50911, true }, + { 50942, true }, + { 50974, true }, + { 51002, true }, + { 51032, true }, + { 51044, true }, + { 51058, true }, + { 51074, true }, + { 51084, true }, + { 51094, false }, + { 51109, true }, + { 51131, true }, + { 51145, true }, + { 51155, true }, + { 51166, true }, + { 51182, true }, + { 51200, true }, + { 51219, true }, + { 51227, true }, + { 51241, true }, + { 51256, true }, + { 51264, true }, + { 51273, true }, + { 51296, true }, + { 51311, true }, + { 51329, true }, + { 51341, true }, + { 51357, true }, + { 51372, true }, + { 51385, true }, + { 51396, true }, + { 51411, true }, + { 51428, true }, + { 51439, true }, + { 51448, true }, + { 51460, true }, + { 51476, true }, + { 51486, true }, + { 51505, true }, + { 51519, true }, + { 51527, true }, + { 51536, true }, + { 51546, true }, + { 51567, true }, + { 51576, true }, + { 51587, true }, + { 51603, true }, + { 51613, true }, { 51632, true }, - { 51643, true }, - { 51661, true }, - { 51671, true }, - { 51680, true }, - { 51689, true }, - { 51700, true }, - { 51708, true }, - { 51715, true }, + { 51646, true }, + { 51659, true }, + { 51677, true }, + { 51697, true }, + { 51717, true }, { 51725, true }, - { 51737, true }, - { 51747, true }, - { 51762, true }, - { 51769, true }, - { 51782, true }, - { 51806, false }, - { 51821, true }, - { 51841, true }, - { 51858, true }, - { 51869, true }, - { 51884, true }, - { 51894, true }, - { 51910, true }, - { 51927, true }, - { 51941, true }, - { 51958, true }, + { 51738, true }, + { 51749, true }, + { 51767, true }, + { 51777, true }, + { 51786, true }, + { 51795, true }, + { 51803, true }, + { 51810, true }, + { 51820, true }, + { 51832, true }, + { 51842, true }, + { 51857, true }, + { 51864, true }, + { 51877, true }, + { 51901, false }, + { 51916, true }, + { 51936, true }, + { 51953, true }, + { 51964, true }, { 51979, true }, - { 51988, true }, - { 51997, true }, - { 52010, true }, - { 52020, true }, - { 52032, true }, - { 52041, true }, - { 52051, true }, - { 52062, true }, - { 52070, true }, - { 52077, true }, - { 52102, true }, - { 52120, true }, - { 52138, true }, - { 52152, true }, - { 52161, true }, - { 52174, true }, - { 52191, true }, - { 52204, true }, - { 52220, true }, - { 52230, true }, - { 52245, true }, - { 52263, false }, - { 52276, true }, - { 52292, true }, - { 52308, true }, - { 52324, true }, - { 52337, true }, - { 52350, true }, - { 52363, true }, - { 52373, false }, - { 52391, true }, - { 52404, true }, - { 52417, true }, - { 52433, true }, - { 52452, true }, - { 52467, true }, - { 52474, true }, - { 52487, true }, - { 52516, true }, - { 52538, true }, - { 52559, true }, - { 52586, true }, - { 52606, true }, - { 52614, true }, - { 52625, true }, - { 52645, true }, - { 52664, true }, - { 52679, true }, - { 52698, true }, - { 52714, true }, - { 52730, false }, - { 52745, true }, - { 52760, true }, - { 52775, true }, - { 52794, true }, - { 52808, true }, - { 52826, true }, - { 52835, true }, - { 52845, true }, - { 52856, true }, - { 52872, true }, - { 52886, true }, - { 52900, true }, - { 52933, true }, - { 52948, true }, - { 52962, true }, - { 52976, true }, - { 52985, true }, - { 52996, true }, - { 53020, true }, - { 53032, true }, - { 53043, false }, - { 53056, true }, - { 53062, true }, - { 53072, true }, - { 53081, true }, - { 53095, true }, - { 53105, true }, - { 53121, true }, - { 53134, true }, - { 53147, true }, - { 53159, true }, - { 53175, true }, - { 53186, true }, - { 53198, true }, - { 53213, true }, - { 53230, true }, - { 53241, true }, - { 53253, true }, - { 53269, false }, - { 53284, true }, - { 53294, true }, - { 53310, true }, - { 53322, true }, - { 53333, true }, - { 53350, true }, - { 53369, true }, - { 53392, true }, - { 53409, true }, - { 53418, false }, - { 53427, true }, - { 53438, true }, - { 53455, true }, - { 53471, true }, - { 53485, true }, - { 53499, true }, - { 53517, false }, - { 53525, true }, - { 53534, true }, - { 53547, true }, - { 53564, true }, - { 53576, true }, - { 53586, true }, - { 53598, true }, - { 53606, true }, - { 53616, true }, - { 53622, true }, - { 53630, true }, - { 53648, true }, - { 53657, true }, - { 53674, true }, - { 53686, true }, - { 53695, true }, - { 53710, true }, - { 53720, true }, - { 53730, true }, - { 53739, true }, - { 53751, true }, - { 53772, true }, - { 53783, true }, - { 53797, true }, - { 53807, true }, - { 53824, true }, - { 53836, true }, - { 53859, true }, - { 53873, true }, - { 53888, true }, - { 53899, true }, - { 53915, true }, - { 53926, true }, - { 53942, true }, - { 53970, true }, - { 53986, true }, - { 53998, false }, - { 54016, true }, - { 54027, true }, - { 54037, true }, - { 54058, true }, - { 54068, true }, - { 54083, true }, - { 54097, true }, - { 54107, true }, - { 54122, true }, - { 54133, true }, - { 54145, true }, - { 54163, true }, - { 54176, true }, - { 54189, true }, - { 54198, true }, - { 54207, true }, - { 54219, true }, - { 54235, true }, - { 54248, true }, - { 54259, true }, - { 54275, true }, - { 54294, true }, - { 54310, true }, - { 54325, true }, - { 54356, true }, - { 54380, true }, - { 54399, true }, - { 54419, true }, - { 54436, true }, - { 54452, true }, - { 54467, true }, - { 54486, true }, - { 54508, true }, - { 54520, true }, - { 54537, true }, - { 54552, true }, - { 54571, true }, - { 54584, true }, - { 54599, true }, - { 54614, true }, - { 54627, true }, - { 54643, true }, - { 54655, true }, - { 54668, true }, - { 54678, false }, - { 54687, true }, - { 54707, true }, - { 54722, true }, - { 54733, true }, - { 54754, true }, - { 54770, true }, - { 54794, false }, - { 54811, true }, - { 54824, true }, - { 54840, true }, - { 54853, true }, - { 54866, true }, - { 54879, true }, - { 54898, true }, - { 54907, true }, - { 54925, true }, - { 54934, true }, - { 54944, true }, - { 54957, true }, - { 54967, true }, - { 54976, true }, - { 54992, true }, - { 55019, true }, - { 55030, true }, - { 55047, true }, - { 55060, true }, - { 55074, true }, - { 55091, true }, - { 55106, true }, - { 55129, true }, - { 55139, true }, - { 55157, true }, - { 55172, true }, - { 55197, true }, + { 51989, true }, + { 52005, true }, + { 52022, true }, + { 52036, true }, + { 52053, true }, + { 52074, true }, + { 52083, true }, + { 52092, true }, + { 52105, true }, + { 52115, true }, + { 52127, true }, + { 52136, true }, + { 52146, true }, + { 52157, true }, + { 52165, true }, + { 52172, true }, + { 52197, true }, + { 52215, true }, + { 52233, true }, + { 52247, true }, + { 52256, true }, + { 52269, true }, + { 52286, true }, + { 52299, true }, + { 52315, true }, + { 52325, true }, + { 52340, true }, + { 52358, false }, + { 52371, true }, + { 52387, true }, + { 52403, true }, + { 52419, true }, + { 52432, true }, + { 52445, true }, + { 52458, true }, + { 52468, false }, + { 52486, true }, + { 52499, true }, + { 52512, true }, + { 52528, true }, + { 52547, true }, + { 52562, true }, + { 52569, true }, + { 52582, true }, + { 52611, true }, + { 52633, true }, + { 52654, true }, + { 52681, true }, + { 52701, true }, + { 52709, true }, + { 52720, true }, + { 52740, true }, + { 52759, true }, + { 52774, true }, + { 52793, true }, + { 52809, true }, + { 52825, false }, + { 52840, true }, + { 52855, true }, + { 52870, true }, + { 52889, true }, + { 52903, true }, + { 52921, true }, + { 52930, true }, + { 52940, true }, + { 52951, true }, + { 52967, true }, + { 52981, true }, + { 52995, true }, + { 53028, true }, + { 53043, true }, + { 53057, true }, + { 53071, true }, + { 53080, true }, + { 53091, true }, + { 53115, true }, + { 53127, true }, + { 53138, false }, + { 53151, true }, + { 53157, true }, + { 53167, true }, + { 53176, true }, + { 53190, true }, + { 53200, true }, + { 53216, true }, + { 53229, true }, + { 53242, true }, + { 53254, true }, + { 53270, true }, + { 53281, true }, + { 53293, true }, + { 53308, true }, + { 53325, true }, + { 53336, true }, + { 53348, true }, + { 53364, false }, + { 53379, true }, + { 53389, true }, + { 53405, true }, + { 53417, true }, + { 53428, true }, + { 53445, true }, + { 53464, true }, + { 53487, true }, + { 53504, true }, + { 53513, false }, + { 53522, true }, + { 53533, true }, + { 53550, true }, + { 53566, true }, + { 53580, true }, + { 53594, true }, + { 53612, false }, + { 53620, true }, + { 53629, true }, + { 53642, true }, + { 53659, true }, + { 53671, true }, + { 53681, true }, + { 53693, true }, + { 53701, true }, + { 53711, true }, + { 53717, true }, + { 53725, true }, + { 53743, true }, + { 53752, true }, + { 53764, true }, + { 53773, true }, + { 53788, true }, + { 53798, true }, + { 53808, true }, + { 53817, true }, + { 53829, true }, + { 53850, true }, + { 53861, true }, + { 53875, true }, + { 53885, true }, + { 53902, true }, + { 53914, true }, + { 53937, true }, + { 53951, false }, + { 53966, true }, + { 53977, true }, + { 53993, true }, + { 54004, true }, + { 54020, true }, + { 54048, true }, + { 54064, true }, + { 54076, false }, + { 54094, true }, + { 54105, true }, + { 54115, true }, + { 54136, true }, + { 54146, true }, + { 54161, true }, + { 54175, true }, + { 54185, true }, + { 54200, true }, + { 54211, true }, + { 54223, true }, + { 54241, true }, + { 54254, true }, + { 54267, true }, + { 54276, true }, + { 54285, true }, + { 54297, true }, + { 54313, true }, + { 54324, true }, + { 54343, true }, + { 54359, true }, + { 54374, true }, + { 54405, true }, + { 54429, true }, + { 54448, true }, + { 54468, true }, + { 54485, true }, + { 54501, true }, + { 54516, true }, + { 54535, true }, + { 54557, true }, + { 54569, true }, + { 54586, true }, + { 54601, true }, + { 54620, true }, + { 54633, true }, + { 54648, true }, + { 54663, true }, + { 54676, true }, + { 54692, true }, + { 54704, true }, + { 54717, true }, + { 54727, false }, + { 54736, true }, + { 54756, true }, + { 54771, true }, + { 54782, true }, + { 54803, true }, + { 54819, true }, + { 54843, false }, + { 54860, true }, + { 54873, true }, + { 54889, true }, + { 54902, true }, + { 54915, true }, + { 54928, true }, + { 54947, true }, + { 54956, true }, + { 54974, true }, + { 54983, true }, + { 54993, true }, + { 55006, true }, + { 55016, true }, + { 55025, true }, + { 55041, true }, + { 55068, true }, + { 55079, true }, + { 55096, true }, + { 55109, true }, + { 55123, true }, + { 55140, true }, + { 55155, true }, + { 55178, true }, + { 55188, true }, + { 55206, true }, { 55221, true }, - { 55230, true }, - { 55251, true }, - { 55271, true }, - { 55283, true }, - { 55296, true }, - { 55310, true }, - { 55327, true }, - { 55344, false }, - { 55356, false }, - { 55369, true }, - { 55383, true }, - { 55400, true }, - { 55409, true }, - { 55420, true }, - { 55440, true }, - { 55454, true }, - { 55465, true }, - { 55479, true }, - { 55496, true }, - { 55505, true }, - { 55519, false }, - { 55547, true }, - { 55556, true }, - { 55565, true }, - { 55574, true }, - { 55584, true }, - { 55600, true }, - { 55610, true }, - { 55624, true }, - { 55646, false }, - { 55660, false }, - { 55675, true }, - { 55699, true }, - { 55720, true }, - { 55742, true }, - { 55756, true }, - { 55766, true }, - { 55776, true }, - { 55788, true }, - { 55804, true }, - { 55818, true }, + { 55246, true }, + { 55270, true }, + { 55279, true }, + { 55300, true }, + { 55320, true }, + { 55332, true }, + { 55345, true }, + { 55359, true }, + { 55376, true }, + { 55393, false }, + { 55405, false }, + { 55418, true }, + { 55432, true }, + { 55449, true }, + { 55458, true }, + { 55469, true }, + { 55489, true }, + { 55503, true }, + { 55514, true }, + { 55528, true }, + { 55545, true }, + { 55554, true }, + { 55568, false }, + { 55596, true }, + { 55605, true }, + { 55614, true }, + { 55623, true }, + { 55633, true }, + { 55649, true }, + { 55659, true }, + { 55673, true }, + { 55695, false }, + { 55709, false }, + { 55724, true }, + { 55748, true }, + { 55769, true }, + { 55791, true }, + { 55805, true }, + { 55815, true }, + { 55825, true }, { 55837, true }, { 55853, true }, - { 55866, true }, - { 55879, true }, - { 55889, true }, - { 55908, true }, - { 55932, true }, - { 55948, true }, - { 55958, true }, - { 55974, true }, - { 55993, true }, - { 56007, true }, - { 56025, true }, - { 56042, true }, - { 56059, true }, - { 56067, true }, - { 56093, true }, + { 55867, true }, + { 55886, true }, + { 55902, true }, + { 55915, true }, + { 55927, true }, + { 55940, true }, + { 55952, true }, + { 55964, true }, + { 55977, true }, + { 55987, true }, + { 56006, true }, + { 56030, true }, + { 56046, true }, + { 56056, true }, + { 56072, true }, + { 56091, true }, { 56105, true }, - { 56125, true }, - { 56141, true }, - { 56151, true }, - { 56166, true }, - { 56178, true }, - { 56193, true }, - { 56211, true }, - { 56229, true }, - { 56248, true }, - { 56262, true }, - { 56272, true }, - { 56283, true }, - { 56302, true }, - { 56318, true }, - { 56337, true }, - { 56347, true }, - { 56366, true }, - { 56378, true }, - { 56389, true }, - { 56402, true }, - { 56426, true }, - { 56450, true }, - { 56470, true }, - { 56483, false }, - { 56495, true }, - { 56507, true }, - { 56522, true }, - { 56542, true }, - { 56552, true }, - { 56562, false }, - { 56579, true }, - { 56587, true }, - { 56603, true }, - { 56618, true }, - { 56634, true }, + { 56123, true }, + { 56140, true }, + { 56157, true }, + { 56165, true }, + { 56191, true }, + { 56203, true }, + { 56223, true }, + { 56239, true }, + { 56249, true }, + { 56264, true }, + { 56276, true }, + { 56291, true }, + { 56309, true }, + { 56327, true }, + { 56346, true }, + { 56360, true }, + { 56370, true }, + { 56381, true }, + { 56400, true }, + { 56416, true }, + { 56435, true }, + { 56445, true }, + { 56464, true }, + { 56476, true }, + { 56487, true }, + { 56500, true }, + { 56524, true }, + { 56548, true }, + { 56568, true }, + { 56581, false }, + { 56593, true }, + { 56605, true }, + { 56620, true }, + { 56640, true }, { 56650, true }, - { 56664, true }, - { 56678, true }, - { 56690, true }, - { 56710, true }, - { 56726, true }, - { 56743, true }, - { 56753, true }, - { 56766, true }, - { 56780, true }, - { 56793, true }, - { 56803, true }, - { 56817, true }, - { 56829, true }, - { 56845, true }, - { 56869, true }, - { 56894, true }, - { 56907, true }, - { 56920, true }, - { 56932, true }, - { 56951, true }, - { 56964, true }, - { 56977, true }, - { 56997, true }, - { 57012, true }, + { 56660, false }, + { 56677, true }, + { 56685, true }, + { 56701, true }, + { 56716, true }, + { 56732, true }, + { 56748, true }, + { 56762, true }, + { 56776, true }, + { 56788, true }, + { 56808, true }, + { 56824, true }, + { 56841, true }, + { 56851, true }, + { 56864, true }, + { 56878, true }, + { 56891, true }, + { 56901, true }, + { 56915, true }, + { 56927, true }, + { 56943, true }, + { 56967, true }, + { 56992, true }, + { 57005, true }, + { 57018, true }, { 57030, true }, - { 57039, true }, - { 57050, true }, - { 57061, true }, - { 57073, true }, - { 57084, true }, - { 57094, true }, - { 57108, true }, - { 57120, true }, - { 57130, true }, - { 57144, true }, - { 57178, true }, - { 57208, true }, + { 57049, true }, + { 57062, true }, + { 57075, true }, + { 57095, true }, + { 57110, true }, + { 57128, true }, + { 57137, true }, + { 57148, true }, + { 57159, true }, + { 57171, true }, + { 57182, true }, + { 57192, true }, + { 57206, true }, { 57218, true }, - { 57229, true }, - { 57241, true }, - { 57250, true }, - { 57261, false }, - { 57274, true }, - { 57281, true }, - { 57293, true }, - { 57309, true }, - { 57326, true }, - { 57339, false }, - { 57359, true }, - { 57372, true }, - { 57384, true }, - { 57397, true }, - { 57416, true }, - { 57437, true }, - { 57447, true }, - { 57456, true }, + { 57228, true }, + { 57242, true }, + { 57276, true }, + { 57306, true }, + { 57316, true }, + { 57328, true }, + { 57337, true }, + { 57348, false }, + { 57361, true }, + { 57368, true }, + { 57380, true }, + { 57396, true }, + { 57413, true }, + { 57426, false }, + { 57446, true }, + { 57459, true }, { 57471, true }, { 57484, true }, - { 57495, true }, - { 57504, true }, - { 57517, true }, - { 57526, true }, - { 57539, true }, - { 57548, true }, - { 57560, true }, - { 57569, true }, - { 57578, true }, - { 57597, true }, - { 57611, true }, - { 57629, true }, - { 57651, false }, - { 57676, true }, - { 57689, true }, + { 57503, true }, + { 57524, true }, + { 57534, true }, + { 57543, true }, + { 57558, true }, + { 57571, true }, + { 57582, true }, + { 57591, true }, + { 57604, true }, + { 57613, true }, + { 57626, true }, + { 57635, true }, + { 57647, true }, + { 57656, true }, + { 57665, true }, + { 57684, true }, { 57698, true }, - { 57719, true }, - { 57729, true }, - { 57742, true }, - { 57754, true }, - { 57779, true }, - { 57795, true }, - { 57808, true }, - { 57823, true }, - { 57837, true }, - { 57846, true }, - { 57864, true }, - { 57874, true }, - { 57892, true }, - { 57903, true }, - { 57929, false }, - { 57944, true }, - { 57959, true }, - { 57968, true }, + { 57716, true }, + { 57738, false }, + { 57763, true }, + { 57776, true }, + { 57785, true }, + { 57806, true }, + { 57816, true }, + { 57828, true }, + { 57853, true }, + { 57869, true }, + { 57882, true }, + { 57897, true }, + { 57911, true }, + { 57920, true }, + { 57938, true }, + { 57948, true }, + { 57966, true }, { 57977, true }, - { 57991, false }, - { 58002, true }, - { 58010, true }, - { 58019, true }, - { 58027, true }, - { 58036, true }, + { 58003, false }, + { 58018, true }, + { 58033, true }, + { 58042, true }, { 58051, true }, - { 58063, true }, - { 58077, true }, - { 58091, true }, - { 58111, true }, - { 58123, true }, - { 58141, true }, - { 58157, true }, - { 58171, true }, - { 58188, true }, - { 58201, true }, - { 58211, true }, - { 58225, true }, - { 58237, true }, - { 58251, true }, - { 58264, true }, - { 58277, true }, - { 58290, true }, - { 58301, true }, + { 58065, false }, + { 58076, true }, + { 58084, true }, + { 58093, true }, + { 58101, true }, + { 58110, true }, + { 58125, true }, + { 58137, true }, + { 58151, true }, + { 58165, true }, + { 58185, true }, + { 58197, true }, + { 58215, true }, + { 58231, true }, + { 58245, true }, + { 58262, true }, + { 58275, true }, + { 58285, true }, + { 58299, true }, { 58311, true }, - { 58318, true }, - { 58327, true }, - { 58346, true }, - { 58360, true }, - { 58374, true }, + { 58325, true }, + { 58338, true }, + { 58351, true }, + { 58364, true }, + { 58375, true }, { 58385, true }, - { 58398, true }, - { 58414, true }, - { 58437, true }, - { 58452, true }, - { 58466, true }, - { 58486, true }, - { 58498, true }, - { 58513, true }, - { 58532, true }, - { 58546, true }, - { 58564, true }, - { 58582, true }, - { 58589, true }, - { 58601, true }, - { 58618, true }, - { 58637, true }, - { 58647, true }, - { 58667, true }, - { 58680, true }, - { 58690, true }, - { 58704, true }, + { 58392, true }, + { 58401, true }, + { 58420, true }, + { 58434, true }, + { 58448, true }, + { 58459, true }, + { 58472, true }, + { 58488, true }, + { 58511, true }, + { 58526, true }, + { 58540, true }, + { 58560, true }, + { 58572, true }, + { 58587, true }, + { 58606, true }, + { 58620, true }, + { 58638, true }, + { 58656, true }, + { 58663, true }, + { 58675, true }, + { 58692, true }, + { 58711, true }, { 58721, true }, - { 58734, true }, - { 58744, true }, - { 58756, true }, - { 58768, true }, - { 58781, false }, - { 58796, true }, - { 58809, true }, - { 58823, true }, - { 58840, true }, - { 58852, true }, - { 58871, true }, + { 58741, true }, + { 58754, true }, + { 58764, true }, + { 58778, true }, + { 58795, true }, + { 58808, true }, + { 58818, true }, + { 58830, true }, + { 58842, true }, + { 58855, false }, + { 58870, true }, { 58883, true }, - { 58895, true }, - { 58905, true }, - { 58916, true }, - { 58930, true }, - { 58955, true }, - { 58978, false }, - { 58988, true }, - { 58999, true }, - { 59012, true }, - { 59023, true }, - { 59032, true }, - { 59042, true }, - { 59055, true }, - { 59066, true }, + { 58897, true }, + { 58914, true }, + { 58926, true }, + { 58945, true }, + { 58957, true }, + { 58969, true }, + { 58979, true }, + { 58990, true }, + { 59004, true }, + { 59029, true }, + { 59052, false }, + { 59062, true }, + { 59073, true }, { 59086, true }, + { 59097, true }, { 59106, true }, - { 59124, true }, - { 59136, true }, - { 59159, true }, - { 59177, true }, - { 59194, true }, - { 59208, true }, - { 59231, true }, - { 59241, true }, - { 59256, true }, - { 59272, true }, - { 59285, true }, - { 59293, true }, + { 59116, true }, + { 59129, true }, + { 59140, true }, + { 59160, true }, + { 59180, true }, + { 59198, true }, + { 59210, true }, + { 59233, true }, + { 59251, true }, + { 59268, true }, + { 59282, true }, { 59305, true }, - { 59319, true }, - { 59341, true }, - { 59348, true }, - { 59361, true }, - { 59381, true }, - { 59399, true }, - { 59421, true }, - { 59434, true }, - { 59445, true }, - { 59459, true }, - { 59472, true }, - { 59491, true }, - { 59507, true }, - { 59526, true }, - { 59545, true }, - { 59560, true }, - { 59572, true }, - { 59588, true }, - { 59607, true }, - { 59624, true }, - { 59645, true }, - { 59664, true }, - { 59682, true }, - { 59700, true }, - { 59709, true }, - { 59732, true }, - { 59746, true }, - { 59759, true }, - { 59771, true }, - { 59781, true }, - { 59792, false }, - { 59802, true }, - { 59822, true }, - { 59835, true }, - { 59850, true }, - { 59859, true }, - { 59871, true }, - { 59881, true }, - { 59888, true }, - { 59905, true }, - { 59918, true }, - { 59927, true }, - { 59940, true }, - { 59953, true }, - { 59971, true }, - { 59991, true }, - { 60007, true }, - { 60023, true }, - { 60037, true }, - { 60054, true }, - { 60064, true }, - { 60091, true }, - { 60126, true }, - { 60152, false }, + { 59315, true }, + { 59330, true }, + { 59346, true }, + { 59359, true }, + { 59367, true }, + { 59379, true }, + { 59393, true }, + { 59415, true }, + { 59422, true }, + { 59435, true }, + { 59455, true }, + { 59473, true }, + { 59495, true }, + { 59508, true }, + { 59519, true }, + { 59533, true }, + { 59546, true }, + { 59565, true }, + { 59581, true }, + { 59600, true }, + { 59619, true }, + { 59634, true }, + { 59646, true }, + { 59662, true }, + { 59681, true }, + { 59698, true }, + { 59719, true }, + { 59738, true }, + { 59756, true }, + { 59774, true }, + { 59783, true }, + { 59806, true }, + { 59820, true }, + { 59833, true }, + { 59845, true }, + { 59855, true }, + { 59866, false }, + { 59876, true }, + { 59896, true }, + { 59909, true }, + { 59924, true }, + { 59933, true }, + { 59945, true }, + { 59955, true }, + { 59962, true }, + { 59979, true }, + { 59992, true }, + { 60001, true }, + { 60014, true }, + { 60027, true }, + { 60045, true }, + { 60065, true }, + { 60081, true }, + { 60097, true }, + { 60111, true }, + { 60128, true }, + { 60138, true }, { 60165, true }, - { 60178, true }, - { 60197, true }, - { 60222, true }, - { 60237, true }, - { 60257, false }, - { 60267, true }, - { 60284, true }, - { 60301, true }, + { 60200, true }, + { 60226, false }, + { 60239, true }, + { 60252, true }, + { 60271, true }, + { 60296, true }, { 60311, true }, - { 60321, true }, - { 60334, true }, - { 60349, true }, - { 60362, true }, - { 60377, true }, - { 60393, true }, - { 60406, true }, - { 60419, true }, - { 60433, true }, - { 60448, true }, - { 60459, true }, - { 60471, true }, - { 60484, true }, - { 60503, true }, - { 60527, true }, - { 60549, true }, - { 60570, true }, - { 60595, true }, - { 60618, true }, - { 60640, true }, - { 60660, true }, - { 60671, true }, - { 60683, true }, - { 60703, true }, - { 60720, true }, - { 60741, true }, - { 60759, true }, - { 60782, true }, - { 60798, true }, - { 60818, true }, - { 60831, true }, - { 60841, true }, - { 60852, true }, - { 60871, true }, - { 60881, true }, - { 60891, true }, - { 60899, true }, - { 60912, true }, - { 60925, true }, - { 60934, true }, - { 60941, true }, - { 60948, false }, - { 60964, true }, + { 60331, false }, + { 60341, true }, + { 60358, true }, + { 60375, true }, + { 60385, true }, + { 60395, true }, + { 60408, true }, + { 60423, true }, + { 60436, true }, + { 60451, true }, + { 60467, true }, + { 60480, true }, + { 60493, true }, + { 60507, true }, + { 60522, true }, + { 60533, true }, + { 60545, true }, + { 60558, true }, + { 60577, true }, + { 60601, true }, + { 60623, true }, + { 60644, true }, + { 60669, true }, + { 60692, true }, + { 60714, true }, + { 60734, true }, + { 60745, true }, + { 60757, true }, + { 60777, true }, + { 60794, true }, + { 60815, true }, + { 60833, true }, + { 60856, true }, + { 60872, true }, + { 60892, true }, + { 60905, true }, + { 60915, true }, + { 60926, true }, + { 60945, true }, + { 60955, true }, + { 60965, true }, { 60973, true }, - { 60990, true }, - { 61004, true }, - { 61023, true }, - { 61035, true }, - { 61058, true }, - { 61072, true }, - { 61088, true }, - { 61100, true }, - { 61116, true }, - { 61133, true }, - { 61151, true }, - { 61172, true }, - { 61189, true }, - { 61206, true }, - { 61223, true }, - { 61240, true }, - { 61257, true }, - { 61274, true }, - { 61290, true }, - { 61304, true }, - { 61329, true }, - { 61340, true }, - { 61356, true }, - { 61372, true }, - { 61388, false }, - { 61401, true }, - { 61416, true }, - { 61433, false }, - { 61449, true }, - { 61463, true }, - { 61476, true }, - { 61486, true }, - { 61497, true }, - { 61511, true }, - { 61525, true }, - { 61535, false }, - { 61545, false }, + { 60986, true }, + { 60999, true }, + { 61008, true }, + { 61015, true }, + { 61022, false }, + { 61038, true }, + { 61047, true }, + { 61064, true }, + { 61078, true }, + { 61097, true }, + { 61109, true }, + { 61132, true }, + { 61146, true }, + { 61162, true }, + { 61174, true }, + { 61190, true }, + { 61207, true }, + { 61225, true }, + { 61246, true }, + { 61263, true }, + { 61280, true }, + { 61297, true }, + { 61314, true }, + { 61331, true }, + { 61348, true }, + { 61364, true }, + { 61378, true }, + { 61403, true }, + { 61414, true }, + { 61430, true }, + { 61446, true }, + { 61462, false }, + { 61475, true }, + { 61490, false }, + { 61506, true }, + { 61520, true }, + { 61533, true }, + { 61543, true }, { 61554, true }, - { 61573, true }, - { 61583, true }, + { 61568, true }, + { 61582, true }, { 61592, false }, - { 61612, true }, - { 61635, true }, - { 61652, true }, - { 61671, true }, - { 61688, true }, - { 61700, true }, - { 61711, false }, - { 61723, true }, - { 61734, true }, - { 61749, true }, - { 61767, true }, - { 61777, true }, - { 61785, true }, - { 61799, true }, - { 61812, false }, - { 61825, true }, - { 61840, true }, - { 61854, true }, - { 61866, true }, - { 61880, true }, - { 61894, true }, - { 61904, true }, - { 61920, true }, - { 61936, true }, - { 61955, false }, - { 61984, true }, - { 61998, true }, - { 62012, true }, - { 62033, true }, - { 62051, true }, - { 62066, true }, - { 62082, true }, - { 62095, true }, - { 62113, true }, - { 62133, true }, - { 62145, true }, - { 62157, true }, - { 62172, true }, - { 62195, true }, - { 62219, true }, - { 62243, true }, - { 62253, true }, - { 62275, true }, - { 62307, true }, - { 62318, true }, - { 62328, true }, - { 62343, true }, - { 62357, false }, - { 62377, true }, - { 62395, true }, - { 62404, true }, - { 62411, true }, - { 62422, true }, - { 62431, true }, - { 62444, true }, - { 62467, true }, - { 62482, false }, - { 62493, false }, - { 62505, false }, - { 62516, true }, - { 62542, false }, - { 62558, true }, - { 62568, true }, - { 62576, true }, - { 62585, true }, - { 62597, true }, - { 62609, false }, - { 62621, true }, - { 62634, true }, - { 62646, true }, - { 62663, true }, - { 62683, true }, - { 62694, true }, - { 62710, true }, - { 62722, true }, - { 62739, true }, - { 62748, true }, - { 62761, true }, - { 62785, true }, - { 62798, true }, - { 62816, true }, - { 62829, true }, - { 62853, true }, - { 62867, true }, - { 62884, true }, - { 62899, true }, - { 62909, true }, - { 62921, true }, - { 62933, false }, - { 62948, true }, - { 62963, true }, - { 62980, true }, - { 62988, true }, - { 63000, true }, - { 63019, true }, - { 63036, true }, - { 63053, true }, - { 63068, true }, - { 63080, true }, - { 63105, false }, - { 63118, false }, - { 63130, true }, - { 63150, true }, - { 63163, true }, - { 63176, true }, - { 63188, true }, - { 63212, true }, - { 63225, true }, - { 63244, true }, - { 63256, true }, - { 63268, true }, - { 63289, true }, - { 63303, true }, - { 63328, true }, - { 63342, true }, - { 63355, false }, - { 63371, true }, - { 63383, true }, - { 63396, true }, - { 63406, true }, - { 63418, true }, - { 63430, true }, - { 63441, true }, - { 63452, true }, - { 63464, true }, - { 63472, true }, - { 63481, true }, - { 63491, true }, - { 63505, true }, - { 63517, true }, - { 63533, true }, - { 63555, false }, - { 63569, true }, - { 63579, true }, - { 63592, true }, - { 63613, true }, + { 61602, false }, + { 61611, true }, + { 61630, true }, + { 61640, true }, + { 61649, false }, + { 61669, true }, + { 61692, true }, + { 61709, true }, + { 61728, true }, + { 61745, true }, + { 61757, true }, + { 61768, false }, + { 61780, true }, + { 61791, true }, + { 61806, true }, + { 61824, true }, + { 61834, true }, + { 61842, true }, + { 61856, true }, + { 61869, false }, + { 61882, true }, + { 61897, true }, + { 61911, true }, + { 61923, true }, + { 61937, true }, + { 61951, true }, + { 61961, true }, + { 61977, true }, + { 61993, true }, + { 62012, false }, + { 62041, true }, + { 62055, true }, + { 62069, true }, + { 62090, true }, + { 62108, true }, + { 62123, true }, + { 62139, true }, + { 62152, true }, + { 62170, true }, + { 62190, true }, + { 62202, true }, + { 62214, true }, + { 62229, true }, + { 62252, true }, + { 62276, true }, + { 62300, true }, + { 62310, true }, + { 62332, true }, + { 62364, true }, + { 62375, true }, + { 62385, true }, + { 62400, true }, + { 62414, false }, + { 62434, true }, + { 62452, true }, + { 62461, true }, + { 62468, true }, + { 62479, true }, + { 62488, true }, + { 62501, true }, + { 62524, true }, + { 62539, false }, + { 62550, false }, + { 62562, false }, + { 62573, true }, + { 62599, false }, + { 62615, true }, + { 62625, true }, + { 62633, true }, + { 62642, true }, + { 62654, true }, + { 62666, false }, + { 62678, true }, + { 62691, true }, + { 62703, true }, + { 62720, true }, + { 62740, true }, + { 62751, true }, + { 62767, true }, + { 62779, true }, + { 62796, true }, + { 62805, true }, + { 62818, true }, + { 62842, true }, + { 62855, true }, + { 62873, true }, + { 62886, true }, + { 62910, true }, + { 62924, true }, + { 62941, true }, + { 62956, true }, + { 62966, true }, + { 62978, true }, + { 62990, false }, + { 63005, true }, + { 63020, true }, + { 63037, true }, + { 63045, true }, + { 63057, true }, + { 63076, true }, + { 63093, true }, + { 63110, true }, + { 63125, true }, + { 63137, true }, + { 63162, false }, + { 63175, false }, + { 63187, true }, + { 63207, true }, + { 63220, true }, + { 63233, true }, + { 63245, true }, + { 63269, true }, + { 63282, true }, + { 63301, true }, + { 63313, true }, + { 63325, true }, + { 63346, true }, + { 63360, true }, + { 63385, true }, + { 63399, true }, + { 63412, false }, + { 63428, true }, + { 63440, true }, + { 63453, true }, + { 63463, true }, + { 63475, true }, + { 63487, true }, + { 63498, true }, + { 63509, true }, + { 63521, true }, + { 63529, true }, + { 63538, true }, + { 63548, true }, + { 63562, true }, + { 63574, true }, + { 63590, true }, + { 63612, false }, { 63626, true }, - { 63639, true }, - { 63647, false }, - { 63664, true }, - { 63678, true }, - { 63694, false }, - { 63713, true }, - { 63732, true }, - { 63742, true }, - { 63754, true }, - { 63768, true }, - { 63776, true }, - { 63795, false }, - { 63813, true }, - { 63822, true }, - { 63835, true }, - { 63850, true }, - { 63870, false }, - { 63883, true }, - { 63900, true }, - { 63913, true }, - { 63926, true }, - { 63950, true }, - { 63977, true }, - { 63990, false }, - { 64004, true }, - { 64016, true }, - { 64029, false }, - { 64041, true }, - { 64053, true }, - { 64068, true }, - { 64086, true }, - { 64099, true }, - { 64122, false }, - { 64133, true }, - { 64149, true }, - { 64167, true }, - { 64187, true }, - { 64209, true }, - { 64225, true }, - { 64242, true }, - { 64259, true }, - { 64277, true }, - { 64290, true }, - { 64307, true }, - { 64322, true }, - { 64336, true }, - { 64352, true }, - { 64371, true }, - { 64381, true }, - { 64389, true }, - { 64398, true }, - { 64413, true }, + { 63636, true }, + { 63649, true }, + { 63670, true }, + { 63683, true }, + { 63696, true }, + { 63704, false }, + { 63721, true }, + { 63735, true }, + { 63751, false }, + { 63770, true }, + { 63789, true }, + { 63799, true }, + { 63811, true }, + { 63825, true }, + { 63833, true }, + { 63852, false }, + { 63870, true }, + { 63879, true }, + { 63892, true }, + { 63907, true }, + { 63927, false }, + { 63940, true }, + { 63957, true }, + { 63970, true }, + { 63983, true }, + { 64007, true }, + { 64034, true }, + { 64047, false }, + { 64061, true }, + { 64073, true }, + { 64086, false }, + { 64098, true }, + { 64110, true }, + { 64125, true }, + { 64143, true }, + { 64156, true }, + { 64179, false }, + { 64190, true }, + { 64206, true }, + { 64224, true }, + { 64244, true }, + { 64266, true }, + { 64282, true }, + { 64299, true }, + { 64316, true }, + { 64334, true }, + { 64347, true }, + { 64364, true }, + { 64379, true }, + { 64393, true }, + { 64409, true }, { 64428, true }, + { 64438, true }, { 64446, true }, - { 64463, false }, - { 64474, true }, - { 64490, true }, - { 64504, true }, - { 64516, true }, - { 64524, true }, - { 64533, true }, - { 64549, true }, - { 64555, true }, - { 64567, true }, - { 64589, true }, - { 64603, true }, - { 64618, true }, - { 64629, true }, - { 64642, true }, - { 64658, true }, - { 64676, false }, - { 64689, true }, - { 64698, true }, - { 64709, true }, - { 64728, true }, - { 64736, true }, - { 64753, true }, - { 64762, true }, - { 64771, true }, - { 64790, true }, - { 64801, true }, - { 64817, true }, - { 64838, true }, - { 64855, true }, - { 64868, true }, - { 64879, true }, - { 64896, true }, - { 64921, true }, - { 64940, true }, - { 64954, true }, - { 64969, true }, - { 64981, true }, - { 64992, true }, - { 65006, true }, - { 65020, true }, - { 65037, true }, - { 65057, true }, - { 65066, true }, - { 65080, true }, - { 65091, true }, - { 65111, false }, - { 65135, true }, - { 65153, false }, - { 65161, true }, - { 65179, true }, - { 65201, true }, - { 65223, true }, - { 65239, true }, - { 65251, true }, - { 65263, true }, - { 65277, true }, - { 65290, false }, - { 65307, true }, - { 65316, true }, - { 65338, true }, - { 65358, true }, - { 65385, true }, - { 65404, true }, - { 65424, true }, - { 65433, true }, - { 65450, true }, - { 65465, true }, - { 65494, true }, - { 65516, true }, - { 65534, true }, - { 65548, true }, - { 65563, true }, - { 65576, true }, - { 65589, true }, - { 65599, true }, - { 65617, true }, - { 65636, true }, - { 65654, true }, - { 65672, true }, - { 65680, true }, - { 65687, false }, - { 65707, true }, - { 65716, true }, - { 65731, true }, - { 65749, true }, - { 65761, true }, - { 65770, false }, - { 65780, true }, + { 64455, true }, + { 64470, true }, + { 64485, true }, + { 64503, true }, + { 64520, false }, + { 64531, true }, + { 64547, true }, + { 64561, true }, + { 64573, true }, + { 64581, true }, + { 64590, true }, + { 64606, true }, + { 64612, true }, + { 64624, true }, + { 64646, true }, + { 64660, true }, + { 64675, true }, + { 64686, true }, + { 64699, true }, + { 64715, true }, + { 64733, false }, + { 64746, true }, + { 64755, true }, + { 64766, true }, + { 64785, true }, + { 64793, true }, + { 64810, true }, + { 64819, true }, + { 64828, true }, + { 64847, true }, + { 64858, true }, + { 64874, true }, + { 64895, true }, + { 64912, true }, + { 64925, true }, + { 64936, true }, + { 64953, true }, + { 64978, true }, + { 64997, true }, + { 65011, true }, + { 65026, true }, + { 65038, true }, + { 65049, true }, + { 65063, true }, + { 65077, true }, + { 65094, true }, + { 65114, true }, + { 65123, true }, + { 65137, true }, + { 65148, true }, + { 65168, false }, + { 65192, true }, + { 65210, false }, + { 65218, true }, + { 65236, true }, + { 65258, true }, + { 65280, true }, + { 65296, true }, + { 65308, true }, + { 65320, true }, + { 65334, true }, + { 65347, false }, + { 65364, true }, + { 65373, true }, + { 65395, true }, + { 65415, true }, + { 65442, true }, + { 65461, true }, + { 65481, true }, + { 65490, true }, + { 65507, true }, + { 65522, true }, + { 65551, true }, + { 65573, true }, + { 65591, true }, + { 65605, true }, + { 65620, true }, + { 65633, true }, + { 65646, true }, + { 65656, true }, + { 65674, true }, + { 65693, true }, + { 65711, true }, + { 65729, true }, + { 65737, true }, + { 65744, false }, + { 65764, true }, + { 65773, true }, { 65788, true }, - { 65809, true }, - { 65826, true }, + { 65806, true }, + { 65818, true }, + { 65827, false }, { 65837, true }, - { 65847, true }, - { 65864, true }, - { 65886, true }, - { 65901, true }, - { 65918, true }, - { 65928, true }, - { 65941, true }, - { 65956, true }, - { 65972, true }, - { 65983, true }, - { 65995, true }, - { 66017, true }, - { 66030, true }, - { 66041, true }, - { 66057, true }, - { 66073, true }, - { 66083, true }, - { 66095, true }, - { 66103, true }, - { 66122, true }, - { 66141, true }, - { 66154, true }, - { 66168, true }, - { 66185, true }, - { 66197, true }, + { 65845, true }, + { 65866, true }, + { 65883, true }, + { 65894, true }, + { 65904, true }, + { 65921, false }, + { 65943, true }, + { 65958, true }, + { 65975, true }, + { 65985, true }, + { 65998, true }, + { 66013, true }, + { 66029, true }, + { 66040, true }, + { 66052, true }, + { 66074, true }, + { 66087, true }, + { 66098, true }, + { 66114, true }, + { 66130, true }, + { 66140, true }, + { 66152, true }, + { 66160, true }, + { 66179, true }, + { 66198, true }, { 66211, true }, - { 66223, false }, - { 66237, true }, - { 66251, true }, - { 66273, true }, - { 66292, true }, - { 66305, true }, - { 66323, true }, - { 66338, true }, - { 66353, true }, - { 66372, true }, - { 66385, true }, + { 66225, true }, + { 66242, true }, + { 66254, true }, + { 66268, true }, + { 66280, false }, + { 66294, true }, + { 66308, true }, + { 66330, true }, + { 66349, true }, + { 66362, true }, + { 66380, true }, + { 66395, true }, { 66410, true }, - { 66433, true }, - { 66446, true }, - { 66458, true }, - { 66469, true }, - { 66483, true }, - { 66496, true }, - { 66514, true }, - { 66533, true }, - { 66547, true }, - { 66558, true }, + { 66429, true }, + { 66442, true }, + { 66467, true }, + { 66490, true }, + { 66503, true }, + { 66515, true }, + { 66526, true }, + { 66540, true }, + { 66553, true }, { 66571, true }, - { 66587, true }, - { 66599, true }, + { 66590, true }, + { 66604, true }, { 66615, true }, { 66628, true }, { 66644, true }, - { 66659, true }, - { 66674, true }, - { 66688, true }, - { 66707, true }, - { 66720, true }, - { 66730, true }, - { 66742, true }, - { 66752, true }, - { 66768, true }, - { 66776, true }, - { 66784, true }, - { 66797, true }, - { 66808, true }, - { 66824, true }, - { 66834, true }, - { 66851, true }, - { 66869, true }, - { 66882, true }, - { 66895, true }, - { 66904, true }, - { 66919, true }, - { 66937, true }, - { 66951, true }, - { 66969, true }, - { 66985, true }, + { 66656, true }, + { 66672, true }, + { 66685, true }, + { 66701, true }, + { 66716, true }, + { 66731, true }, + { 66745, true }, + { 66764, true }, + { 66777, true }, + { 66787, true }, + { 66799, true }, + { 66809, true }, + { 66825, true }, + { 66833, true }, + { 66841, true }, + { 66854, true }, + { 66865, true }, + { 66881, true }, + { 66891, true }, + { 66908, true }, + { 66926, true }, + { 66939, true }, + { 66952, true }, + { 66961, true }, + { 66976, true }, { 66994, true }, - { 67003, true }, - { 67018, true }, - { 67028, true }, - { 67038, true }, - { 67052, true }, - { 67064, true }, - { 67081, true }, + { 67008, true }, + { 67026, true }, + { 67042, true }, + { 67051, true }, + { 67060, true }, + { 67075, true }, + { 67085, true }, { 67095, true }, - { 67103, true }, - { 67111, true }, - { 67120, true }, - { 67132, true }, - { 67145, false }, - { 67153, true }, - { 67179, true }, - { 67192, true }, - { 67206, true }, - { 67216, true }, - { 67233, true }, - { 67248, true }, - { 67259, true }, - { 67270, true }, - { 67281, true }, - { 67293, true }, - { 67306, true }, - { 67314, false }, - { 67328, true }, - { 67349, true }, - { 67374, true }, - { 67385, true }, - { 67399, true }, - { 67417, true }, - { 67428, true }, - { 67442, true }, - { 67458, true }, - { 67471, true }, - { 67487, true }, - { 67498, true }, - { 67517, true }, - { 67531, true }, - { 67540, true }, - { 67554, true }, - { 67565, true }, - { 67574, true }, - { 67592, true }, - { 67606, true }, - { 67624, true }, - { 67643, true }, - { 67653, true }, - { 67666, true }, - { 67677, true }, - { 67686, true }, - { 67706, true }, - { 67720, true }, - { 67728, true }, - { 67738, true }, - { 67745, true }, - { 67758, true }, + { 67109, true }, + { 67121, true }, + { 67138, true }, + { 67152, true }, + { 67160, true }, + { 67169, true }, + { 67181, true }, + { 67194, false }, + { 67202, true }, + { 67228, true }, + { 67241, true }, + { 67255, true }, + { 67265, true }, + { 67282, true }, + { 67297, true }, + { 67308, true }, + { 67319, true }, + { 67330, true }, + { 67342, true }, + { 67355, true }, + { 67363, false }, + { 67377, true }, + { 67398, true }, + { 67423, true }, + { 67434, true }, + { 67448, true }, + { 67466, true }, + { 67477, true }, + { 67491, true }, + { 67507, true }, + { 67520, true }, + { 67536, true }, + { 67547, true }, + { 67566, true }, + { 67580, true }, + { 67589, true }, + { 67603, true }, + { 67614, true }, + { 67623, true }, + { 67641, true }, + { 67655, true }, + { 67673, true }, + { 67692, true }, + { 67702, true }, + { 67715, true }, + { 67726, true }, + { 67735, true }, + { 67755, true }, { 67769, true }, - { 67783, true }, - { 67797, true }, - { 67811, true }, - { 67821, true }, - { 67831, true }, - { 67841, true }, - { 67853, true }, + { 67777, true }, + { 67787, true }, + { 67794, true }, + { 67807, true }, + { 67818, true }, + { 67832, true }, + { 67846, true }, { 67860, true }, { 67870, true }, - { 67879, true }, - { 67894, true }, - { 67901, true }, - { 67911, true }, - { 67923, true }, - { 67933, true }, - { 67944, true }, - { 67951, true }, - { 67960, true }, + { 67880, true }, + { 67890, true }, + { 67902, true }, + { 67909, true }, + { 67919, true }, + { 67928, true }, + { 67943, true }, + { 67950, true }, + { 67962, true }, { 67972, true }, - { 67981, true }, - { 67995, true }, - { 68008, true }, - { 68017, true }, - { 68029, false }, - { 68042, true }, - { 68064, true }, - { 68087, true }, - { 68101, true }, - { 68116, true }, - { 68131, true }, - { 68147, true }, - { 68165, true }, - { 68175, true }, - { 68195, true }, - { 68205, true }, - { 68216, true }, + { 67983, true }, + { 67990, true }, + { 67999, true }, + { 68011, true }, + { 68020, true }, + { 68034, true }, + { 68047, true }, + { 68056, true }, + { 68068, false }, + { 68081, true }, + { 68103, true }, + { 68126, true }, + { 68140, true }, + { 68155, true }, + { 68170, true }, + { 68186, true }, + { 68204, true }, + { 68214, true }, { 68234, true }, - { 68246, true }, - { 68257, true }, + { 68244, true }, + { 68255, true }, { 68273, true }, - { 68290, true }, - { 68305, true }, - { 68321, true }, - { 68336, true }, - { 68352, true }, + { 68285, true }, + { 68296, true }, + { 68312, true }, + { 68329, true }, + { 68344, true }, { 68360, true }, - { 68369, true }, - { 68386, true }, - { 68403, true }, - { 68421, true }, - { 68433, true }, - { 68450, true }, - { 68464, true }, - { 68478, true }, - { 68493, true }, - { 68508, true }, - { 68519, true }, - { 68533, true }, - { 68548, true }, - { 68563, true }, - { 68578, true }, - { 68600, true }, - { 68618, true }, + { 68375, true }, + { 68391, true }, + { 68399, true }, + { 68408, true }, + { 68425, true }, + { 68442, true }, + { 68460, true }, + { 68472, true }, + { 68489, true }, + { 68503, true }, + { 68517, true }, + { 68532, true }, + { 68547, true }, + { 68558, true }, + { 68572, true }, + { 68587, true }, + { 68602, true }, + { 68617, true }, { 68639, true }, - { 68663, true }, - { 68685, true }, - { 68697, true }, - { 68710, true }, - { 68725, true }, - { 68741, true }, - { 68755, true }, - { 68768, true }, - { 68786, true }, - { 68799, false }, - { 68820, true }, - { 68838, true }, - { 68854, true }, - { 68867, true }, - { 68882, true }, - { 68896, true }, - { 68907, true }, - { 68932, true }, - { 68948, true }, - { 68965, true }, - { 68977, true }, - { 68994, true }, - { 69006, true }, - { 69019, true }, - { 69030, true }, + { 68657, true }, + { 68678, true }, + { 68702, true }, + { 68724, true }, + { 68736, true }, + { 68749, true }, + { 68764, true }, + { 68780, true }, + { 68794, true }, + { 68807, true }, + { 68825, true }, + { 68838, false }, + { 68859, true }, + { 68877, true }, + { 68893, true }, + { 68906, true }, + { 68921, true }, + { 68935, true }, + { 68946, true }, + { 68971, true }, + { 68987, true }, + { 69004, true }, + { 69016, true }, + { 69033, true }, { 69045, true }, - { 69057, true }, - { 69068, true }, - { 69082, true }, - { 69092, true }, - { 69101, true }, - { 69108, true }, - { 69117, true }, - { 69134, true }, - { 69146, true }, - { 69155, true }, - { 69166, true }, - { 69178, true }, - { 69185, false }, - { 69192, false }, - { 69201, true }, - { 69213, true }, - { 69225, true }, - { 69235, true }, - { 69244, true }, - { 69253, true }, - { 69260, true }, - { 69272, true }, - { 69284, true }, + { 69058, true }, + { 69069, true }, + { 69084, true }, + { 69096, true }, + { 69107, true }, + { 69121, true }, + { 69131, true }, + { 69140, true }, + { 69147, true }, + { 69156, true }, + { 69173, true }, + { 69185, true }, + { 69194, true }, + { 69205, true }, + { 69217, true }, + { 69224, false }, + { 69231, false }, + { 69240, true }, + { 69252, true }, + { 69264, true }, + { 69274, true }, + { 69283, true }, { 69292, true }, - { 69304, true }, - { 69317, true }, + { 69299, true }, + { 69311, true }, + { 69323, true }, { 69331, true }, - { 69344, true }, + { 69343, true }, { 69356, true }, - { 69367, true }, - { 69382, true }, - { 69392, true }, - { 69400, true }, - { 69413, true }, - { 69425, true }, - { 69436, true }, - { 69448, true }, - { 69458, false }, - { 69476, true }, - { 69494, true }, - { 69516, true }, - { 69538, true }, - { 69549, true }, - { 69561, true }, - { 69576, true }, - { 69587, true }, - { 69603, true }, + { 69370, true }, + { 69383, true }, + { 69395, true }, + { 69406, true }, + { 69421, true }, + { 69431, true }, + { 69439, true }, + { 69452, true }, + { 69464, true }, + { 69475, true }, + { 69487, true }, + { 69497, false }, + { 69515, true }, + { 69533, true }, + { 69555, true }, + { 69577, true }, + { 69588, true }, + { 69600, true }, + { 69615, true }, { 69626, true }, - { 69644, true }, - { 69655, true }, - { 69673, true }, - { 69700, true }, - { 69720, true }, - { 69732, true }, - { 69750, true }, - { 69764, true }, - { 69780, true }, - { 69796, true }, - { 69809, true }, - { 69823, true }, - { 69837, true }, - { 69851, true }, + { 69642, true }, + { 69665, true }, + { 69683, true }, + { 69694, true }, + { 69712, true }, + { 69739, true }, + { 69759, true }, + { 69771, true }, + { 69789, true }, + { 69803, true }, + { 69819, true }, + { 69835, true }, + { 69848, true }, { 69862, true }, - { 69886, true }, - { 69914, false }, + { 69876, true }, + { 69890, true }, + { 69901, true }, { 69925, true }, - { 69943, true }, - { 69961, true }, - { 69985, true }, - { 70006, true }, - { 70027, true }, - { 70048, true }, - { 70062, true }, - { 70075, true }, - { 70094, true }, - { 70112, true }, - { 70122, true }, - { 70140, true }, - { 70158, true }, + { 69953, false }, + { 69964, true }, + { 69982, true }, + { 70000, true }, + { 70024, true }, + { 70045, true }, + { 70066, true }, + { 70087, true }, + { 70101, true }, + { 70114, true }, + { 70133, true }, + { 70151, true }, + { 70161, true }, { 70179, true }, - { 70192, true }, - { 70212, true }, - { 70222, true }, - { 70238, true }, - { 70252, true }, - { 70268, true }, - { 70279, true }, - { 70290, true }, - { 70300, true }, - { 70310, true }, - { 70327, true }, - { 70341, false }, - { 70354, true }, + { 70197, true }, + { 70218, true }, + { 70231, true }, + { 70251, true }, + { 70261, true }, + { 70277, true }, + { 70291, true }, + { 70307, true }, + { 70318, true }, + { 70329, true }, + { 70339, true }, + { 70349, true }, { 70366, true }, - { 70377, true }, - { 70394, true }, - { 70404, true }, - { 70418, true }, - { 70435, true }, - { 70454, true }, - { 70472, true }, - { 70483, true }, - { 70494, true }, - { 70505, true }, - { 70516, true }, - { 70527, true }, - { 70538, true }, - { 70549, true }, - { 70569, true }, - { 70582, true }, - { 70595, true }, - { 70613, true }, - { 70626, true }, - { 70636, true }, - { 70651, true }, + { 70380, false }, + { 70393, true }, + { 70405, true }, + { 70416, true }, + { 70433, true }, + { 70443, true }, + { 70457, true }, + { 70474, true }, + { 70493, true }, + { 70511, true }, + { 70522, true }, + { 70533, true }, + { 70544, true }, + { 70555, true }, + { 70566, true }, + { 70577, true }, + { 70588, true }, + { 70608, true }, + { 70621, true }, + { 70634, true }, + { 70652, true }, { 70665, true }, - { 70683, true }, - { 70698, true }, - { 70711, true }, - { 70728, true }, - { 70745, true }, - { 70758, true }, - { 70772, true }, - { 70781, true }, - { 70800, true }, + { 70675, true }, + { 70690, true }, + { 70704, true }, + { 70722, true }, + { 70737, true }, + { 70750, true }, + { 70767, true }, + { 70784, true }, + { 70797, true }, { 70811, true }, - { 70821, true }, - { 70838, true }, - { 70847, true }, - { 70861, true }, - { 70869, true }, + { 70820, true }, + { 70839, true }, + { 70850, true }, + { 70860, true }, { 70877, true }, - { 70884, true }, - { 70891, true }, + { 70886, true }, { 70900, true }, - { 70919, true }, - { 70934, true }, - { 70955, true }, - { 70975, true }, - { 70992, true }, - { 71008, true }, - { 71028, true }, - { 71038, true }, - { 71057, true }, - { 71078, true }, - { 71091, true }, - { 71106, true }, - { 71118, true }, - { 71134, false }, - { 71148, false }, - { 71161, false }, - { 71168, true }, - { 71176, true }, - { 71188, true }, - { 71198, true }, - { 71213, true }, - { 71226, true }, - { 71241, true }, - { 71263, true }, - { 71282, true }, - { 71294, true }, - { 71305, true }, + { 70908, true }, + { 70916, true }, + { 70923, true }, + { 70930, true }, + { 70939, true }, + { 70958, true }, + { 70973, true }, + { 70994, true }, + { 71014, true }, + { 71031, true }, + { 71047, true }, + { 71067, true }, + { 71077, true }, + { 71096, true }, + { 71117, true }, + { 71130, true }, + { 71145, true }, + { 71157, true }, + { 71173, false }, + { 71187, false }, + { 71200, false }, + { 71207, true }, + { 71215, true }, + { 71227, true }, + { 71237, true }, + { 71252, true }, + { 71265, true }, + { 71280, true }, + { 71302, true }, { 71321, true }, - { 71337, true }, - { 71355, true }, - { 71373, true }, - { 71387, true }, - { 71397, true }, - { 71404, true }, - { 71415, true }, - { 71427, false }, - { 71447, false }, - { 71463, true }, - { 71474, true }, - { 71489, true }, + { 71333, true }, + { 71344, true }, + { 71360, true }, + { 71376, true }, + { 71394, true }, + { 71412, true }, + { 71426, true }, + { 71436, true }, + { 71443, true }, + { 71454, true }, + { 71466, false }, + { 71486, false }, { 71502, true }, - { 71515, true }, - { 71527, true }, - { 71544, false }, + { 71513, true }, + { 71528, true }, + { 71541, true }, { 71554, true }, - { 71565, true }, - { 71580, true }, - { 71596, true }, - { 71625, true }, - { 71644, true }, - { 71658, true }, - { 71675, true }, - { 71701, true }, - { 71716, true }, - { 71731, true }, - { 71746, true }, - { 71760, true }, - { 71779, true }, - { 71804, true }, + { 71566, true }, + { 71583, false }, + { 71593, true }, + { 71604, true }, + { 71619, true }, + { 71635, true }, + { 71664, true }, + { 71683, true }, + { 71697, true }, + { 71714, true }, + { 71740, true }, + { 71755, true }, + { 71770, true }, + { 71785, true }, + { 71799, true }, { 71818, true }, - { 71834, true }, - { 71855, true }, - { 71889, true }, - { 71913, true }, - { 71942, false }, - { 71957, true }, - { 71973, true }, - { 71998, true }, - { 72010, true }, - { 72024, true }, - { 72033, true }, - { 72053, false }, + { 71843, true }, + { 71857, true }, + { 71873, true }, + { 71894, true }, + { 71928, true }, + { 71952, true }, + { 71981, false }, + { 71996, true }, + { 72012, true }, + { 72037, true }, + { 72049, true }, { 72063, true }, - { 72078, true }, - { 72086, true }, - { 72095, true }, - { 72103, true }, - { 72119, true }, - { 72141, true }, - { 72153, true }, - { 72165, true }, - { 72173, true }, - { 72184, true }, - { 72194, false }, - { 72206, true }, - { 72215, true }, - { 72231, true }, - { 72247, true }, - { 72261, true }, - { 72276, true }, - { 72290, true }, - { 72301, true }, - { 72316, true }, - { 72331, true }, - { 72342, false }, - { 72354, true }, - { 72363, true }, - { 72377, true }, - { 72388, true }, - { 72398, true }, - { 72415, true }, - { 72433, true }, - { 72443, true }, - { 72466, true }, - { 72480, true }, - { 72496, true }, - { 72515, true }, - { 72528, true }, - { 72545, true }, - { 72563, true }, - { 72576, true }, - { 72590, true }, - { 72600, true }, - { 72611, true }, - { 72620, true }, - { 72636, true }, - { 72643, true }, - { 72664, false }, - { 72679, true }, - { 72694, true }, - { 72711, true }, + { 72072, true }, + { 72092, false }, + { 72102, true }, + { 72117, true }, + { 72125, true }, + { 72134, true }, + { 72142, true }, + { 72158, true }, + { 72180, true }, + { 72192, true }, + { 72204, true }, + { 72212, true }, + { 72223, true }, + { 72233, false }, + { 72245, true }, + { 72254, true }, + { 72270, true }, + { 72286, true }, + { 72300, true }, + { 72315, true }, + { 72329, true }, + { 72340, true }, + { 72355, true }, + { 72370, true }, + { 72381, false }, + { 72393, true }, + { 72402, true }, + { 72416, true }, + { 72427, true }, + { 72437, true }, + { 72454, true }, + { 72472, true }, + { 72482, true }, + { 72505, true }, + { 72519, true }, + { 72535, true }, + { 72554, true }, + { 72571, true }, + { 72589, true }, + { 72602, true }, + { 72616, true }, + { 72626, true }, + { 72637, true }, + { 72646, true }, + { 72662, true }, + { 72669, true }, + { 72690, false }, + { 72705, true }, { 72720, true }, - { 72729, true }, - { 72741, true }, - { 72759, true }, - { 72769, true }, - { 72782, true }, - { 72793, true }, - { 72808, true }, + { 72737, true }, + { 72748, true }, + { 72757, true }, + { 72766, true }, + { 72778, true }, + { 72796, true }, + { 72806, true }, { 72819, true }, - { 72835, true }, - { 72848, true }, - { 72858, true }, - { 72874, true }, - { 72896, true }, - { 72908, true }, - { 72921, true }, - { 72935, true }, - { 72948, true }, - { 72963, true }, - { 72977, true }, - { 72993, true }, - { 73004, false }, - { 73017, true }, - { 73029, false }, - { 73042, true }, + { 72830, true }, + { 72845, true }, + { 72856, true }, + { 72872, true }, + { 72885, true }, + { 72895, true }, + { 72911, true }, + { 72933, true }, + { 72945, true }, + { 72958, true }, + { 72972, true }, + { 72985, true }, + { 73000, true }, + { 73014, true }, + { 73030, true }, + { 73041, false }, { 73054, true }, - { 73071, true }, - { 73078, true }, - { 73094, true }, - { 73106, true }, - { 73119, true }, - { 73135, true }, - { 73146, true }, - { 73166, false }, - { 73174, true }, - { 73186, true }, - { 73197, true }, - { 73216, false }, - { 73236, true }, - { 73245, true }, - { 73256, true }, - { 73287, true }, - { 73301, true }, - { 73315, true }, - { 73335, true }, - { 73354, true }, - { 73370, true }, - { 73385, true }, - { 73399, true }, - { 73421, true }, - { 73429, true }, - { 73442, true }, - { 73453, true }, - { 73465, true }, - { 73477, true }, - { 73493, true }, - { 73504, true }, - { 73529, true }, - { 73545, true }, - { 73561, true }, - { 73577, true }, - { 73596, true }, - { 73620, true }, - { 73636, true }, - { 73652, false }, - { 73665, true }, - { 73675, true }, - { 73687, true }, - { 73699, true }, - { 73714, true }, - { 73734, true }, - { 73754, true }, - { 73775, false }, + { 73066, false }, + { 73079, true }, + { 73091, true }, + { 73108, true }, + { 73115, true }, + { 73131, true }, + { 73143, true }, + { 73156, true }, + { 73172, true }, + { 73183, true }, + { 73203, false }, + { 73211, true }, + { 73223, true }, + { 73234, true }, + { 73253, false }, + { 73273, true }, + { 73282, true }, + { 73293, true }, + { 73324, true }, + { 73338, true }, + { 73352, true }, + { 73372, true }, + { 73391, true }, + { 73407, true }, + { 73422, true }, + { 73436, true }, + { 73458, true }, + { 73466, true }, + { 73479, true }, + { 73490, true }, + { 73502, true }, + { 73514, true }, + { 73530, true }, + { 73541, true }, + { 73566, true }, + { 73582, true }, + { 73598, true }, + { 73614, true }, + { 73633, true }, + { 73657, true }, + { 73673, true }, + { 73689, false }, + { 73702, true }, + { 73712, true }, + { 73724, true }, + { 73736, true }, + { 73751, true }, + { 73771, true }, { 73791, true }, - { 73809, true }, - { 73820, true }, - { 73835, true }, - { 73847, false }, - { 73855, true }, - { 73869, true }, - { 73883, true }, - { 73895, true }, - { 73909, true }, - { 73921, true }, - { 73935, true }, - { 73948, true }, - { 73966, true }, - { 73982, true }, - { 74002, true }, - { 74033, true }, - { 74064, true }, - { 74086, true }, - { 74104, true }, - { 74118, true }, - { 74140, true }, - { 74155, true }, - { 74174, true }, - { 74183, true }, - { 74193, true }, - { 74208, true }, - { 74223, true }, - { 74238, true }, - { 74255, true }, - { 74268, true }, - { 74281, true }, - { 74291, true }, - { 74301, true }, - { 74324, true }, + { 73812, false }, + { 73828, true }, + { 73846, true }, + { 73857, true }, + { 73872, true }, + { 73884, false }, + { 73892, true }, + { 73906, true }, + { 73920, true }, + { 73932, true }, + { 73946, true }, + { 73959, true }, + { 73977, true }, + { 73993, true }, + { 74013, true }, + { 74044, true }, + { 74075, true }, + { 74097, true }, + { 74115, true }, + { 74129, true }, + { 74151, true }, + { 74166, true }, + { 74185, true }, + { 74194, true }, + { 74204, true }, + { 74219, true }, + { 74234, true }, + { 74249, true }, + { 74266, true }, + { 74279, true }, + { 74292, true }, + { 74302, true }, + { 74312, true }, { 74335, true }, - { 74347, true }, - { 74364, true }, - { 74381, true }, - { 74396, true }, - { 74403, true }, - { 74416, true }, - { 74433, true }, - { 74443, true }, - { 74452, true }, - { 74471, true }, - { 74489, true }, - { 74510, true }, - { 74530, true }, - { 74543, true }, - { 74560, true }, - { 74573, true }, - { 74595, true }, - { 74607, true }, - { 74623, true }, - { 74633, true }, - { 74646, true }, - { 74668, true }, - { 74682, true }, - { 74704, true }, - { 74721, true }, - { 74735, true }, - { 74743, true }, - { 74755, true }, - { 74770, true }, - { 74780, true }, + { 74346, true }, + { 74358, true }, + { 74375, true }, + { 74392, true }, + { 74407, true }, + { 74414, true }, + { 74427, true }, + { 74444, true }, + { 74454, true }, + { 74463, true }, + { 74482, true }, + { 74500, true }, + { 74521, true }, + { 74541, true }, + { 74554, true }, + { 74571, true }, + { 74584, true }, + { 74606, true }, + { 74618, true }, + { 74634, true }, + { 74644, true }, + { 74657, true }, + { 74679, true }, + { 74693, true }, + { 74715, true }, + { 74732, true }, + { 74746, true }, + { 74754, true }, + { 74766, true }, + { 74781, true }, { 74791, true }, - { 74803, true }, + { 74802, true }, { 74814, true }, - { 74823, true }, - { 74833, true }, - { 74855, true }, - { 74867, true }, - { 74885, true }, + { 74825, true }, + { 74834, true }, + { 74844, true }, + { 74866, true }, + { 74878, true }, { 74896, true }, - { 74911, true }, - { 74924, true }, - { 74938, true }, - { 74954, true }, - { 74969, true }, - { 74981, true }, - { 74991, true }, - { 75009, true }, + { 74907, true }, + { 74922, true }, + { 74935, true }, + { 74949, true }, + { 74965, true }, + { 74980, true }, + { 74992, true }, + { 75002, true }, { 75020, true }, - { 75028, true }, + { 75031, true }, { 75039, true }, - { 75053, true }, - { 75068, true }, - { 75081, true }, + { 75050, true }, + { 75064, true }, + { 75079, true }, { 75092, true }, - { 75103, false }, - { 75119, true }, - { 75132, true }, - { 75153, true }, - { 75168, true }, + { 75103, true }, + { 75114, false }, + { 75130, true }, + { 75143, true }, + { 75164, true }, { 75179, true }, - { 75195, true }, - { 75213, true }, - { 75234, true }, - { 75246, true }, - { 75255, true }, - { 75268, true }, - { 75286, true }, - { 75295, true }, + { 75190, true }, + { 75206, true }, + { 75224, true }, + { 75245, true }, + { 75257, true }, + { 75266, true }, + { 75279, true }, + { 75297, true }, { 75306, true }, - { 75318, false }, - { 75336, true }, - { 75354, true }, - { 75373, true }, - { 75392, true }, - { 75406, true }, - { 75426, true }, - { 75446, true }, - { 75458, true }, - { 75471, true }, - { 75483, true }, - { 75502, true }, - { 75519, true }, - { 75531, true }, - { 75544, true }, - { 75559, true }, - { 75569, true }, - { 75579, true }, - { 75589, true }, - { 75601, true }, - { 75610, true }, - { 75625, true }, - { 75640, true }, - { 75649, true }, - { 75662, true }, - { 75689, true }, - { 75697, true }, - { 75718, true }, - { 75732, true }, - { 75742, true }, - { 75750, true }, - { 75759, true }, - { 75768, true }, - { 75781, true }, - { 75798, true }, - { 75810, true }, - { 75818, true }, - { 75839, true }, - { 75858, true }, - { 75870, true }, - { 75888, true }, - { 75900, true }, + { 75317, true }, + { 75329, false }, + { 75347, true }, + { 75365, true }, + { 75384, true }, + { 75403, true }, + { 75417, true }, + { 75437, true }, + { 75457, true }, + { 75469, true }, + { 75482, true }, + { 75494, true }, + { 75513, true }, + { 75530, true }, + { 75542, true }, + { 75555, true }, + { 75570, true }, + { 75580, true }, + { 75590, true }, + { 75600, true }, + { 75612, true }, + { 75621, true }, + { 75636, true }, + { 75651, true }, + { 75660, true }, + { 75673, true }, + { 75700, true }, + { 75708, true }, + { 75729, true }, + { 75743, true }, + { 75753, true }, + { 75761, true }, + { 75770, true }, + { 75779, true }, + { 75792, true }, + { 75809, true }, + { 75821, true }, + { 75829, true }, + { 75850, true }, + { 75869, true }, + { 75881, true }, + { 75899, true }, { 75911, true }, - { 75923, true }, - { 75932, true }, - { 75941, true }, - { 75948, true }, - { 75956, true }, - { 75970, true }, + { 75922, true }, + { 75934, true }, + { 75943, true }, + { 75952, true }, + { 75959, true }, + { 75967, true }, { 75981, true }, { 75992, true }, - { 76007, true }, + { 76003, true }, { 76018, true }, - { 76031, false }, - { 76041, true }, - { 76055, true }, - { 76075, true }, - { 76090, true }, - { 76103, true }, - { 76115, true }, - { 76130, true }, - { 76143, true }, - { 76170, true }, - { 76184, true }, - { 76201, true }, - { 76221, true }, - { 76236, true }, - { 76248, true }, - { 76258, true }, - { 76271, true }, - { 76288, true }, - { 76301, true }, - { 76311, true }, - { 76338, true }, - { 76354, true }, - { 76364, true }, - { 76373, true }, - { 76380, true }, - { 76396, true }, + { 76029, true }, + { 76042, false }, + { 76052, true }, + { 76066, true }, + { 76086, true }, + { 76101, true }, + { 76114, true }, + { 76126, true }, + { 76141, true }, + { 76154, true }, + { 76181, true }, + { 76195, true }, + { 76212, true }, + { 76232, true }, + { 76247, true }, + { 76259, true }, + { 76269, true }, + { 76282, true }, + { 76299, true }, + { 76312, true }, + { 76322, true }, + { 76349, true }, + { 76365, true }, + { 76375, true }, + { 76384, true }, + { 76391, true }, { 76407, true }, { 76418, true }, - { 76432, true }, + { 76429, true }, { 76443, true }, - { 76453, true }, - { 76474, true }, - { 76482, true }, - { 76494, true }, - { 76517, true }, - { 76531, true }, - { 76550, true }, - { 76558, true }, - { 76568, true }, - { 76577, true }, - { 76595, true }, - { 76627, true }, - { 76643, true }, - { 76664, true }, - { 76681, true }, + { 76454, true }, + { 76464, true }, + { 76485, true }, + { 76493, true }, + { 76505, true }, + { 76528, true }, + { 76542, true }, + { 76561, true }, + { 76569, true }, + { 76579, true }, + { 76588, true }, + { 76606, true }, + { 76638, true }, + { 76654, true }, + { 76675, true }, { 76692, true }, { 76712, true }, { 76725, true }, @@ -19848,8928 +19848,8936 @@ static const nsSTSPreload kSTSPreloadList[] = { { 79216, true }, { 79236, true }, { 79248, true }, - { 79261, true }, - { 79276, true }, - { 79287, true }, - { 79304, true }, - { 79316, true }, - { 79328, true }, - { 79337, true }, - { 79354, true }, - { 79375, true }, - { 79390, true }, - { 79408, true }, - { 79424, true }, - { 79445, true }, - { 79459, true }, - { 79473, true }, - { 79484, true }, - { 79495, true }, - { 79511, true }, - { 79523, true }, - { 79535, true }, - { 79546, true }, - { 79560, true }, - { 79569, true }, - { 79578, true }, - { 79593, true }, - { 79602, true }, - { 79610, true }, - { 79621, true }, - { 79632, true }, - { 79646, true }, - { 79661, true }, - { 79679, true }, - { 79693, true }, - { 79703, true }, - { 79713, true }, - { 79722, true }, - { 79734, true }, - { 79754, true }, - { 79777, true }, - { 79792, true }, - { 79815, true }, + { 79263, true }, + { 79274, true }, + { 79291, true }, + { 79303, true }, + { 79315, true }, + { 79324, true }, + { 79341, true }, + { 79362, true }, + { 79377, true }, + { 79395, true }, + { 79411, true }, + { 79432, true }, + { 79446, true }, + { 79460, true }, + { 79471, true }, + { 79482, true }, + { 79498, true }, + { 79510, true }, + { 79522, true }, + { 79533, true }, + { 79547, true }, + { 79556, true }, + { 79565, true }, + { 79580, true }, + { 79589, true }, + { 79597, true }, + { 79608, true }, + { 79619, true }, + { 79633, true }, + { 79648, true }, + { 79666, true }, + { 79680, true }, + { 79690, true }, + { 79700, true }, + { 79709, true }, + { 79721, true }, + { 79741, true }, + { 79764, true }, + { 79779, true }, + { 79802, true }, + { 79810, true }, { 79823, true }, - { 79836, true }, - { 79848, true }, - { 79860, true }, - { 79870, true }, - { 79879, false }, - { 79888, false }, - { 79897, false }, - { 79906, true }, - { 79925, true }, - { 79948, true }, - { 79963, true }, - { 79977, true }, - { 79992, true }, + { 79835, true }, + { 79847, true }, + { 79857, true }, + { 79866, false }, + { 79875, false }, + { 79884, false }, + { 79893, true }, + { 79912, true }, + { 79935, true }, + { 79950, true }, + { 79964, true }, + { 79979, true }, + { 79998, true }, { 80011, true }, - { 80024, true }, + { 80027, true }, { 80040, true }, - { 80053, true }, - { 80070, true }, - { 80085, true }, - { 80095, true }, - { 80111, false }, - { 80130, true }, - { 80145, true }, - { 80164, true }, - { 80172, true }, - { 80186, true }, - { 80200, true }, - { 80217, false }, + { 80057, true }, + { 80072, true }, + { 80082, true }, + { 80098, false }, + { 80117, true }, + { 80132, true }, + { 80151, true }, + { 80159, true }, + { 80173, true }, + { 80187, true }, + { 80204, false }, + { 80224, true }, { 80237, true }, - { 80250, true }, - { 80262, true }, - { 80277, true }, - { 80295, true }, - { 80306, true }, - { 80316, true }, + { 80249, true }, + { 80264, true }, + { 80282, true }, + { 80293, true }, + { 80303, true }, + { 80317, true }, { 80330, true }, - { 80343, true }, - { 80358, true }, - { 80383, true }, - { 80409, true }, - { 80424, true }, - { 80436, true }, - { 80461, true }, - { 80468, true }, - { 80476, true }, - { 80487, true }, - { 80503, true }, - { 80520, true }, - { 80534, true }, - { 80548, true }, - { 80564, true }, - { 80591, true }, - { 80605, true }, + { 80345, true }, + { 80370, true }, + { 80396, true }, + { 80411, true }, + { 80423, true }, + { 80448, true }, + { 80455, true }, + { 80463, true }, + { 80474, true }, + { 80490, true }, + { 80507, true }, + { 80521, true }, + { 80535, true }, + { 80551, true }, + { 80578, true }, + { 80592, true }, + { 80601, true }, { 80614, true }, - { 80627, true }, - { 80639, true }, - { 80662, true }, - { 80682, true }, - { 80701, true }, - { 80723, false }, - { 80734, true }, - { 80748, true }, - { 80768, true }, - { 80793, true }, - { 80809, true }, - { 80821, true }, - { 80833, true }, - { 80855, true }, - { 80870, true }, - { 80885, true }, - { 80902, true }, - { 80917, true }, - { 80934, true }, - { 80949, true }, - { 80964, true }, - { 80976, true }, - { 80990, false }, - { 81000, true }, - { 81017, true }, - { 81028, false }, - { 81043, true }, - { 81060, true }, + { 80626, true }, + { 80649, true }, + { 80669, true }, + { 80688, true }, + { 80710, false }, + { 80721, true }, + { 80735, true }, + { 80755, true }, + { 80780, true }, + { 80796, true }, + { 80808, true }, + { 80820, true }, + { 80842, true }, + { 80857, true }, + { 80872, true }, + { 80889, true }, + { 80904, true }, + { 80921, true }, + { 80936, true }, + { 80951, true }, + { 80963, true }, + { 80977, false }, + { 80987, true }, + { 81004, true }, + { 81015, false }, + { 81030, true }, + { 81047, true }, + { 81061, true }, { 81074, true }, - { 81087, true }, - { 81099, true }, - { 81109, true }, - { 81121, true }, - { 81136, true }, - { 81147, true }, - { 81167, true }, - { 81179, true }, - { 81191, true }, - { 81202, true }, - { 81227, true }, - { 81236, true }, - { 81244, true }, - { 81267, true }, - { 81284, true }, - { 81295, true }, - { 81311, false }, - { 81323, true }, - { 81338, true }, - { 81346, true }, - { 81356, true }, - { 81371, true }, - { 81385, true }, - { 81395, true }, - { 81413, true }, - { 81437, true }, - { 81449, true }, - { 81477, true }, - { 81489, true }, - { 81505, true }, - { 81517, true }, - { 81545, true }, - { 81559, true }, - { 81575, true }, - { 81592, true }, - { 81606, true }, - { 81623, true }, - { 81645, true }, - { 81655, true }, - { 81673, true }, - { 81692, true }, - { 81711, true }, - { 81736, true }, - { 81755, true }, - { 81769, true }, - { 81782, true }, - { 81811, true }, - { 81841, true }, - { 81853, true }, - { 81862, true }, - { 81875, true }, - { 81886, true }, - { 81896, true }, - { 81912, true }, - { 81929, true }, - { 81952, true }, - { 81978, true }, - { 81992, true }, - { 82006, true }, - { 82030, false }, - { 82040, true }, - { 82056, true }, - { 82064, true }, - { 82083, true }, - { 82095, true }, - { 82106, true }, - { 82122, true }, - { 82136, true }, - { 82148, true }, - { 82161, true }, - { 82180, true }, - { 82191, true }, - { 82203, true }, - { 82216, true }, - { 82230, true }, - { 82240, true }, - { 82253, true }, - { 82265, true }, - { 82281, true }, - { 82289, false }, - { 82297, true }, - { 82319, true }, - { 82331, true }, - { 82339, true }, - { 82360, true }, - { 82384, true }, - { 82400, true }, - { 82414, true }, - { 82431, true }, - { 82443, true }, - { 82453, true }, - { 82468, true }, - { 82478, true }, - { 82501, true }, - { 82515, true }, - { 82530, true }, - { 82542, true }, - { 82551, true }, - { 82564, true }, - { 82579, true }, - { 82593, true }, - { 82605, true }, - { 82620, false }, - { 82637, true }, - { 82648, true }, - { 82658, true }, - { 82672, true }, - { 82681, true }, - { 82689, true }, - { 82699, true }, - { 82724, true }, - { 82733, true }, - { 82741, true }, - { 82749, true }, - { 82758, true }, - { 82770, true }, - { 82782, true }, - { 82792, true }, - { 82802, true }, - { 82816, true }, - { 82828, true }, - { 82842, true }, - { 82857, true }, - { 82868, true }, - { 82882, true }, - { 82893, true }, - { 82901, true }, - { 82912, true }, - { 82923, true }, + { 81086, true }, + { 81096, true }, + { 81108, true }, + { 81123, true }, + { 81134, true }, + { 81154, true }, + { 81166, true }, + { 81178, true }, + { 81189, true }, + { 81214, true }, + { 81223, true }, + { 81231, true }, + { 81254, true }, + { 81271, true }, + { 81282, true }, + { 81298, false }, + { 81310, true }, + { 81325, true }, + { 81333, true }, + { 81343, true }, + { 81358, true }, + { 81372, true }, + { 81382, true }, + { 81400, true }, + { 81424, true }, + { 81436, true }, + { 81464, true }, + { 81476, true }, + { 81492, true }, + { 81504, true }, + { 81518, true }, + { 81546, true }, + { 81560, true }, + { 81576, true }, + { 81593, true }, + { 81607, true }, + { 81624, true }, + { 81646, true }, + { 81656, true }, + { 81674, true }, + { 81693, false }, + { 81712, true }, + { 81737, true }, + { 81756, false }, + { 81770, true }, + { 81783, true }, + { 81812, true }, + { 81842, true }, + { 81854, true }, + { 81863, true }, + { 81876, true }, + { 81887, true }, + { 81897, true }, + { 81913, true }, + { 81930, true }, + { 81953, true }, + { 81979, true }, + { 81993, true }, + { 82007, true }, + { 82031, false }, + { 82041, true }, + { 82057, true }, + { 82065, true }, + { 82084, true }, + { 82096, true }, + { 82107, true }, + { 82123, true }, + { 82137, true }, + { 82149, true }, + { 82162, true }, + { 82181, true }, + { 82192, true }, + { 82204, true }, + { 82217, true }, + { 82231, true }, + { 82241, true }, + { 82254, true }, + { 82266, true }, + { 82282, true }, + { 82290, false }, + { 82298, true }, + { 82320, true }, + { 82332, true }, + { 82340, true }, + { 82361, true }, + { 82385, true }, + { 82401, true }, + { 82415, true }, + { 82432, true }, + { 82444, true }, + { 82454, true }, + { 82469, true }, + { 82479, true }, + { 82502, true }, + { 82516, true }, + { 82531, true }, + { 82543, true }, + { 82552, true }, + { 82565, true }, + { 82580, true }, + { 82594, true }, + { 82606, true }, + { 82621, false }, + { 82638, true }, + { 82649, true }, + { 82660, true }, + { 82670, true }, + { 82684, true }, + { 82693, true }, + { 82701, true }, + { 82711, true }, + { 82720, true }, + { 82728, true }, + { 82736, true }, + { 82745, true }, + { 82757, true }, + { 82769, true }, + { 82779, true }, + { 82789, true }, + { 82803, true }, + { 82815, true }, + { 82829, true }, + { 82844, true }, + { 82855, true }, + { 82869, true }, + { 82880, true }, + { 82888, true }, + { 82899, true }, + { 82910, true }, + { 82925, true }, { 82938, true }, - { 82951, true }, - { 82958, true }, - { 82978, true }, + { 82945, true }, + { 82965, true }, + { 82974, true }, { 82987, true }, - { 83000, true }, - { 83017, true }, - { 83032, true }, - { 83047, true }, - { 83067, true }, - { 83076, true }, - { 83088, false }, - { 83097, true }, - { 83107, true }, - { 83117, false }, - { 83124, true }, + { 83004, true }, + { 83019, true }, + { 83034, true }, + { 83054, true }, + { 83063, true }, + { 83075, false }, + { 83084, true }, + { 83094, true }, + { 83104, false }, + { 83111, true }, + { 83122, true }, { 83135, true }, - { 83148, true }, - { 83163, true }, - { 83184, true }, - { 83191, true }, - { 83211, true }, - { 83221, true }, + { 83150, true }, + { 83171, true }, + { 83178, true }, + { 83198, true }, + { 83208, true }, + { 83219, true }, { 83232, true }, - { 83245, true }, - { 83259, true }, - { 83268, true }, - { 83284, true }, - { 83293, false }, - { 83302, true }, - { 83310, true }, - { 83322, true }, - { 83329, true }, - { 83347, true }, - { 83359, true }, + { 83246, true }, + { 83255, true }, + { 83271, true }, + { 83280, false }, + { 83289, true }, + { 83297, true }, + { 83309, true }, + { 83316, true }, + { 83334, true }, + { 83346, true }, + { 83365, true }, { 83378, true }, - { 83391, true }, - { 83407, true }, - { 83420, false }, - { 83429, true }, - { 83438, true }, - { 83449, true }, - { 83469, true }, - { 83486, true }, - { 83501, true }, - { 83517, false }, - { 83532, true }, - { 83551, true }, - { 83562, true }, - { 83579, false }, - { 83600, false }, - { 83616, false }, - { 83636, true }, - { 83648, true }, - { 83671, true }, + { 83394, true }, + { 83407, false }, + { 83416, true }, + { 83425, true }, + { 83436, true }, + { 83456, true }, + { 83473, true }, + { 83488, true }, + { 83504, false }, + { 83519, true }, + { 83538, true }, + { 83549, true }, + { 83566, false }, + { 83587, false }, + { 83603, false }, + { 83623, true }, + { 83635, true }, + { 83658, true }, + { 83670, true }, { 83683, true }, - { 83696, true }, - { 83708, true }, - { 83719, true }, - { 83731, true }, - { 83741, true }, - { 83750, true }, - { 83761, true }, - { 83779, true }, - { 83806, true }, - { 83816, true }, - { 83824, true }, - { 83838, true }, - { 83853, true }, - { 83863, true }, - { 83874, true }, - { 83883, true }, - { 83897, true }, + { 83695, true }, + { 83706, true }, + { 83718, true }, + { 83728, true }, + { 83737, true }, + { 83748, true }, + { 83766, true }, + { 83793, true }, + { 83803, true }, + { 83811, true }, + { 83825, true }, + { 83840, true }, + { 83850, true }, + { 83861, true }, + { 83870, true }, + { 83884, true }, + { 83903, true }, { 83916, true }, - { 83929, true }, - { 83939, true }, - { 83947, true }, + { 83926, true }, + { 83934, true }, + { 83941, true }, { 83954, true }, - { 83967, true }, - { 83977, true }, - { 83986, false }, - { 83996, true }, - { 84005, true }, - { 84017, true }, - { 84027, false }, - { 84044, true }, - { 84054, true }, - { 84062, true }, - { 84072, true }, + { 83964, true }, + { 83973, false }, + { 83983, true }, + { 83992, true }, + { 84004, true }, + { 84014, false }, + { 84031, true }, + { 84041, true }, + { 84049, true }, + { 84059, true }, + { 84069, true }, { 84082, true }, - { 84095, true }, - { 84107, true }, - { 84122, true }, - { 84134, true }, - { 84150, true }, - { 84164, true }, - { 84178, true }, - { 84185, true }, - { 84197, true }, - { 84211, true }, - { 84222, true }, - { 84231, true }, - { 84245, true }, - { 84257, true }, - { 84267, true }, - { 84277, true }, - { 84289, true }, - { 84299, true }, - { 84317, true }, + { 84094, true }, + { 84109, true }, + { 84121, true }, + { 84137, true }, + { 84151, true }, + { 84165, true }, + { 84172, true }, + { 84184, true }, + { 84198, true }, + { 84209, true }, + { 84218, true }, + { 84232, true }, + { 84244, true }, + { 84254, true }, + { 84264, true }, + { 84276, true }, + { 84286, true }, + { 84304, true }, + { 84319, true }, { 84332, true }, - { 84345, true }, - { 84352, true }, - { 84369, true }, - { 84380, true }, - { 84390, true }, - { 84400, true }, - { 84409, true }, - { 84431, true }, - { 84450, true }, - { 84457, true }, - { 84471, true }, - { 84486, true }, - { 84510, true }, - { 84532, true }, + { 84339, true }, + { 84356, true }, + { 84367, true }, + { 84377, true }, + { 84387, true }, + { 84396, true }, + { 84418, true }, + { 84437, true }, + { 84444, true }, + { 84458, true }, + { 84473, true }, + { 84497, true }, + { 84519, true }, + { 84533, true }, { 84546, true }, - { 84559, true }, - { 84573, true }, - { 84596, true }, - { 84607, true }, - { 84616, true }, - { 84627, true }, - { 84641, true }, - { 84652, true }, - { 84664, true }, + { 84560, true }, + { 84583, true }, + { 84594, true }, + { 84603, true }, + { 84614, true }, + { 84628, true }, + { 84639, true }, + { 84651, true }, + { 84670, true }, { 84683, true }, - { 84696, true }, - { 84705, true }, - { 84720, true }, + { 84692, true }, + { 84707, true }, + { 84723, true }, { 84736, true }, - { 84749, true }, + { 84748, true }, { 84761, true }, - { 84774, true }, - { 84782, true }, - { 84794, true }, - { 84803, true }, - { 84818, true }, - { 84827, true }, - { 84839, true }, - { 84849, true }, - { 84864, true }, - { 84872, true }, - { 84887, true }, - { 84898, true }, - { 84909, true }, - { 84918, true }, - { 84932, true }, - { 84946, true }, - { 84969, true }, - { 84994, true }, - { 85013, true }, - { 85027, true }, - { 85043, true }, - { 85057, true }, - { 85073, true }, - { 85091, true }, - { 85108, true }, - { 85123, true }, - { 85138, true }, + { 84769, true }, + { 84781, true }, + { 84790, true }, + { 84805, true }, + { 84814, true }, + { 84826, true }, + { 84836, true }, + { 84851, true }, + { 84859, true }, + { 84874, true }, + { 84885, true }, + { 84896, true }, + { 84905, true }, + { 84919, true }, + { 84933, true }, + { 84956, true }, + { 84981, true }, + { 85000, true }, + { 85014, true }, + { 85030, true }, + { 85044, true }, + { 85060, true }, + { 85078, true }, + { 85095, true }, + { 85110, true }, + { 85125, true }, + { 85134, true }, { 85147, true }, - { 85160, true }, + { 85164, true }, { 85177, true }, - { 85190, true }, - { 85200, true }, - { 85211, true }, - { 85222, true }, - { 85232, true }, - { 85244, true }, - { 85265, true }, - { 85279, false }, - { 85299, false }, + { 85187, true }, + { 85198, true }, + { 85209, true }, + { 85219, true }, + { 85231, true }, + { 85252, true }, + { 85266, false }, + { 85286, false }, + { 85298, true }, { 85311, true }, - { 85324, true }, + { 85321, true }, { 85334, true }, { 85347, true }, - { 85360, true }, - { 85376, true }, - { 85393, true }, - { 85405, true }, - { 85425, true }, - { 85439, true }, - { 85453, true }, - { 85469, true }, - { 85481, true }, - { 85502, false }, - { 85516, true }, - { 85534, true }, - { 85551, true }, - { 85563, true }, - { 85583, true }, - { 85599, true }, - { 85621, true }, - { 85643, true }, - { 85662, true }, - { 85679, true }, + { 85363, true }, + { 85380, true }, + { 85392, true }, + { 85412, true }, + { 85426, false }, + { 85440, true }, + { 85456, true }, + { 85468, true }, + { 85489, false }, + { 85503, true }, + { 85521, true }, + { 85538, true }, + { 85550, true }, + { 85570, true }, + { 85586, true }, + { 85608, true }, + { 85630, true }, + { 85649, true }, + { 85666, true }, + { 85678, true }, { 85691, true }, - { 85704, true }, + { 85711, true }, { 85724, true }, - { 85737, true }, - { 85752, false }, - { 85765, true }, - { 85776, true }, - { 85792, true }, - { 85807, true }, - { 85827, true }, - { 85852, true }, - { 85868, true }, - { 85885, true }, - { 85896, true }, - { 85908, true }, - { 85922, true }, + { 85739, false }, + { 85752, true }, + { 85763, true }, + { 85779, true }, + { 85794, true }, + { 85814, true }, + { 85839, true }, + { 85855, true }, + { 85872, true }, + { 85883, true }, + { 85895, true }, + { 85909, true }, + { 85925, true }, { 85938, true }, { 85951, true }, - { 85964, true }, - { 85976, true }, - { 85993, true }, - { 86005, false }, - { 86014, false }, - { 86024, true }, - { 86035, true }, - { 86048, false }, - { 86061, true }, - { 86072, true }, - { 86086, true }, - { 86102, true }, + { 85963, true }, + { 85980, true }, + { 85992, false }, + { 86001, false }, + { 86011, true }, + { 86022, true }, + { 86035, false }, + { 86048, true }, + { 86059, true }, + { 86073, true }, + { 86089, true }, + { 86108, true }, { 86121, true }, - { 86134, true }, - { 86157, true }, - { 86171, true }, - { 86186, true }, + { 86144, true }, + { 86158, true }, + { 86173, true }, + { 86183, true }, { 86196, true }, - { 86209, true }, - { 86224, true }, - { 86243, true }, - { 86259, true }, - { 86275, true }, + { 86211, true }, + { 86230, true }, + { 86246, true }, + { 86262, true }, + { 86279, true }, { 86292, true }, - { 86305, true }, + { 86304, true }, { 86317, true }, - { 86330, true }, - { 86342, true }, - { 86357, true }, - { 86374, true }, - { 86383, true }, - { 86410, true }, - { 86431, true }, - { 86448, true }, - { 86459, false }, - { 86477, true }, - { 86492, true }, - { 86504, true }, - { 86516, true }, - { 86528, true }, - { 86547, true }, - { 86582, true }, - { 86605, true }, + { 86329, true }, + { 86344, true }, + { 86361, true }, + { 86370, true }, + { 86397, true }, + { 86418, true }, + { 86435, true }, + { 86446, false }, + { 86464, true }, + { 86479, true }, + { 86491, true }, + { 86503, true }, + { 86515, true }, + { 86534, true }, + { 86569, true }, + { 86592, true }, + { 86609, true }, { 86622, true }, - { 86635, true }, - { 86647, true }, - { 86664, false }, - { 86683, true }, - { 86701, true }, - { 86732, true }, - { 86747, true }, - { 86769, true }, - { 86781, true }, - { 86798, true }, - { 86815, true }, - { 86834, true }, - { 86846, true }, - { 86861, true }, - { 86878, true }, - { 86895, true }, - { 86911, true }, - { 86927, true }, - { 86951, true }, - { 86976, true }, - { 86998, true }, - { 87025, true }, - { 87043, true }, - { 87060, true }, - { 87075, true }, - { 87093, true }, - { 87114, true }, - { 87142, true }, - { 87166, true }, - { 87190, true }, + { 86634, true }, + { 86651, false }, + { 86670, true }, + { 86688, true }, + { 86719, true }, + { 86734, true }, + { 86756, true }, + { 86768, true }, + { 86785, true }, + { 86802, true }, + { 86821, true }, + { 86833, true }, + { 86848, true }, + { 86865, true }, + { 86882, true }, + { 86898, true }, + { 86914, true }, + { 86938, true }, + { 86963, true }, + { 86985, true }, + { 87012, true }, + { 87030, true }, + { 87047, true }, + { 87062, true }, + { 87080, true }, + { 87101, true }, + { 87129, true }, + { 87153, true }, + { 87177, true }, + { 87190, false }, { 87203, true }, - { 87216, true }, - { 87233, true }, - { 87248, true }, - { 87273, false }, - { 87287, true }, - { 87297, true }, - { 87316, true }, - { 87332, true }, - { 87356, true }, - { 87371, true }, - { 87388, true }, - { 87398, true }, - { 87408, true }, + { 87220, true }, + { 87235, true }, + { 87260, false }, + { 87274, true }, + { 87284, true }, + { 87303, true }, + { 87319, true }, + { 87343, true }, + { 87358, true }, + { 87375, true }, + { 87385, true }, + { 87395, true }, + { 87407, true }, { 87420, true }, { 87433, true }, - { 87446, true }, + { 87451, true }, { 87464, true }, - { 87477, true }, - { 87491, true }, + { 87478, true }, + { 87488, true }, { 87501, true }, - { 87514, true }, + { 87517, true }, { 87530, true }, - { 87543, true }, - { 87562, true }, - { 87580, true }, - { 87594, true }, - { 87604, false }, - { 87616, true }, - { 87624, true }, - { 87634, true }, - { 87644, true }, - { 87656, false }, - { 87669, true }, - { 87677, true }, - { 87688, true }, - { 87699, true }, - { 87707, true }, - { 87723, true }, - { 87735, true }, - { 87751, true }, - { 87758, true }, - { 87766, true }, - { 87776, true }, - { 87788, true }, - { 87802, true }, - { 87811, true }, - { 87827, true }, - { 87837, false }, - { 87855, true }, - { 87867, true }, - { 87879, false }, + { 87549, true }, + { 87567, true }, + { 87581, true }, + { 87591, false }, + { 87603, true }, + { 87611, true }, + { 87621, true }, + { 87631, true }, + { 87643, false }, + { 87656, true }, + { 87664, true }, + { 87675, true }, + { 87686, true }, + { 87694, true }, + { 87710, true }, + { 87722, true }, + { 87738, true }, + { 87745, true }, + { 87753, true }, + { 87763, true }, + { 87775, true }, + { 87789, true }, + { 87798, true }, + { 87814, true }, + { 87824, false }, + { 87842, true }, + { 87854, true }, + { 87866, false }, + { 87877, true }, { 87890, true }, - { 87903, true }, - { 87913, true }, - { 87923, true }, - { 87933, true }, - { 87943, true }, - { 87953, true }, - { 87972, true }, - { 87981, true }, - { 87992, true }, - { 88001, true }, - { 88021, true }, - { 88037, true }, - { 88045, true }, - { 88061, true }, - { 88078, true }, - { 88089, true }, - { 88101, true }, - { 88112, true }, - { 88127, true }, - { 88136, true }, - { 88153, true }, - { 88162, true }, - { 88180, true }, - { 88196, true }, - { 88210, true }, - { 88238, true }, - { 88247, true }, - { 88262, true }, - { 88279, true }, - { 88302, true }, - { 88321, true }, - { 88330, true }, - { 88348, true }, - { 88363, true }, - { 88377, true }, - { 88400, true }, - { 88422, true }, - { 88432, true }, - { 88448, true }, - { 88464, true }, - { 88472, true }, - { 88484, true }, - { 88496, true }, - { 88513, true }, - { 88530, true }, - { 88562, true }, - { 88580, true }, - { 88594, true }, - { 88608, true }, - { 88620, true }, - { 88638, true }, - { 88657, true }, - { 88668, true }, - { 88679, true }, + { 87900, true }, + { 87910, true }, + { 87920, true }, + { 87930, true }, + { 87940, true }, + { 87959, true }, + { 87968, true }, + { 87979, true }, + { 87988, true }, + { 88008, true }, + { 88024, true }, + { 88032, true }, + { 88048, true }, + { 88065, true }, + { 88076, true }, + { 88088, true }, + { 88099, true }, + { 88114, true }, + { 88123, true }, + { 88140, true }, + { 88149, true }, + { 88167, true }, + { 88183, true }, + { 88197, true }, + { 88225, true }, + { 88234, true }, + { 88249, true }, + { 88266, true }, + { 88289, true }, + { 88308, true }, + { 88317, true }, + { 88335, true }, + { 88350, true }, + { 88364, true }, + { 88387, true }, + { 88409, true }, + { 88419, true }, + { 88435, true }, + { 88451, true }, + { 88459, true }, + { 88471, true }, + { 88483, true }, + { 88500, true }, + { 88517, true }, + { 88549, true }, + { 88567, true }, + { 88581, true }, + { 88595, true }, + { 88607, true }, + { 88625, true }, + { 88644, true }, + { 88655, true }, + { 88666, true }, + { 88684, true }, { 88697, true }, - { 88710, true }, - { 88721, true }, - { 88731, true }, - { 88743, true }, - { 88754, true }, - { 88765, true }, - { 88775, true }, - { 88784, true }, - { 88801, true }, + { 88708, true }, + { 88718, true }, + { 88730, true }, + { 88741, true }, + { 88752, true }, + { 88762, true }, + { 88771, true }, + { 88788, true }, + { 88807, true }, { 88820, true }, { 88833, true }, - { 88846, true }, - { 88865, true }, - { 88882, true }, - { 88907, true }, - { 88939, true }, - { 88953, true }, - { 88965, true }, - { 88989, true }, - { 89012, true }, + { 88852, true }, + { 88869, true }, + { 88894, true }, + { 88926, true }, + { 88940, true }, + { 88952, true }, + { 88976, true }, + { 88999, true }, + { 89024, true }, { 89037, true }, - { 89050, true }, - { 89069, true }, + { 89056, true }, + { 89070, true }, { 89083, true }, - { 89096, true }, - { 89111, false }, + { 89098, false }, + { 89118, true }, { 89131, true }, - { 89144, true }, - { 89161, true }, - { 89176, true }, - { 89193, true }, - { 89202, true }, - { 89211, true }, - { 89227, true }, - { 89247, true }, - { 89266, true }, - { 89275, true }, - { 89286, true }, - { 89295, true }, + { 89148, true }, + { 89163, true }, + { 89180, true }, + { 89189, true }, + { 89198, true }, + { 89214, true }, + { 89234, true }, + { 89253, true }, + { 89262, true }, + { 89273, true }, + { 89282, true }, + { 89293, true }, { 89306, true }, - { 89319, true }, + { 89315, true }, { 89328, true }, - { 89341, true }, + { 89338, true }, { 89351, true }, { 89364, true }, - { 89377, true }, - { 89388, true }, - { 89399, true }, - { 89408, true }, - { 89422, true }, - { 89439, true }, - { 89456, true }, - { 89465, true }, - { 89480, true }, - { 89495, true }, - { 89514, true }, + { 89375, true }, + { 89386, true }, + { 89395, true }, + { 89409, true }, + { 89426, true }, + { 89443, true }, + { 89452, true }, + { 89467, true }, + { 89482, true }, + { 89501, true }, + { 89513, true }, { 89526, true }, - { 89539, true }, + { 89538, true }, { 89551, true }, - { 89564, true }, - { 89573, true }, - { 89587, true }, - { 89610, true }, - { 89622, true }, - { 89633, true }, - { 89650, true }, - { 89667, true }, - { 89688, true }, - { 89699, true }, - { 89710, true }, - { 89717, true }, - { 89728, true }, - { 89735, true }, - { 89745, true }, - { 89757, true }, - { 89767, true }, + { 89560, true }, + { 89574, true }, + { 89597, true }, + { 89609, true }, + { 89620, true }, + { 89637, true }, + { 89654, true }, + { 89675, true }, + { 89686, true }, + { 89697, true }, + { 89704, true }, + { 89715, true }, + { 89722, true }, + { 89732, true }, + { 89744, true }, + { 89754, true }, + { 89763, true }, { 89776, true }, - { 89789, true }, - { 89801, true }, - { 89815, true }, - { 89829, true }, - { 89836, true }, - { 89843, true }, - { 89852, true }, - { 89860, true }, - { 89870, true }, - { 89888, true }, - { 89902, true }, - { 89914, true }, - { 89925, true }, - { 89936, true }, + { 89788, true }, + { 89802, true }, + { 89816, true }, + { 89823, true }, + { 89830, true }, + { 89839, true }, + { 89847, true }, + { 89857, true }, + { 89875, true }, + { 89889, true }, + { 89901, true }, + { 89912, true }, + { 89923, true }, + { 89934, true }, { 89947, true }, - { 89960, true }, - { 89971, true }, - { 89980, false }, - { 89992, true }, - { 90009, true }, - { 90020, true }, - { 90027, true }, - { 90034, true }, - { 90048, true }, - { 90056, true }, - { 90063, true }, + { 89958, true }, + { 89967, false }, + { 89979, true }, + { 89996, true }, + { 90007, true }, + { 90014, true }, + { 90021, true }, + { 90035, true }, + { 90043, true }, + { 90050, true }, + { 90061, true }, { 90074, true }, - { 90087, true }, + { 90084, true }, { 90097, true }, - { 90110, true }, + { 90112, true }, { 90125, true }, - { 90138, true }, - { 90147, true }, - { 90166, false }, - { 90178, true }, + { 90134, true }, + { 90153, false }, + { 90165, true }, + { 90179, true }, { 90192, true }, - { 90205, true }, - { 90220, true }, + { 90207, true }, + { 90226, true }, { 90239, true }, - { 90252, true }, + { 90254, true }, { 90267, true }, - { 90280, true }, + { 90277, true }, { 90290, true }, - { 90303, true }, - { 90320, true }, - { 90334, false }, - { 90353, true }, - { 90368, true }, - { 90382, true }, - { 90398, true }, - { 90414, true }, - { 90434, true }, - { 90443, true }, - { 90459, true }, - { 90474, true }, - { 90483, true }, - { 90499, true }, - { 90519, true }, - { 90538, true }, - { 90555, false }, - { 90571, true }, - { 90582, true }, - { 90602, true }, - { 90615, true }, - { 90629, false }, - { 90642, true }, - { 90652, true }, - { 90668, true }, - { 90685, true }, - { 90700, true }, - { 90723, true }, - { 90736, true }, - { 90753, true }, - { 90768, true }, - { 90785, true }, + { 90307, true }, + { 90321, false }, + { 90340, true }, + { 90355, true }, + { 90369, true }, + { 90385, true }, + { 90401, true }, + { 90421, true }, + { 90430, true }, + { 90446, true }, + { 90461, true }, + { 90470, true }, + { 90486, true }, + { 90506, true }, + { 90525, true }, + { 90542, false }, + { 90558, true }, + { 90578, true }, + { 90591, true }, + { 90605, false }, + { 90618, true }, + { 90628, true }, + { 90644, true }, + { 90661, true }, + { 90676, true }, + { 90699, true }, + { 90712, true }, + { 90729, true }, + { 90744, true }, + { 90761, true }, + { 90775, true }, + { 90790, true }, { 90799, true }, { 90814, true }, - { 90823, true }, - { 90838, true }, - { 90856, true }, - { 90870, true }, - { 90881, true }, - { 90891, true }, - { 90906, true }, + { 90832, true }, + { 90846, true }, + { 90857, true }, + { 90867, true }, + { 90882, true }, + { 90896, true }, + { 90909, true }, { 90920, true }, - { 90933, true }, + { 90934, true }, { 90944, true }, - { 90958, true }, - { 90968, true }, - { 90980, true }, - { 90998, true }, - { 91012, true }, - { 91024, true }, - { 91043, false }, - { 91058, true }, - { 91077, true }, - { 91088, true }, - { 91100, true }, - { 91118, true }, - { 91131, true }, - { 91148, true }, - { 91167, true }, - { 91184, true }, - { 91202, true }, - { 91224, true }, - { 91243, true }, - { 91256, true }, - { 91272, true }, - { 91287, true }, - { 91295, true }, - { 91308, true }, - { 91322, true }, - { 91333, true }, - { 91343, true }, - { 91361, true }, - { 91379, true }, - { 91392, true }, - { 91408, true }, - { 91420, true }, - { 91431, true }, - { 91443, true }, + { 90956, true }, + { 90974, true }, + { 90988, true }, + { 91000, true }, + { 91019, false }, + { 91034, true }, + { 91053, true }, + { 91064, true }, + { 91076, true }, + { 91094, true }, + { 91107, true }, + { 91124, true }, + { 91143, true }, + { 91160, true }, + { 91178, true }, + { 91200, true }, + { 91219, true }, + { 91232, true }, + { 91248, true }, + { 91263, true }, + { 91271, true }, + { 91284, true }, + { 91298, true }, + { 91309, true }, + { 91319, true }, + { 91337, true }, + { 91355, true }, + { 91368, true }, + { 91384, true }, + { 91396, true }, + { 91407, true }, + { 91419, true }, + { 91429, true }, + { 91437, true }, { 91453, true }, - { 91461, true }, - { 91477, true }, - { 91493, true }, - { 91505, true }, - { 91518, true }, - { 91532, true }, - { 91551, true }, - { 91565, true }, - { 91578, true }, - { 91594, false }, - { 91611, true }, - { 91632, true }, - { 91651, true }, - { 91670, true }, - { 91689, false }, - { 91705, true }, - { 91715, true }, - { 91725, true }, - { 91734, true }, - { 91747, true }, - { 91757, false }, - { 91775, true }, - { 91797, true }, - { 91814, true }, - { 91830, false }, - { 91848, true }, - { 91859, true }, - { 91875, true }, + { 91469, true }, + { 91478, true }, + { 91490, true }, + { 91503, true }, + { 91517, true }, + { 91536, true }, + { 91550, true }, + { 91563, true }, + { 91579, false }, + { 91596, true }, + { 91617, true }, + { 91636, true }, + { 91655, true }, + { 91674, false }, + { 91690, true }, + { 91700, true }, + { 91710, true }, + { 91719, true }, + { 91732, true }, + { 91742, false }, + { 91760, true }, + { 91782, true }, + { 91799, true }, + { 91815, false }, + { 91833, true }, + { 91844, true }, + { 91860, true }, + { 91878, true }, { 91893, true }, - { 91908, true }, - { 91922, true }, - { 91939, true }, - { 91957, true }, - { 91976, true }, - { 91987, true }, - { 92003, true }, - { 92020, true }, - { 92036, true }, - { 92054, true }, - { 92074, true }, - { 92091, true }, - { 92113, true }, - { 92130, true }, - { 92146, true }, + { 91907, true }, + { 91924, true }, + { 91942, true }, + { 91961, true }, + { 91972, true }, + { 91988, true }, + { 92005, true }, + { 92021, true }, + { 92039, true }, + { 92059, true }, + { 92076, true }, + { 92098, true }, + { 92115, true }, + { 92131, true }, + { 92143, true }, { 92158, true }, - { 92173, true }, - { 92185, true }, - { 92193, true }, + { 92170, true }, + { 92178, true }, + { 92191, true }, { 92206, true }, { 92221, true }, - { 92236, true }, - { 92246, true }, - { 92255, true }, - { 92265, true }, - { 92275, true }, - { 92289, true }, - { 92297, true }, - { 92306, true }, - { 92315, true }, - { 92325, true }, - { 92334, true }, - { 92354, false }, - { 92364, true }, - { 92380, true }, - { 92393, true }, - { 92406, true }, - { 92413, true }, - { 92429, true }, - { 92442, true }, - { 92455, true }, + { 92231, true }, + { 92240, true }, + { 92250, true }, + { 92260, true }, + { 92274, true }, + { 92282, true }, + { 92291, true }, + { 92300, true }, + { 92310, true }, + { 92319, true }, + { 92339, false }, + { 92349, true }, + { 92365, true }, + { 92378, true }, + { 92391, true }, + { 92398, true }, + { 92414, true }, + { 92427, true }, + { 92440, true }, + { 92453, true }, { 92468, true }, - { 92483, true }, - { 92495, true }, - { 92502, true }, - { 92511, true }, - { 92520, true }, - { 92529, true }, - { 92540, true }, - { 92554, true }, + { 92480, true }, + { 92487, true }, + { 92494, true }, + { 92503, true }, + { 92512, true }, + { 92521, true }, + { 92532, true }, + { 92546, true }, + { 92559, true }, { 92567, true }, - { 92575, true }, - { 92587, true }, - { 92601, true }, - { 92612, true }, - { 92628, true }, - { 92642, true }, - { 92657, true }, - { 92667, false }, - { 92681, true }, - { 92691, true }, - { 92706, true }, - { 92721, false }, - { 92737, true }, - { 92756, true }, - { 92768, true }, - { 92781, true }, - { 92800, true }, - { 92813, true }, - { 92829, true }, - { 92843, true }, - { 92860, true }, - { 92877, true }, - { 92887, true }, - { 92902, true }, - { 92916, true }, - { 92929, true }, - { 92944, true }, - { 92960, true }, - { 92974, true }, - { 92989, true }, - { 93003, true }, - { 93018, true }, - { 93037, true }, - { 93052, true }, - { 93067, true }, - { 93085, true }, - { 93104, true }, - { 93117, true }, - { 93130, true }, - { 93153, true }, - { 93169, true }, - { 93180, true }, - { 93193, true }, - { 93208, true }, - { 93223, true }, - { 93239, true }, - { 93254, true }, - { 93270, true }, - { 93287, true }, - { 93299, true }, - { 93309, true }, - { 93327, true }, - { 93337, true }, - { 93348, true }, - { 93358, true }, - { 93371, true }, - { 93399, true }, - { 93410, true }, - { 93421, true }, - { 93432, true }, - { 93449, true }, - { 93463, false }, - { 93480, true }, - { 93494, true }, - { 93503, true }, - { 93520, true }, - { 93537, true }, - { 93549, true }, - { 93563, true }, - { 93575, true }, - { 93591, true }, - { 93617, true }, - { 93627, true }, - { 93640, true }, + { 92579, true }, + { 92593, true }, + { 92604, true }, + { 92620, true }, + { 92634, true }, + { 92649, true }, + { 92659, false }, + { 92673, true }, + { 92683, true }, + { 92698, true }, + { 92713, false }, + { 92729, true }, + { 92748, true }, + { 92760, true }, + { 92773, true }, + { 92792, true }, + { 92805, true }, + { 92821, true }, + { 92835, true }, + { 92852, true }, + { 92869, true }, + { 92879, true }, + { 92894, true }, + { 92908, true }, + { 92921, true }, + { 92936, true }, + { 92952, true }, + { 92966, true }, + { 92981, true }, + { 92995, true }, + { 93010, true }, + { 93029, true }, + { 93044, true }, + { 93059, true }, + { 93077, true }, + { 93096, true }, + { 93109, true }, + { 93122, true }, + { 93145, true }, + { 93161, true }, + { 93172, true }, + { 93185, true }, + { 93200, true }, + { 93215, true }, + { 93231, true }, + { 93246, true }, + { 93262, true }, + { 93279, true }, + { 93291, true }, + { 93301, true }, + { 93319, true }, + { 93329, true }, + { 93340, true }, + { 93350, true }, + { 93363, true }, + { 93391, true }, + { 93402, true }, + { 93413, true }, + { 93424, true }, + { 93441, true }, + { 93455, false }, + { 93472, true }, + { 93486, true }, + { 93495, true }, + { 93512, true }, + { 93529, true }, + { 93541, true }, + { 93555, true }, + { 93567, true }, + { 93583, true }, + { 93609, true }, + { 93619, true }, + { 93632, true }, + { 93642, true }, { 93650, true }, - { 93658, true }, - { 93669, true }, - { 93684, true }, - { 93702, true }, + { 93661, true }, + { 93676, true }, + { 93694, true }, + { 93710, true }, { 93718, true }, - { 93726, true }, - { 93740, true }, - { 93757, true }, - { 93777, true }, - { 93793, true }, - { 93806, true }, - { 93816, false }, - { 93830, true }, - { 93841, true }, + { 93732, true }, + { 93749, true }, + { 93769, true }, + { 93785, true }, + { 93798, true }, + { 93808, false }, + { 93822, true }, + { 93833, true }, + { 93849, true }, { 93857, true }, - { 93865, true }, - { 93875, true }, - { 93890, true }, - { 93906, true }, - { 93925, true }, - { 93938, true }, - { 93958, true }, - { 93973, true }, - { 93991, true }, - { 94001, true }, - { 94018, true }, - { 94033, true }, - { 94044, true }, - { 94055, true }, - { 94068, true }, - { 94076, true }, - { 94085, true }, - { 94096, true }, - { 94110, true }, - { 94133, true }, - { 94146, true }, - { 94158, true }, - { 94169, true }, - { 94183, true }, - { 94211, true }, - { 94226, true }, - { 94250, true }, - { 94265, true }, - { 94285, true }, - { 94298, true }, - { 94314, true }, - { 94329, true }, - { 94342, true }, - { 94356, true }, - { 94367, true }, - { 94378, true }, - { 94392, true }, - { 94404, true }, - { 94421, true }, - { 94434, true }, - { 94449, true }, - { 94457, true }, - { 94477, true }, - { 94488, true }, - { 94498, true }, - { 94509, true }, - { 94519, true }, - { 94531, true }, + { 93867, true }, + { 93882, true }, + { 93898, true }, + { 93917, true }, + { 93930, true }, + { 93950, true }, + { 93965, true }, + { 93983, true }, + { 93996, true }, + { 94006, true }, + { 94023, true }, + { 94038, true }, + { 94049, true }, + { 94060, true }, + { 94073, true }, + { 94081, true }, + { 94090, true }, + { 94101, true }, + { 94115, true }, + { 94138, true }, + { 94151, true }, + { 94163, true }, + { 94174, true }, + { 94188, true }, + { 94216, true }, + { 94231, true }, + { 94255, true }, + { 94270, true }, + { 94290, true }, + { 94303, true }, + { 94319, true }, + { 94334, true }, + { 94347, true }, + { 94361, true }, + { 94372, true }, + { 94383, true }, + { 94397, true }, + { 94409, true }, + { 94426, true }, + { 94439, true }, + { 94454, true }, + { 94462, true }, + { 94482, true }, + { 94493, true }, + { 94503, true }, + { 94513, true }, + { 94524, true }, + { 94534, true }, { 94546, true }, - { 94555, true }, - { 94569, true }, - { 94582, true }, + { 94561, true }, + { 94570, true }, + { 94584, true }, { 94597, true }, - { 94611, true }, - { 94622, true }, - { 94635, true }, - { 94650, false }, - { 94660, true }, - { 94679, true }, - { 94692, true }, - { 94701, true }, - { 94712, true }, - { 94726, true }, - { 94746, true }, - { 94762, true }, - { 94773, true }, - { 94789, true }, - { 94806, true }, + { 94612, true }, + { 94626, true }, + { 94637, true }, + { 94650, true }, + { 94665, false }, + { 94675, true }, + { 94694, true }, + { 94707, true }, + { 94716, true }, + { 94727, true }, + { 94741, true }, + { 94761, true }, + { 94777, true }, + { 94788, true }, + { 94804, true }, { 94821, true }, - { 94834, true }, - { 94851, true }, - { 94861, true }, - { 94871, true }, - { 94879, true }, - { 94890, true }, - { 94900, true }, - { 94913, true }, - { 94927, true }, - { 94939, true }, - { 94949, true }, - { 94957, true }, - { 94976, true }, - { 94996, true }, - { 95005, true }, - { 95019, true }, - { 95033, true }, - { 95047, true }, - { 95089, true }, - { 95105, true }, - { 95114, true }, - { 95126, true }, - { 95138, true }, - { 95151, true }, - { 95164, true }, - { 95182, true }, - { 95190, true }, - { 95203, true }, - { 95213, true }, - { 95225, true }, - { 95236, true }, - { 95253, true }, + { 94836, true }, + { 94849, true }, + { 94866, true }, + { 94876, true }, + { 94886, true }, + { 94894, true }, + { 94905, true }, + { 94915, true }, + { 94928, true }, + { 94942, true }, + { 94954, true }, + { 94964, true }, + { 94972, true }, + { 94991, true }, + { 95011, true }, + { 95020, true }, + { 95034, true }, + { 95048, true }, + { 95062, true }, + { 95104, true }, + { 95120, true }, + { 95129, true }, + { 95141, true }, + { 95153, true }, + { 95166, true }, + { 95179, true }, + { 95197, true }, + { 95205, true }, + { 95218, true }, + { 95228, true }, + { 95240, true }, + { 95251, true }, { 95268, true }, - { 95280, true }, - { 95293, true }, - { 95305, true }, + { 95283, true }, + { 95295, true }, + { 95308, true }, { 95320, true }, - { 95333, true }, - { 95345, true }, - { 95355, true }, - { 95371, true }, - { 95389, true }, + { 95335, true }, + { 95348, true }, + { 95360, true }, + { 95370, true }, + { 95386, true }, { 95404, true }, - { 95418, true }, - { 95436, true }, - { 95454, true }, - { 95466, true }, - { 95484, true }, - { 95495, true }, - { 95509, true }, - { 95529, true }, - { 95542, true }, - { 95554, true }, - { 95574, true }, - { 95585, true }, - { 95594, true }, - { 95603, true }, - { 95610, true }, - { 95625, true }, - { 95640, true }, - { 95654, true }, - { 95673, true }, - { 95684, true }, - { 95698, true }, - { 95710, true }, - { 95723, true }, - { 95736, true }, - { 95747, true }, - { 95760, true }, - { 95772, true }, - { 95795, true }, - { 95804, true }, - { 95821, true }, - { 95834, true }, - { 95846, true }, - { 95857, true }, - { 95872, true }, - { 95886, true }, - { 95894, true }, - { 95908, true }, - { 95922, true }, - { 95930, true }, - { 95943, true }, - { 95954, true }, - { 95966, false }, - { 95979, true }, - { 95990, true }, - { 96014, true }, - { 96028, true }, - { 96036, true }, - { 96046, true }, - { 96056, true }, - { 96073, true }, - { 96091, true }, - { 96109, true }, - { 96123, true }, - { 96133, true }, - { 96157, true }, - { 96171, true }, - { 96190, true }, - { 96202, true }, - { 96221, true }, - { 96238, true }, - { 96248, true }, - { 96263, true }, - { 96275, true }, - { 96287, true }, - { 96300, true }, - { 96309, true }, - { 96318, true }, - { 96337, true }, - { 96349, true }, - { 96356, true }, - { 96384, true }, - { 96411, true }, - { 96437, true }, - { 96462, true }, - { 96472, true }, - { 96481, true }, - { 96496, true }, - { 96511, true }, - { 96529, true }, - { 96540, true }, - { 96552, true }, - { 96568, true }, - { 96582, true }, - { 96597, true }, - { 96613, true }, - { 96639, true }, - { 96650, true }, - { 96665, true }, - { 96680, true }, - { 96695, true }, - { 96713, true }, - { 96728, true }, - { 96741, true }, - { 96757, true }, - { 96780, true }, - { 96793, true }, - { 96806, true }, - { 96819, true }, - { 96838, true }, - { 96853, true }, - { 96867, true }, - { 96879, false }, - { 96898, true }, - { 96913, true }, - { 96931, true }, - { 96942, true }, - { 96954, true }, - { 96965, true }, - { 96978, true }, - { 97001, true }, - { 97016, true }, - { 97030, true }, - { 97047, true }, - { 97058, true }, - { 97074, true }, - { 97087, true }, - { 97097, true }, - { 97108, true }, - { 97116, true }, - { 97126, true }, - { 97143, true }, - { 97158, true }, - { 97168, true }, - { 97178, true }, - { 97189, true }, - { 97200, true }, - { 97220, true }, - { 97235, true }, - { 97252, true }, - { 97266, true }, - { 97276, true }, - { 97287, true }, - { 97306, true }, - { 97317, true }, - { 97339, true }, - { 97351, true }, - { 97365, true }, - { 97376, false }, - { 97389, true }, - { 97399, true }, - { 97416, true }, - { 97430, true }, - { 97442, true }, - { 97458, true }, - { 97472, true }, - { 97483, true }, - { 97493, true }, - { 97513, true }, - { 97540, true }, - { 97555, true }, - { 97571, true }, - { 97586, true }, - { 97599, true }, - { 97611, true }, - { 97627, true }, - { 97639, true }, - { 97656, true }, - { 97666, true }, - { 97677, true }, - { 97694, true }, - { 97711, true }, - { 97723, true }, - { 97736, false }, - { 97750, true }, - { 97773, true }, - { 97787, true }, - { 97799, true }, - { 97810, true }, - { 97822, true }, - { 97840, true }, - { 97853, true }, - { 97868, true }, - { 97886, true }, - { 97896, true }, - { 97906, true }, - { 97915, true }, - { 97927, true }, - { 97941, true }, - { 97962, true }, - { 97976, true }, - { 97990, true }, - { 98008, true }, - { 98026, true }, - { 98034, true }, - { 98046, true }, - { 98058, true }, - { 98070, true }, - { 98078, true }, - { 98092, true }, - { 98107, true }, - { 98122, true }, - { 98136, true }, - { 98145, true }, - { 98155, true }, - { 98167, true }, - { 98182, true }, - { 98194, true }, - { 98217, true }, - { 98230, true }, - { 98238, true }, - { 98249, true }, - { 98258, true }, - { 98266, true }, - { 98279, true }, - { 98302, true }, - { 98314, true }, - { 98330, true }, - { 98353, true }, - { 98364, true }, - { 98380, true }, - { 98396, true }, - { 98411, true }, - { 98424, true }, - { 98434, true }, - { 98441, true }, - { 98454, true }, - { 98477, true }, - { 98494, true }, - { 98512, true }, - { 98541, true }, - { 98558, true }, - { 98572, true }, + { 95419, true }, + { 95433, true }, + { 95451, true }, + { 95469, true }, + { 95481, true }, + { 95499, true }, + { 95510, true }, + { 95524, true }, + { 95544, true }, + { 95557, true }, + { 95569, true }, + { 95589, true }, + { 95598, true }, + { 95607, true }, + { 95614, true }, + { 95629, true }, + { 95644, true }, + { 95658, true }, + { 95677, true }, + { 95688, true }, + { 95702, true }, + { 95714, true }, + { 95727, true }, + { 95740, true }, + { 95751, true }, + { 95764, true }, + { 95776, true }, + { 95799, true }, + { 95808, true }, + { 95825, true }, + { 95838, true }, + { 95850, true }, + { 95861, true }, + { 95876, true }, + { 95890, true }, + { 95898, true }, + { 95912, true }, + { 95926, true }, + { 95934, true }, + { 95947, true }, + { 95958, true }, + { 95970, false }, + { 95983, true }, + { 95994, true }, + { 96018, true }, + { 96032, true }, + { 96040, true }, + { 96050, true }, + { 96060, true }, + { 96077, true }, + { 96095, true }, + { 96113, true }, + { 96127, true }, + { 96137, true }, + { 96161, true }, + { 96175, true }, + { 96194, true }, + { 96206, true }, + { 96225, true }, + { 96242, true }, + { 96252, true }, + { 96267, true }, + { 96279, true }, + { 96291, true }, + { 96304, true }, + { 96313, true }, + { 96322, true }, + { 96341, true }, + { 96353, true }, + { 96360, true }, + { 96388, true }, + { 96415, true }, + { 96441, true }, + { 96466, true }, + { 96476, true }, + { 96485, true }, + { 96500, true }, + { 96515, true }, + { 96533, true }, + { 96544, true }, + { 96556, true }, + { 96572, true }, + { 96586, true }, + { 96601, true }, + { 96617, true }, + { 96643, true }, + { 96654, true }, + { 96669, true }, + { 96684, true }, + { 96699, true }, + { 96717, true }, + { 96732, true }, + { 96745, true }, + { 96761, true }, + { 96784, true }, + { 96797, true }, + { 96810, true }, + { 96823, true }, + { 96842, true }, + { 96857, true }, + { 96871, true }, + { 96883, false }, + { 96902, true }, + { 96917, true }, + { 96935, true }, + { 96946, true }, + { 96958, true }, + { 96969, true }, + { 96982, true }, + { 97005, true }, + { 97020, true }, + { 97034, true }, + { 97051, true }, + { 97062, true }, + { 97078, true }, + { 97091, true }, + { 97101, true }, + { 97112, true }, + { 97120, true }, + { 97130, true }, + { 97147, true }, + { 97162, true }, + { 97172, true }, + { 97182, true }, + { 97193, true }, + { 97204, true }, + { 97224, true }, + { 97239, true }, + { 97256, true }, + { 97270, true }, + { 97280, true }, + { 97291, true }, + { 97310, true }, + { 97321, true }, + { 97343, true }, + { 97355, true }, + { 97369, true }, + { 97380, false }, + { 97393, true }, + { 97403, true }, + { 97421, true }, + { 97438, true }, + { 97452, true }, + { 97464, true }, + { 97480, true }, + { 97494, true }, + { 97505, true }, + { 97515, true }, + { 97535, true }, + { 97562, true }, + { 97577, true }, + { 97593, true }, + { 97608, true }, + { 97621, true }, + { 97633, true }, + { 97649, true }, + { 97661, true }, + { 97678, true }, + { 97688, true }, + { 97699, true }, + { 97716, true }, + { 97733, true }, + { 97745, true }, + { 97758, false }, + { 97772, true }, + { 97795, true }, + { 97809, true }, + { 97821, true }, + { 97832, true }, + { 97844, true }, + { 97862, true }, + { 97875, true }, + { 97890, true }, + { 97908, true }, + { 97918, true }, + { 97930, true }, + { 97940, true }, + { 97949, true }, + { 97961, true }, + { 97975, true }, + { 97996, true }, + { 98010, true }, + { 98024, true }, + { 98042, true }, + { 98060, true }, + { 98072, true }, + { 98084, true }, + { 98096, true }, + { 98104, true }, + { 98118, true }, + { 98133, true }, + { 98148, true }, + { 98162, true }, + { 98171, true }, + { 98181, true }, + { 98193, true }, + { 98208, true }, + { 98220, true }, + { 98243, true }, + { 98256, true }, + { 98264, true }, + { 98275, true }, + { 98284, true }, + { 98292, true }, + { 98305, true }, + { 98328, true }, + { 98340, true }, + { 98356, true }, + { 98379, true }, + { 98390, true }, + { 98406, true }, + { 98422, true }, + { 98437, true }, + { 98450, true }, + { 98460, true }, + { 98467, true }, + { 98480, true }, + { 98503, true }, + { 98520, true }, + { 98538, true }, + { 98567, true }, { 98584, true }, - { 98593, true }, - { 98609, true }, - { 98624, true }, - { 98637, true }, - { 98655, true }, - { 98673, true }, - { 98683, true }, - { 98691, true }, - { 98701, true }, - { 98711, true }, - { 98719, true }, - { 98731, true }, + { 98598, true }, + { 98610, true }, + { 98619, true }, + { 98635, true }, + { 98650, true }, + { 98663, true }, + { 98681, true }, + { 98699, true }, + { 98709, true }, + { 98717, true }, + { 98727, true }, + { 98737, true }, { 98745, true }, - { 98763, true }, - { 98772, true }, - { 98783, true }, + { 98757, true }, + { 98771, true }, + { 98789, true }, { 98798, true }, - { 98821, true }, - { 98829, true }, - { 98844, true }, - { 98862, true }, - { 98880, true }, - { 98892, true }, - { 98902, true }, - { 98913, true }, - { 98925, true }, - { 98936, true }, - { 98944, true }, - { 98961, false }, - { 98977, false }, - { 98998, true }, - { 99015, true }, - { 99033, true }, - { 99050, true }, - { 99067, true }, - { 99081, true }, - { 99089, true }, - { 99102, true }, - { 99120, true }, - { 99147, true }, - { 99171, true }, - { 99188, true }, - { 99203, true }, - { 99217, true }, + { 98809, true }, + { 98824, true }, + { 98847, true }, + { 98855, true }, + { 98870, true }, + { 98888, true }, + { 98906, true }, + { 98918, true }, + { 98928, true }, + { 98939, true }, + { 98951, true }, + { 98962, true }, + { 98970, true }, + { 98987, false }, + { 99003, false }, + { 99024, true }, + { 99041, true }, + { 99059, true }, + { 99076, true }, + { 99093, true }, + { 99107, true }, + { 99115, true }, + { 99128, true }, + { 99146, true }, + { 99173, true }, + { 99197, true }, + { 99214, true }, { 99229, true }, - { 99240, true }, - { 99251, true }, - { 99261, true }, - { 99272, false }, - { 99293, true }, - { 99304, true }, - { 99318, true }, + { 99243, true }, + { 99255, true }, + { 99266, true }, + { 99277, true }, + { 99287, true }, + { 99298, false }, + { 99319, true }, { 99330, true }, { 99344, true }, - { 99362, true }, - { 99376, true }, - { 99387, true }, - { 99404, true }, - { 99415, true }, - { 99425, true }, - { 99445, true }, - { 99456, true }, - { 99470, true }, - { 99484, true }, - { 99497, true }, - { 99508, true }, - { 99527, true }, - { 99540, true }, - { 99554, true }, - { 99562, true }, - { 99576, true }, - { 99589, true }, - { 99601, true }, - { 99614, true }, - { 99626, true }, - { 99638, true }, - { 99653, true }, - { 99663, true }, - { 99678, true }, - { 99692, true }, - { 99705, true }, - { 99715, false }, - { 99726, true }, - { 99736, true }, - { 99747, true }, - { 99758, true }, - { 99769, true }, - { 99782, true }, - { 99794, true }, - { 99806, true }, - { 99816, true }, - { 99824, true }, - { 99846, true }, - { 99858, true }, - { 99867, true }, - { 99876, true }, - { 99888, true }, - { 99900, true }, - { 99910, true }, - { 99921, true }, - { 99931, true }, - { 99944, false }, - { 99955, true }, - { 99968, true }, - { 99993, true }, - { 100003, true }, - { 100012, true }, + { 99356, true }, + { 99370, true }, + { 99388, true }, + { 99402, true }, + { 99413, true }, + { 99430, true }, + { 99441, true }, + { 99451, true }, + { 99471, true }, + { 99482, true }, + { 99496, true }, + { 99510, true }, + { 99523, true }, + { 99534, true }, + { 99553, true }, + { 99566, true }, + { 99580, true }, + { 99588, true }, + { 99602, true }, + { 99615, true }, + { 99627, true }, + { 99640, true }, + { 99652, true }, + { 99664, true }, + { 99679, true }, + { 99689, true }, + { 99704, true }, + { 99718, true }, + { 99731, true }, + { 99741, false }, + { 99752, true }, + { 99762, true }, + { 99773, true }, + { 99784, true }, + { 99795, true }, + { 99808, true }, + { 99820, true }, + { 99832, true }, + { 99842, true }, + { 99850, true }, + { 99872, true }, + { 99884, true }, + { 99893, true }, + { 99902, true }, + { 99914, true }, + { 99926, true }, + { 99936, true }, + { 99947, true }, + { 99957, true }, + { 99970, false }, + { 99981, true }, + { 99994, true }, + { 100019, true }, { 100029, true }, - { 100047, true }, - { 100059, true }, - { 100067, true }, - { 100086, true }, - { 100099, true }, - { 100113, true }, - { 100123, true }, - { 100135, true }, - { 100159, true }, - { 100173, true }, - { 100191, true }, - { 100205, true }, - { 100223, true }, - { 100242, true }, - { 100252, true }, - { 100266, true }, - { 100279, true }, - { 100289, true }, - { 100302, true }, - { 100311, true }, - { 100322, true }, - { 100334, true }, - { 100347, true }, - { 100357, true }, - { 100365, true }, - { 100377, true }, - { 100389, true }, - { 100404, true }, - { 100412, true }, - { 100424, true }, - { 100439, true }, + { 100038, true }, + { 100055, true }, + { 100073, true }, + { 100085, true }, + { 100093, true }, + { 100112, true }, + { 100125, true }, + { 100139, true }, + { 100149, true }, + { 100161, true }, + { 100185, true }, + { 100199, true }, + { 100217, true }, + { 100235, true }, + { 100249, true }, + { 100267, true }, + { 100286, true }, + { 100296, true }, + { 100310, true }, + { 100323, true }, + { 100333, true }, + { 100346, true }, + { 100355, true }, + { 100366, true }, + { 100378, true }, + { 100391, true }, + { 100401, true }, + { 100409, true }, + { 100421, true }, + { 100433, true }, { 100448, true }, - { 100461, true }, - { 100467, true }, - { 100479, true }, - { 100489, true }, - { 100498, false }, - { 100513, true }, - { 100531, true }, - { 100544, true }, - { 100558, true }, - { 100570, true }, - { 100584, true }, - { 100597, true }, - { 100608, true }, - { 100617, true }, - { 100627, true }, - { 100640, true }, - { 100648, true }, + { 100456, true }, + { 100468, true }, + { 100483, true }, + { 100492, true }, + { 100505, true }, + { 100511, true }, + { 100523, true }, + { 100533, true }, + { 100542, false }, + { 100557, true }, + { 100575, true }, + { 100588, true }, + { 100602, true }, + { 100614, true }, + { 100628, true }, + { 100641, true }, + { 100652, true }, { 100661, true }, - { 100673, true }, - { 100686, true }, - { 100706, true }, - { 100725, true }, - { 100742, true }, - { 100754, true }, - { 100772, true }, - { 100787, true }, - { 100800, true }, - { 100812, true }, + { 100671, true }, + { 100684, true }, + { 100692, true }, + { 100705, true }, + { 100717, true }, + { 100730, true }, + { 100750, true }, + { 100769, true }, + { 100786, true }, + { 100798, true }, + { 100816, true }, { 100831, true }, - { 100848, true }, - { 100867, true }, - { 100883, true }, - { 100894, true }, - { 100909, true }, - { 100919, true }, - { 100933, true }, - { 100944, true }, + { 100844, true }, + { 100856, true }, + { 100875, true }, + { 100892, true }, + { 100911, true }, + { 100927, true }, + { 100938, true }, + { 100953, true }, { 100963, true }, - { 100972, false }, - { 100983, true }, - { 100991, true }, - { 100999, true }, + { 100977, true }, + { 100988, true }, { 101007, true }, - { 101023, true }, - { 101031, true }, - { 101042, true }, - { 101054, true }, - { 101066, true }, - { 101080, true }, - { 101094, true }, - { 101105, true }, - { 101114, true }, - { 101130, true }, - { 101152, true }, - { 101163, true }, - { 101175, true }, - { 101182, true }, - { 101193, true }, - { 101205, true }, - { 101215, true }, - { 101225, true }, + { 101016, false }, + { 101027, true }, + { 101035, true }, + { 101043, true }, + { 101051, true }, + { 101067, true }, + { 101075, true }, + { 101086, true }, + { 101098, true }, + { 101110, true }, + { 101124, true }, + { 101138, true }, + { 101149, true }, + { 101158, true }, + { 101174, true }, + { 101196, true }, + { 101207, true }, + { 101219, true }, + { 101226, true }, { 101237, true }, - { 101255, true }, - { 101265, true }, - { 101288, true }, - { 101343, true }, - { 101358, true }, - { 101368, true }, - { 101386, true }, - { 101401, true }, - { 101414, false }, - { 101428, true }, - { 101442, false }, - { 101458, true }, - { 101483, true }, + { 101249, true }, + { 101259, true }, + { 101269, true }, + { 101281, true }, + { 101299, true }, + { 101309, true }, + { 101332, true }, + { 101387, true }, + { 101402, true }, + { 101412, true }, + { 101430, true }, + { 101445, true }, + { 101458, false }, + { 101472, true }, + { 101486, false }, { 101502, true }, - { 101512, true }, - { 101523, true }, - { 101535, true }, - { 101557, true }, - { 101580, true }, - { 101590, true }, - { 101600, false }, - { 101614, true }, - { 101632, true }, - { 101643, true }, - { 101654, true }, - { 101673, true }, - { 101689, true }, - { 101702, true }, - { 101716, true }, - { 101729, true }, - { 101758, true }, - { 101771, true }, - { 101781, true }, - { 101793, true }, - { 101805, true }, - { 101824, true }, - { 101834, true }, - { 101848, true }, - { 101858, true }, - { 101875, true }, - { 101886, true }, + { 101527, true }, + { 101546, true }, + { 101556, true }, + { 101567, true }, + { 101579, true }, + { 101601, true }, + { 101624, true }, + { 101634, true }, + { 101644, false }, + { 101658, true }, + { 101676, true }, + { 101687, true }, + { 101698, true }, + { 101717, true }, + { 101733, true }, + { 101746, true }, + { 101760, true }, + { 101773, true }, + { 101802, true }, + { 101815, true }, + { 101825, true }, + { 101837, true }, + { 101849, true }, + { 101868, true }, + { 101878, true }, + { 101892, true }, { 101902, true }, - { 101921, true }, - { 101936, true }, - { 101948, true }, - { 101957, true }, - { 101977, true }, - { 101993, true }, - { 102007, true }, - { 102020, true }, - { 102035, true }, - { 102047, true }, - { 102057, true }, - { 102071, true }, - { 102086, true }, - { 102098, true }, - { 102116, true }, - { 102126, true }, - { 102138, true }, - { 102152, true }, - { 102164, true }, - { 102176, true }, - { 102197, true }, - { 102213, true }, - { 102226, true }, - { 102243, true }, - { 102258, true }, - { 102271, true }, - { 102284, true }, - { 102298, true }, - { 102313, true }, - { 102326, true }, - { 102345, true }, - { 102368, false }, - { 102381, false }, - { 102399, true }, - { 102419, true }, - { 102432, true }, - { 102447, true }, - { 102462, true }, - { 102477, true }, + { 101919, true }, + { 101930, true }, + { 101946, true }, + { 101965, true }, + { 101980, true }, + { 101992, true }, + { 102001, true }, + { 102021, true }, + { 102037, true }, + { 102051, true }, + { 102064, true }, + { 102079, true }, + { 102091, true }, + { 102101, true }, + { 102115, true }, + { 102130, true }, + { 102142, true }, + { 102160, true }, + { 102170, true }, + { 102182, true }, + { 102196, true }, + { 102208, true }, + { 102220, true }, + { 102241, true }, + { 102257, true }, + { 102270, true }, + { 102287, true }, + { 102302, true }, + { 102315, true }, + { 102328, true }, + { 102342, true }, + { 102357, true }, + { 102370, true }, + { 102389, true }, + { 102412, false }, + { 102425, false }, + { 102443, true }, + { 102463, true }, + { 102476, true }, { 102491, true }, { 102506, true }, - { 102519, true }, - { 102544, true }, - { 102566, true }, - { 102577, true }, - { 102593, true }, - { 102607, true }, - { 102632, true }, - { 102646, true }, - { 102660, true }, - { 102674, true }, - { 102685, true }, - { 102709, true }, - { 102720, true }, - { 102732, true }, - { 102760, true }, - { 102770, false }, - { 102782, true }, - { 102792, true }, - { 102802, true }, - { 102819, true }, + { 102521, true }, + { 102535, true }, + { 102550, true }, + { 102563, true }, + { 102588, true }, + { 102610, true }, + { 102621, true }, + { 102637, true }, + { 102651, true }, + { 102676, true }, + { 102690, true }, + { 102704, true }, + { 102718, true }, + { 102729, true }, + { 102753, true }, + { 102764, true }, + { 102776, true }, + { 102804, true }, + { 102814, false }, + { 102826, true }, { 102836, true }, - { 102849, true }, - { 102859, true }, - { 102882, true }, - { 102892, true }, - { 102901, true }, - { 102923, true }, - { 102935, true }, - { 102947, true }, - { 102959, true }, - { 102970, true }, - { 102988, true }, + { 102846, true }, + { 102863, true }, + { 102880, true }, + { 102893, true }, + { 102903, true }, + { 102926, true }, + { 102936, true }, + { 102945, true }, + { 102967, true }, + { 102979, true }, + { 102991, true }, { 103003, true }, - { 103013, true }, - { 103022, true }, - { 103040, false }, - { 103051, true }, - { 103062, true }, - { 103072, true }, - { 103080, true }, - { 103094, true }, + { 103014, true }, + { 103032, true }, + { 103047, true }, + { 103057, true }, + { 103066, true }, + { 103084, false }, + { 103095, true }, { 103106, true }, - { 103118, true }, - { 103136, true }, - { 103156, true }, - { 103171, true }, - { 103188, true }, - { 103204, true }, - { 103217, true }, - { 103228, true }, - { 103243, true }, - { 103258, true }, - { 103274, true }, + { 103116, true }, + { 103124, true }, + { 103138, true }, + { 103150, true }, + { 103162, true }, + { 103180, true }, + { 103200, true }, + { 103215, true }, + { 103232, true }, + { 103248, true }, + { 103261, true }, + { 103272, true }, { 103287, true }, - { 103312, true }, - { 103328, true }, - { 103348, true }, - { 103363, true }, - { 103374, true }, - { 103385, true }, - { 103401, true }, - { 103413, true }, - { 103430, true }, - { 103441, true }, - { 103449, true }, - { 103461, true }, - { 103473, true }, - { 103487, true }, - { 103504, true }, - { 103520, true }, - { 103536, true }, - { 103555, true }, - { 103570, true }, - { 103582, true }, - { 103599, false }, - { 103619, true }, - { 103639, true }, - { 103660, true }, - { 103681, false }, - { 103698, true }, - { 103717, true }, - { 103732, true }, - { 103743, true }, - { 103760, true }, + { 103302, true }, + { 103318, true }, + { 103331, true }, + { 103356, true }, + { 103372, true }, + { 103392, true }, + { 103407, true }, + { 103418, true }, + { 103429, true }, + { 103445, true }, + { 103457, true }, + { 103474, true }, + { 103485, true }, + { 103493, true }, + { 103505, true }, + { 103517, true }, + { 103531, true }, + { 103548, true }, + { 103564, true }, + { 103580, true }, + { 103599, true }, + { 103614, true }, + { 103626, true }, + { 103643, false }, + { 103663, true }, + { 103683, true }, + { 103704, true }, + { 103725, false }, + { 103742, true }, + { 103761, true }, + { 103776, true }, { 103787, true }, - { 103798, true }, - { 103808, true }, - { 103823, true }, - { 103835, true }, - { 103856, true }, - { 103865, true }, - { 103878, true }, - { 103891, true }, + { 103804, true }, + { 103831, true }, + { 103842, true }, + { 103852, true }, + { 103867, true }, + { 103879, true }, + { 103900, true }, { 103909, true }, - { 103918, true }, - { 103926, true }, + { 103922, true }, { 103935, true }, - { 103944, false }, - { 103961, true }, - { 103972, true }, - { 103990, true }, - { 104001, true }, + { 103953, true }, + { 103962, true }, + { 103970, true }, + { 103979, true }, + { 103988, false }, + { 104005, true }, { 104016, true }, - { 104032, true }, - { 104054, true }, - { 104062, true }, - { 104072, true }, - { 104084, true }, + { 104034, true }, + { 104045, true }, + { 104060, true }, + { 104076, true }, { 104098, true }, - { 104108, true }, - { 104126, true }, - { 104143, true }, - { 104160, true }, - { 104168, true }, - { 104192, true }, - { 104210, true }, - { 104224, true }, - { 104237, true }, - { 104255, true }, - { 104269, true }, - { 104288, true }, - { 104298, true }, - { 104310, true }, - { 104322, true }, - { 104334, true }, - { 104347, true }, - { 104354, true }, - { 104374, true }, - { 104386, true }, - { 104402, true }, - { 104412, true }, - { 104423, true }, - { 104430, true }, - { 104439, true }, - { 104458, true }, - { 104471, true }, - { 104481, true }, - { 104491, true }, - { 104499, true }, - { 104512, true }, - { 104524, true }, - { 104536, true }, - { 104551, true }, - { 104563, true }, - { 104578, true }, - { 104596, true }, - { 104607, true }, - { 104619, true }, - { 104640, false }, - { 104666, true }, - { 104680, true }, - { 104694, true }, - { 104708, true }, - { 104721, true }, - { 104734, true }, - { 104745, true }, - { 104759, true }, - { 104772, true }, - { 104784, true }, - { 104797, false }, - { 104811, true }, + { 104106, true }, + { 104116, true }, + { 104129, true }, + { 104141, true }, + { 104155, true }, + { 104165, true }, + { 104183, true }, + { 104200, true }, + { 104217, true }, + { 104225, true }, + { 104249, true }, + { 104267, true }, + { 104281, true }, + { 104294, true }, + { 104312, true }, + { 104326, true }, + { 104345, true }, + { 104355, true }, + { 104367, true }, + { 104379, true }, + { 104391, true }, + { 104404, true }, + { 104411, true }, + { 104431, true }, + { 104443, true }, + { 104459, true }, + { 104469, true }, + { 104480, true }, + { 104487, true }, + { 104496, true }, + { 104515, true }, + { 104528, true }, + { 104538, true }, + { 104548, true }, + { 104556, true }, + { 104569, true }, + { 104581, true }, + { 104593, true }, + { 104608, true }, + { 104620, true }, + { 104635, true }, + { 104653, true }, + { 104664, true }, + { 104676, true }, + { 104697, false }, + { 104723, true }, + { 104737, true }, + { 104751, true }, + { 104765, true }, + { 104778, true }, + { 104791, true }, + { 104802, true }, + { 104816, true }, { 104829, true }, - { 104842, true }, - { 104852, true }, - { 104863, true }, - { 104876, true }, - { 104888, true }, + { 104841, true }, + { 104854, false }, + { 104868, true }, + { 104886, true }, + { 104899, true }, { 104909, true }, - { 104922, true }, - { 104930, true }, - { 104944, true }, - { 104959, true }, - { 104982, true }, - { 104993, true }, - { 105007, false }, - { 105022, true }, - { 105035, true }, - { 105051, true }, - { 105063, true }, - { 105077, true }, - { 105090, true }, - { 105103, true }, - { 105117, true }, - { 105130, true }, - { 105158, true }, - { 105186, true }, - { 105196, true }, - { 105218, true }, - { 105231, true }, - { 105247, true }, - { 105260, true }, - { 105274, false }, + { 104920, true }, + { 104933, true }, + { 104945, true }, + { 104966, true }, + { 104979, true }, + { 104987, true }, + { 105001, true }, + { 105016, true }, + { 105039, true }, + { 105050, true }, + { 105064, false }, + { 105079, true }, + { 105092, true }, + { 105108, true }, + { 105120, true }, + { 105134, true }, + { 105148, true }, + { 105161, true }, + { 105174, true }, + { 105188, true }, + { 105201, true }, + { 105229, true }, + { 105257, true }, + { 105267, true }, { 105289, true }, - { 105307, true }, - { 105326, true }, - { 105334, true }, - { 105349, true }, - { 105362, true }, - { 105376, true }, - { 105392, true }, - { 105406, true }, - { 105424, true }, - { 105434, true }, - { 105443, false }, - { 105454, true }, + { 105302, true }, + { 105318, true }, + { 105331, true }, + { 105345, false }, + { 105360, true }, + { 105378, true }, + { 105397, true }, + { 105405, true }, + { 105420, true }, + { 105435, true }, + { 105449, true }, { 105465, true }, - { 105475, true }, - { 105487, true }, - { 105498, true }, - { 105525, true }, - { 105536, true }, - { 105545, true }, - { 105554, true }, + { 105479, true }, + { 105497, true }, + { 105507, true }, + { 105516, false }, + { 105527, true }, + { 105538, true }, + { 105548, true }, + { 105560, true }, { 105571, true }, - { 105585, true }, - { 105608, true }, - { 105624, true }, - { 105640, true }, - { 105661, true }, - { 105677, true }, + { 105598, true }, + { 105609, true }, + { 105618, true }, + { 105627, true }, + { 105644, true }, + { 105658, true }, + { 105681, true }, { 105697, true }, - { 105719, true }, - { 105729, true }, - { 105737, true }, - { 105746, true }, - { 105757, true }, - { 105771, true }, - { 105781, true }, - { 105796, true }, - { 105806, true }, - { 105826, true }, - { 105836, true }, - { 105850, true }, - { 105863, true }, - { 105875, true }, - { 105894, true }, - { 105907, true }, - { 105931, false }, - { 105950, true }, - { 105978, true }, - { 105992, true }, - { 106006, true }, - { 106018, true }, - { 106032, true }, - { 106042, true }, - { 106064, true }, - { 106083, true }, - { 106101, true }, - { 106109, true }, - { 106125, true }, - { 106140, true }, - { 106148, true }, - { 106159, true }, - { 106175, true }, - { 106189, true }, - { 106205, true }, - { 106220, true }, - { 106235, true }, - { 106247, true }, - { 106259, true }, + { 105713, true }, + { 105734, true }, + { 105750, true }, + { 105770, true }, + { 105792, true }, + { 105802, true }, + { 105810, true }, + { 105819, true }, + { 105830, true }, + { 105844, true }, + { 105854, true }, + { 105869, true }, + { 105879, true }, + { 105899, true }, + { 105909, true }, + { 105923, true }, + { 105936, true }, + { 105948, true }, + { 105967, true }, + { 105980, true }, + { 106004, false }, + { 106023, true }, + { 106051, true }, + { 106065, true }, + { 106079, true }, + { 106091, true }, + { 106105, true }, + { 106115, true }, + { 106137, true }, + { 106156, true }, + { 106174, true }, + { 106182, true }, + { 106198, true }, + { 106213, true }, + { 106221, true }, + { 106232, true }, + { 106248, true }, + { 106262, true }, { 106278, true }, - { 106294, false }, - { 106319, true }, - { 106338, true }, - { 106355, true }, - { 106365, true }, - { 106376, true }, - { 106388, true }, - { 106403, true }, - { 106421, true }, + { 106293, true }, + { 106308, true }, + { 106320, true }, + { 106332, true }, + { 106351, true }, + { 106367, false }, + { 106392, true }, + { 106411, true }, { 106428, true }, - { 106439, true }, - { 106453, true }, - { 106466, true }, - { 106479, true }, - { 106492, true }, - { 106505, true }, - { 106515, true }, - { 106525, true }, - { 106537, true }, - { 106549, true }, - { 106558, true }, + { 106438, true }, + { 106449, true }, + { 106461, true }, + { 106476, true }, + { 106494, true }, + { 106501, true }, + { 106512, true }, + { 106526, true }, + { 106539, true }, + { 106552, true }, { 106565, true }, - { 106575, false }, - { 106591, true }, - { 106602, true }, - { 106612, true }, - { 106630, true }, - { 106648, true }, - { 106662, true }, - { 106676, true }, - { 106699, true }, - { 106709, true }, - { 106724, true }, - { 106742, true }, - { 106759, true }, - { 106773, true }, - { 106787, true }, - { 106800, true }, - { 106812, true }, - { 106824, true }, - { 106836, true }, - { 106849, true }, - { 106862, false }, + { 106578, true }, + { 106588, true }, + { 106598, true }, + { 106610, true }, + { 106622, true }, + { 106631, true }, + { 106638, true }, + { 106648, false }, + { 106664, true }, + { 106675, true }, + { 106685, true }, + { 106703, true }, + { 106721, true }, + { 106735, true }, + { 106749, true }, + { 106772, true }, + { 106782, true }, + { 106797, true }, + { 106815, true }, + { 106832, true }, + { 106846, true }, + { 106860, true }, { 106873, true }, - { 106887, true }, - { 106900, true }, - { 106915, true }, + { 106885, true }, + { 106897, true }, + { 106909, true }, { 106922, true }, - { 106941, true }, + { 106935, false }, + { 106946, true }, { 106960, true }, - { 106975, true }, - { 106999, false }, + { 106973, true }, + { 106988, true }, + { 106995, true }, { 107014, true }, - { 107025, true }, + { 107033, true }, { 107048, true }, - { 107059, true }, - { 107070, true }, - { 107082, true }, - { 107096, true }, - { 107109, true }, - { 107122, true }, - { 107135, true }, - { 107157, true }, - { 107167, true }, - { 107187, true }, - { 107205, true }, - { 107219, true }, - { 107236, false }, - { 107251, false }, - { 107267, true }, - { 107284, true }, - { 107295, true }, - { 107317, true }, - { 107331, true }, - { 107351, true }, - { 107361, true }, - { 107372, true }, - { 107381, true }, - { 107392, true }, - { 107402, true }, - { 107415, true }, - { 107423, true }, - { 107440, true }, - { 107461, true }, - { 107475, true }, - { 107502, true }, - { 107517, true }, - { 107531, true }, - { 107551, true }, - { 107566, true }, - { 107582, true }, - { 107593, true }, - { 107605, true }, - { 107618, true }, + { 107072, false }, + { 107087, true }, + { 107098, true }, + { 107121, true }, + { 107132, true }, + { 107143, true }, + { 107155, true }, + { 107169, true }, + { 107182, true }, + { 107195, true }, + { 107208, true }, + { 107230, true }, + { 107250, true }, + { 107268, true }, + { 107282, true }, + { 107299, false }, + { 107314, false }, + { 107330, true }, + { 107347, true }, + { 107358, true }, + { 107380, true }, + { 107394, true }, + { 107414, true }, + { 107424, true }, + { 107435, true }, + { 107444, true }, + { 107455, true }, + { 107465, true }, + { 107478, true }, + { 107486, true }, + { 107503, true }, + { 107524, true }, + { 107538, true }, + { 107565, true }, + { 107580, true }, + { 107594, true }, + { 107614, true }, { 107629, true }, - { 107642, true }, + { 107645, true }, { 107656, true }, - { 107669, true }, - { 107679, true }, - { 107702, true }, - { 107712, true }, - { 107722, true }, - { 107735, true }, - { 107745, true }, - { 107762, true }, - { 107778, true }, - { 107793, true }, - { 107813, true }, - { 107823, true }, - { 107837, true }, - { 107849, true }, - { 107874, true }, - { 107888, true }, - { 107902, true }, - { 107916, true }, - { 107930, true }, - { 107944, true }, - { 107959, true }, - { 107973, true }, - { 107987, true }, - { 108001, true }, - { 108021, true }, - { 108033, true }, + { 107668, true }, + { 107681, true }, + { 107692, true }, + { 107705, true }, + { 107719, true }, + { 107732, true }, + { 107742, true }, + { 107765, true }, + { 107775, true }, + { 107785, true }, + { 107798, true }, + { 107808, true }, + { 107825, true }, + { 107841, true }, + { 107856, true }, + { 107876, true }, + { 107886, true }, + { 107900, true }, + { 107912, true }, + { 107937, true }, + { 107951, true }, + { 107965, true }, + { 107979, true }, + { 107993, true }, + { 108007, true }, + { 108022, true }, + { 108036, true }, { 108050, true }, - { 108065, true }, - { 108078, true }, + { 108064, true }, + { 108084, true }, { 108096, true }, - { 108111, true }, - { 108127, true }, - { 108139, true }, - { 108156, true }, - { 108169, true }, - { 108184, true }, - { 108193, false }, - { 108208, true }, + { 108113, true }, + { 108128, true }, + { 108141, true }, + { 108159, true }, + { 108174, true }, + { 108190, true }, + { 108202, true }, { 108219, true }, - { 108234, true }, - { 108246, true }, - { 108255, true }, - { 108272, false }, + { 108232, true }, + { 108247, true }, + { 108256, false }, + { 108271, true }, { 108282, true }, - { 108301, true }, - { 108317, true }, - { 108327, true }, - { 108343, true }, - { 108363, true }, - { 108377, true }, - { 108391, true }, - { 108410, true }, - { 108430, true }, - { 108446, true }, - { 108456, true }, - { 108471, true }, - { 108481, true }, - { 108495, true }, - { 108516, true }, - { 108526, true }, - { 108535, true }, - { 108550, true }, - { 108564, true }, - { 108578, true }, - { 108593, true }, - { 108609, true }, - { 108625, true }, - { 108633, true }, - { 108645, true }, - { 108657, true }, - { 108669, true }, - { 108682, true }, - { 108695, true }, - { 108709, true }, - { 108724, true }, - { 108738, false }, - { 108764, true }, - { 108775, true }, - { 108783, true }, - { 108794, true }, - { 108802, true }, - { 108811, true }, - { 108823, true }, - { 108835, true }, - { 108854, true }, - { 108864, true }, - { 108875, true }, - { 108885, true }, - { 108902, true }, - { 108915, true }, - { 108925, true }, - { 108936, true }, - { 108954, true }, - { 108972, true }, - { 108986, true }, - { 108996, true }, - { 109003, true }, - { 109018, true }, - { 109040, true }, - { 109048, true }, - { 109058, true }, - { 109077, true }, - { 109089, true }, - { 109099, true }, - { 109109, true }, - { 109119, true }, - { 109130, true }, - { 109143, true }, - { 109151, true }, - { 109165, true }, - { 109175, true }, - { 109186, true }, + { 108297, true }, + { 108309, true }, + { 108318, true }, + { 108335, false }, + { 108345, true }, + { 108364, true }, + { 108380, true }, + { 108390, true }, + { 108406, true }, + { 108426, true }, + { 108440, true }, + { 108454, true }, + { 108473, true }, + { 108493, true }, + { 108509, true }, + { 108519, true }, + { 108534, true }, + { 108544, true }, + { 108558, true }, + { 108579, true }, + { 108589, true }, + { 108598, true }, + { 108613, true }, + { 108627, true }, + { 108641, true }, + { 108656, true }, + { 108672, true }, + { 108688, true }, + { 108696, true }, + { 108708, true }, + { 108720, true }, + { 108732, true }, + { 108745, true }, + { 108758, true }, + { 108772, true }, + { 108787, true }, + { 108801, false }, + { 108827, true }, + { 108838, true }, + { 108846, true }, + { 108857, true }, + { 108865, true }, + { 108874, true }, + { 108886, true }, + { 108898, true }, + { 108917, true }, + { 108927, true }, + { 108938, true }, + { 108948, true }, + { 108965, true }, + { 108978, true }, + { 108988, true }, + { 108999, true }, + { 109017, true }, + { 109035, true }, + { 109049, true }, + { 109059, true }, + { 109066, true }, + { 109081, true }, + { 109103, true }, + { 109111, true }, + { 109121, true }, + { 109140, true }, + { 109152, true }, + { 109162, true }, + { 109172, true }, + { 109182, true }, { 109193, true }, - { 109201, true }, - { 109219, false }, - { 109234, true }, - { 109244, true }, - { 109253, true }, + { 109206, true }, + { 109214, true }, + { 109228, true }, + { 109238, true }, + { 109249, true }, + { 109256, true }, { 109264, true }, - { 109273, true }, - { 109281, true }, - { 109290, true }, - { 109310, true }, - { 109326, true }, - { 109335, false }, - { 109346, true }, + { 109282, true }, + { 109293, false }, + { 109308, true }, + { 109318, true }, + { 109327, true }, + { 109338, true }, + { 109347, true }, { 109355, true }, - { 109369, true }, - { 109385, true }, - { 109398, true }, - { 109411, false }, - { 109422, true }, - { 109434, true }, - { 109449, true }, - { 109459, true }, - { 109471, true }, + { 109364, true }, + { 109384, true }, + { 109400, true }, + { 109409, false }, + { 109420, true }, + { 109429, true }, + { 109445, true }, + { 109458, true }, + { 109471, false }, { 109482, true }, - { 109493, true }, - { 109505, true }, - { 109528, true }, - { 109538, true }, - { 109554, true }, - { 109569, true }, - { 109582, true }, - { 109591, true }, - { 109606, true }, - { 109619, true }, - { 109632, true }, - { 109647, true }, - { 109657, true }, - { 109680, true }, - { 109696, false }, - { 109706, true }, - { 109720, true }, - { 109731, true }, - { 109741, true }, - { 109755, true }, + { 109494, true }, + { 109509, true }, + { 109519, true }, + { 109531, true }, + { 109542, true }, + { 109553, true }, + { 109565, true }, + { 109588, true }, + { 109598, true }, + { 109614, true }, + { 109629, true }, + { 109642, true }, + { 109651, true }, + { 109666, true }, + { 109679, true }, + { 109692, true }, + { 109707, true }, + { 109717, true }, + { 109740, true }, + { 109756, false }, { 109766, true }, - { 109779, true }, - { 109792, true }, - { 109804, true }, - { 109822, true }, - { 109833, true }, - { 109846, true }, - { 109857, true }, - { 109881, true }, - { 109896, true }, - { 109921, true }, - { 109929, true }, - { 109945, false }, - { 109960, true }, - { 109972, true }, - { 109984, true }, - { 109998, true }, - { 110012, true }, - { 110026, true }, - { 110040, true }, - { 110052, true }, - { 110069, true }, + { 109780, true }, + { 109791, true }, + { 109801, true }, + { 109815, true }, + { 109826, true }, + { 109839, true }, + { 109852, true }, + { 109864, true }, + { 109882, true }, + { 109893, true }, + { 109906, true }, + { 109917, true }, + { 109941, true }, + { 109956, true }, + { 109981, true }, + { 109989, true }, + { 110005, false }, + { 110020, true }, + { 110032, true }, + { 110044, true }, + { 110058, true }, + { 110072, true }, { 110086, true }, - { 110098, true }, + { 110100, true }, { 110112, true }, - { 110134, true }, - { 110148, true }, - { 110166, true }, - { 110187, true }, - { 110204, true }, - { 110215, true }, - { 110228, true }, - { 110244, true }, - { 110256, true }, - { 110270, true }, - { 110286, true }, - { 110303, true }, - { 110317, true }, - { 110329, false }, - { 110354, true }, - { 110364, false }, - { 110390, true }, - { 110407, true }, - { 110421, true }, - { 110432, true }, - { 110462, true }, - { 110479, true }, - { 110493, true }, - { 110516, true }, - { 110534, true }, - { 110549, true }, - { 110557, true }, - { 110565, true }, - { 110573, true }, - { 110581, true }, - { 110589, true }, - { 110600, true }, - { 110610, true }, + { 110129, true }, + { 110146, true }, + { 110158, true }, + { 110172, true }, + { 110194, true }, + { 110208, true }, + { 110226, true }, + { 110247, true }, + { 110264, true }, + { 110275, true }, + { 110288, true }, + { 110304, true }, + { 110316, true }, + { 110330, true }, + { 110346, true }, + { 110363, true }, + { 110377, true }, + { 110389, false }, + { 110414, true }, + { 110424, false }, + { 110450, true }, + { 110467, true }, + { 110481, true }, + { 110492, true }, + { 110522, true }, + { 110539, true }, + { 110553, true }, + { 110576, true }, + { 110594, true }, + { 110609, true }, + { 110617, true }, { 110625, true }, - { 110639, true }, - { 110655, true }, - { 110666, true }, - { 110691, true }, - { 110700, false }, - { 110716, true }, - { 110726, false }, - { 110748, true }, - { 110763, true }, - { 110777, true }, - { 110790, true }, - { 110807, true }, + { 110633, true }, + { 110641, true }, + { 110649, true }, + { 110660, true }, + { 110670, true }, + { 110685, true }, + { 110699, true }, + { 110715, true }, + { 110726, true }, + { 110751, true }, + { 110760, false }, + { 110776, true }, + { 110786, false }, + { 110808, true }, { 110823, true }, - { 110846, true }, - { 110868, true }, - { 110886, true }, - { 110905, false }, - { 110924, true }, - { 110937, true }, - { 110950, true }, - { 110974, true }, - { 110985, true }, - { 111004, true }, - { 111032, true }, - { 111053, true }, - { 111066, true }, - { 111082, true }, - { 111102, true }, - { 111122, true }, + { 110837, true }, + { 110850, true }, + { 110867, true }, + { 110883, true }, + { 110906, true }, + { 110928, true }, + { 110946, true }, + { 110965, false }, + { 110984, true }, + { 110997, true }, + { 111010, true }, + { 111034, true }, + { 111045, true }, + { 111064, true }, + { 111092, true }, + { 111113, true }, + { 111126, true }, { 111142, true }, - { 111156, true }, - { 111177, false }, - { 111188, true }, - { 111207, true }, - { 111218, true }, - { 111230, true }, - { 111241, true }, - { 111256, true }, - { 111286, true }, - { 111297, true }, - { 111311, true }, - { 111325, true }, - { 111337, true }, - { 111348, true }, - { 111372, true }, - { 111393, true }, - { 111406, true }, - { 111423, true }, - { 111439, true }, - { 111457, true }, - { 111474, true }, - { 111488, true }, - { 111502, true }, - { 111518, true }, - { 111538, true }, - { 111549, true }, - { 111564, true }, - { 111591, true }, - { 111610, true }, - { 111625, true }, - { 111644, true }, - { 111655, true }, - { 111669, true }, - { 111686, true }, - { 111702, true }, - { 111719, true }, - { 111734, true }, - { 111750, true }, - { 111767, true }, - { 111787, true }, - { 111802, true }, - { 111821, true }, - { 111837, true }, + { 111162, true }, + { 111182, true }, + { 111202, true }, + { 111216, true }, + { 111237, false }, + { 111248, true }, + { 111267, true }, + { 111278, true }, + { 111290, true }, + { 111301, true }, + { 111316, true }, + { 111346, true }, + { 111357, true }, + { 111371, true }, + { 111385, true }, + { 111397, true }, + { 111408, true }, + { 111432, true }, + { 111453, true }, + { 111466, true }, + { 111483, true }, + { 111499, true }, + { 111517, true }, + { 111534, true }, + { 111548, true }, + { 111562, true }, + { 111578, true }, + { 111598, true }, + { 111609, true }, + { 111624, true }, + { 111651, true }, + { 111670, true }, + { 111685, true }, + { 111704, true }, + { 111715, true }, + { 111729, true }, + { 111746, true }, + { 111762, true }, + { 111779, true }, + { 111794, true }, + { 111810, true }, + { 111827, true }, { 111847, true }, - { 111860, true }, - { 111879, true }, - { 111895, true }, - { 111915, true }, - { 111927, true }, - { 111944, false }, - { 111959, true }, - { 111971, true }, - { 111984, true }, - { 111994, true }, - { 112011, true }, - { 112021, true }, - { 112038, true }, - { 112061, true }, - { 112075, true }, - { 112092, true }, - { 112107, true }, - { 112126, true }, - { 112159, true }, - { 112169, true }, - { 112183, true }, - { 112199, false }, - { 112222, true }, - { 112236, true }, - { 112248, true }, - { 112263, true }, - { 112283, true }, - { 112295, true }, - { 112313, true }, - { 112327, true }, - { 112340, true }, - { 112353, true }, - { 112366, true }, - { 112377, true }, - { 112392, true }, - { 112403, true }, - { 112417, true }, - { 112429, true }, - { 112443, true }, - { 112457, true }, - { 112465, true }, - { 112484, true }, - { 112506, true }, - { 112519, true }, - { 112529, false }, - { 112541, true }, - { 112555, true }, - { 112570, true }, - { 112586, true }, - { 112605, true }, - { 112619, true }, - { 112644, true }, - { 112658, true }, - { 112677, true }, - { 112694, true }, - { 112707, true }, - { 112724, true }, - { 112740, true }, - { 112759, true }, - { 112776, true }, + { 111862, true }, + { 111881, true }, + { 111897, true }, + { 111907, true }, + { 111920, true }, + { 111939, true }, + { 111955, true }, + { 111975, true }, + { 111987, true }, + { 112004, false }, + { 112019, true }, + { 112031, true }, + { 112044, true }, + { 112054, true }, + { 112071, true }, + { 112081, true }, + { 112098, true }, + { 112121, true }, + { 112135, true }, + { 112152, true }, + { 112167, true }, + { 112186, true }, + { 112219, true }, + { 112229, true }, + { 112243, true }, + { 112259, false }, + { 112282, true }, + { 112296, true }, + { 112308, true }, + { 112323, true }, + { 112343, true }, + { 112355, true }, + { 112373, true }, + { 112387, true }, + { 112400, true }, + { 112413, true }, + { 112426, true }, + { 112437, true }, + { 112452, true }, + { 112463, true }, + { 112477, true }, + { 112489, true }, + { 112503, true }, + { 112517, true }, + { 112525, true }, + { 112544, true }, + { 112566, true }, + { 112579, true }, + { 112589, false }, + { 112601, true }, + { 112615, true }, + { 112630, true }, + { 112646, true }, + { 112665, true }, + { 112679, true }, + { 112704, true }, + { 112718, true }, + { 112737, true }, + { 112754, true }, + { 112767, true }, { 112784, true }, { 112800, true }, - { 112816, true }, - { 112829, true }, - { 112849, true }, - { 112867, true }, - { 112881, true }, - { 112898, true }, - { 112917, true }, - { 112934, true }, - { 112953, true }, - { 112971, true }, - { 112984, true }, + { 112819, true }, + { 112836, true }, + { 112844, true }, + { 112860, true }, + { 112876, true }, + { 112889, true }, + { 112909, true }, + { 112927, true }, + { 112941, true }, + { 112958, true }, + { 112977, true }, { 112994, true }, - { 113012, true }, - { 113032, true }, - { 113041, true }, - { 113055, true }, + { 113013, true }, + { 113031, true }, + { 113044, true }, + { 113054, true }, { 113072, true }, - { 113095, true }, - { 113104, true }, - { 113120, true }, - { 113138, true }, - { 113150, true }, - { 113159, true }, - { 113172, true }, - { 113185, true }, - { 113201, true }, - { 113209, false }, - { 113221, true }, - { 113231, true }, - { 113241, true }, - { 113260, true }, - { 113275, true }, - { 113290, true }, - { 113309, true }, - { 113331, true }, + { 113092, true }, + { 113101, true }, + { 113115, true }, + { 113132, true }, + { 113155, true }, + { 113164, true }, + { 113180, true }, + { 113198, true }, + { 113210, true }, + { 113219, true }, + { 113232, true }, + { 113245, true }, + { 113261, true }, + { 113269, false }, + { 113281, true }, + { 113291, true }, + { 113301, true }, + { 113320, true }, + { 113335, true }, { 113350, true }, - { 113364, true }, - { 113376, true }, - { 113390, true }, - { 113403, false }, - { 113425, true }, - { 113443, true }, - { 113456, true }, - { 113470, true }, - { 113481, true }, - { 113495, false }, - { 113515, true }, - { 113526, false }, - { 113535, true }, - { 113550, false }, - { 113568, true }, - { 113578, true }, - { 113589, false }, - { 113604, true }, - { 113613, true }, - { 113625, true }, - { 113634, true }, - { 113647, true }, - { 113660, true }, - { 113671, true }, + { 113369, true }, + { 113391, true }, + { 113410, true }, + { 113424, true }, + { 113436, true }, + { 113450, true }, + { 113463, false }, + { 113485, true }, + { 113503, true }, + { 113516, true }, + { 113530, true }, + { 113541, true }, + { 113555, false }, + { 113575, true }, + { 113586, false }, + { 113595, true }, + { 113610, false }, + { 113628, true }, + { 113638, true }, + { 113649, false }, + { 113664, true }, + { 113673, true }, { 113685, true }, - { 113698, true }, - { 113715, false }, - { 113732, true }, - { 113739, true }, - { 113747, true }, - { 113756, true }, - { 113768, true }, - { 113791, true }, - { 113805, true }, - { 113819, true }, - { 113836, true }, - { 113852, true }, - { 113866, true }, - { 113873, true }, - { 113884, true }, - { 113899, true }, - { 113911, true }, - { 113919, true }, - { 113934, false }, + { 113694, true }, + { 113707, true }, + { 113720, true }, + { 113731, true }, + { 113745, true }, + { 113758, true }, + { 113775, false }, + { 113792, true }, + { 113799, true }, + { 113807, true }, + { 113816, true }, + { 113828, true }, + { 113851, true }, + { 113865, true }, + { 113879, true }, + { 113896, true }, + { 113912, true }, + { 113926, true }, + { 113933, true }, { 113944, true }, - { 113956, true }, - { 113968, true }, - { 113983, true }, - { 114012, true }, - { 114026, true }, - { 114034, true }, - { 114042, true }, - { 114051, true }, - { 114064, true }, + { 113959, true }, + { 113971, true }, + { 113979, true }, + { 113994, false }, + { 114004, true }, + { 114016, true }, + { 114028, true }, + { 114043, true }, { 114072, true }, - { 114083, true }, + { 114086, true }, { 114094, true }, - { 114101, true }, - { 114110, true }, - { 114120, true }, - { 114140, true }, - { 114152, true }, - { 114163, false }, - { 114172, false }, - { 114193, true }, - { 114204, true }, - { 114213, true }, - { 114227, true }, - { 114244, true }, - { 114260, true }, - { 114277, true }, - { 114289, true }, - { 114302, true }, - { 114314, true }, - { 114328, true }, - { 114346, true }, - { 114360, true }, - { 114376, false }, - { 114394, true }, - { 114411, true }, - { 114433, true }, - { 114444, true }, - { 114456, true }, - { 114470, true }, - { 114481, true }, - { 114495, true }, - { 114506, true }, - { 114517, true }, - { 114531, true }, - { 114542, true }, - { 114558, true }, - { 114587, true }, - { 114606, true }, - { 114625, true }, - { 114641, true }, - { 114667, true }, - { 114681, true }, - { 114698, true }, - { 114717, true }, - { 114734, true }, - { 114745, true }, - { 114753, true }, - { 114765, true }, - { 114778, true }, - { 114793, true }, - { 114806, true }, - { 114819, true }, - { 114833, true }, - { 114845, true }, - { 114857, true }, - { 114870, true }, - { 114885, true }, - { 114898, true }, - { 114910, true }, - { 114924, true }, - { 114935, true }, + { 114102, true }, + { 114111, true }, + { 114124, true }, + { 114132, true }, + { 114143, true }, + { 114154, true }, + { 114161, true }, + { 114170, true }, + { 114180, true }, + { 114200, true }, + { 114212, true }, + { 114223, false }, + { 114232, false }, + { 114253, true }, + { 114264, true }, + { 114273, true }, + { 114287, true }, + { 114304, true }, + { 114320, true }, + { 114337, true }, + { 114349, true }, + { 114362, true }, + { 114374, true }, + { 114388, true }, + { 114406, true }, + { 114420, true }, + { 114436, false }, + { 114454, true }, + { 114471, true }, + { 114493, true }, + { 114504, true }, + { 114516, true }, + { 114530, true }, + { 114541, true }, + { 114555, true }, + { 114566, true }, + { 114577, true }, + { 114591, true }, + { 114602, true }, + { 114618, true }, + { 114647, true }, + { 114666, true }, + { 114685, true }, + { 114701, true }, + { 114727, true }, + { 114741, true }, + { 114758, true }, + { 114777, true }, + { 114794, true }, + { 114805, true }, + { 114813, true }, + { 114825, true }, + { 114838, true }, + { 114853, true }, + { 114866, true }, + { 114879, true }, + { 114893, true }, + { 114905, true }, + { 114917, true }, + { 114930, true }, + { 114945, true }, { 114958, true }, - { 114976, true }, - { 114997, true }, - { 115016, true }, - { 115034, true }, - { 115051, true }, - { 115062, true }, - { 115084, true }, - { 115096, true }, - { 115104, true }, - { 115125, true }, - { 115146, true }, + { 114970, true }, + { 114984, true }, + { 114995, true }, + { 115018, true }, + { 115036, true }, + { 115057, true }, + { 115076, true }, + { 115094, true }, + { 115111, true }, + { 115122, true }, + { 115144, true }, + { 115156, true }, { 115164, true }, - { 115180, true }, - { 115192, true }, - { 115204, true }, - { 115222, true }, - { 115232, true }, - { 115246, true }, - { 115262, true }, - { 115288, false }, - { 115317, true }, - { 115328, true }, - { 115343, true }, - { 115359, true }, - { 115374, true }, + { 115185, true }, + { 115206, true }, + { 115224, true }, + { 115240, true }, + { 115252, true }, + { 115264, true }, + { 115282, true }, + { 115292, true }, + { 115306, true }, + { 115322, true }, + { 115348, false }, + { 115377, true }, { 115388, true }, - { 115415, true }, - { 115433, false }, - { 115444, true }, - { 115454, true }, - { 115469, true }, - { 115480, true }, - { 115498, true }, - { 115521, true }, - { 115539, true }, - { 115552, true }, - { 115563, false }, - { 115577, true }, + { 115403, true }, + { 115419, true }, + { 115434, true }, + { 115448, true }, + { 115475, true }, + { 115493, false }, + { 115504, true }, + { 115514, true }, + { 115529, true }, + { 115540, true }, + { 115558, true }, + { 115581, true }, { 115599, true }, - { 115618, true }, - { 115632, true }, - { 115644, false }, - { 115664, true }, - { 115680, true }, - { 115690, true }, - { 115704, true }, - { 115722, true }, - { 115734, true }, - { 115744, true }, - { 115756, true }, + { 115612, true }, + { 115623, false }, + { 115637, true }, + { 115659, true }, + { 115678, true }, + { 115692, true }, + { 115704, false }, + { 115724, true }, + { 115740, true }, + { 115750, true }, { 115764, true }, - { 115778, true }, - { 115790, true }, - { 115808, true }, - { 115820, true }, - { 115832, true }, - { 115844, true }, - { 115856, true }, + { 115782, true }, + { 115794, true }, + { 115804, true }, + { 115816, true }, + { 115824, true }, + { 115838, true }, + { 115850, true }, { 115868, true }, { 115880, true }, { 115892, true }, { 115904, true }, - { 115920, true }, - { 115929, true }, - { 115943, true }, - { 115959, true }, - { 115972, true }, - { 115995, true }, - { 116008, true }, - { 116016, false }, + { 115916, true }, + { 115928, true }, + { 115940, true }, + { 115952, true }, + { 115964, true }, + { 115980, true }, + { 115989, true }, + { 116003, true }, + { 116019, true }, { 116032, true }, - { 116050, true }, - { 116064, true }, - { 116074, true }, - { 116083, true }, - { 116096, true }, - { 116112, true }, - { 116129, false }, + { 116055, true }, + { 116068, true }, + { 116076, false }, + { 116092, true }, + { 116110, true }, + { 116124, true }, + { 116134, true }, { 116143, true }, - { 116159, false }, - { 116171, true }, - { 116178, true }, - { 116193, true }, - { 116208, true }, - { 116220, true }, + { 116156, true }, + { 116172, true }, + { 116189, false }, + { 116203, true }, + { 116219, false }, + { 116231, true }, { 116238, true }, - { 116257, true }, - { 116279, true }, - { 116299, true }, - { 116316, true }, - { 116334, true }, - { 116352, true }, - { 116374, true }, - { 116391, true }, - { 116405, true }, - { 116421, true }, - { 116438, true }, - { 116459, true }, - { 116474, true }, - { 116493, true }, - { 116517, true }, + { 116253, true }, + { 116268, true }, + { 116280, true }, + { 116298, true }, + { 116317, true }, + { 116339, true }, + { 116359, true }, + { 116376, true }, + { 116394, true }, + { 116412, true }, + { 116434, true }, + { 116451, true }, + { 116465, true }, + { 116481, true }, + { 116498, true }, + { 116519, true }, { 116534, true }, - { 116547, true }, - { 116558, true }, - { 116571, true }, - { 116584, true }, - { 116598, true }, - { 116610, true }, - { 116620, true }, + { 116553, true }, + { 116577, true }, + { 116594, true }, + { 116607, true }, + { 116618, true }, { 116631, true }, - { 116646, true }, - { 116657, true }, - { 116669, true }, - { 116678, true }, - { 116688, true }, - { 116697, true }, - { 116708, true }, - { 116733, true }, - { 116745, true }, - { 116763, true }, - { 116779, true }, - { 116790, true }, - { 116813, true }, - { 116834, true }, - { 116852, true }, - { 116871, false }, - { 116885, true }, - { 116896, true }, - { 116909, true }, - { 116923, true }, - { 116938, true }, - { 116949, true }, - { 116962, true }, - { 116976, true }, - { 116989, true }, - { 117003, true }, - { 117016, true }, - { 117027, true }, - { 117040, true }, - { 117050, true }, - { 117064, true }, - { 117073, true }, - { 117088, true }, - { 117099, true }, - { 117112, true }, - { 117125, true }, + { 116644, true }, + { 116658, true }, + { 116670, true }, + { 116680, true }, + { 116691, true }, + { 116706, true }, + { 116717, true }, + { 116729, true }, + { 116738, true }, + { 116748, true }, + { 116757, true }, + { 116768, true }, + { 116793, true }, + { 116805, true }, + { 116823, true }, + { 116839, true }, + { 116850, true }, + { 116873, true }, + { 116894, true }, + { 116912, true }, + { 116931, false }, + { 116945, true }, + { 116956, true }, + { 116969, true }, + { 116983, true }, + { 116998, true }, + { 117009, true }, + { 117020, true }, + { 117033, true }, + { 117047, true }, + { 117060, true }, + { 117074, true }, + { 117087, true }, + { 117098, true }, + { 117111, true }, + { 117121, true }, + { 117135, true }, { 117144, true }, - { 117162, true }, - { 117178, true }, - { 117191, true }, - { 117203, true }, - { 117218, true }, - { 117228, true }, - { 117238, true }, - { 117252, true }, - { 117263, true }, - { 117290, true }, - { 117304, true }, - { 117312, true }, + { 117159, true }, + { 117170, true }, + { 117183, true }, + { 117196, true }, + { 117215, true }, + { 117233, true }, + { 117249, true }, + { 117262, true }, + { 117274, true }, + { 117289, true }, + { 117299, true }, + { 117309, true }, + { 117323, true }, { 117334, true }, - { 117348, true }, { 117361, true }, { 117375, true }, - { 117394, true }, - { 117413, true }, + { 117383, true }, + { 117405, true }, + { 117419, true }, { 117432, true }, - { 117451, true }, - { 117471, true }, - { 117491, true }, - { 117511, true }, - { 117529, true }, - { 117548, true }, - { 117567, true }, - { 117586, true }, - { 117605, true }, + { 117446, true }, + { 117465, true }, + { 117484, true }, + { 117503, true }, + { 117522, true }, + { 117542, true }, + { 117562, true }, + { 117582, true }, + { 117600, true }, { 117619, true }, - { 117631, true }, - { 117643, true }, - { 117656, false }, - { 117678, true }, - { 117693, true }, - { 117705, true }, - { 117713, true }, - { 117738, true }, - { 117754, true }, - { 117763, true }, - { 117777, true }, - { 117789, true }, - { 117806, true }, - { 117819, true }, + { 117638, true }, + { 117657, true }, + { 117676, true }, + { 117690, true }, + { 117702, true }, + { 117714, true }, + { 117727, false }, + { 117749, true }, + { 117764, true }, + { 117776, true }, + { 117784, true }, + { 117809, true }, + { 117825, true }, { 117834, true }, - { 117850, true }, - { 117863, true }, - { 117875, true }, - { 117885, true }, - { 117896, true }, - { 117910, true }, - { 117925, true }, - { 117938, true }, - { 117949, true }, - { 117963, true }, - { 117978, true }, - { 117987, true }, - { 118000, true }, - { 118016, true }, - { 118035, true }, + { 117848, true }, + { 117860, true }, + { 117877, true }, + { 117890, true }, + { 117905, true }, + { 117921, true }, + { 117934, true }, + { 117946, true }, + { 117956, true }, + { 117967, true }, + { 117981, true }, + { 117996, true }, + { 118009, true }, + { 118020, true }, + { 118034, true }, { 118049, true }, - { 118064, true }, - { 118075, true }, - { 118085, true }, - { 118097, true }, - { 118112, true }, - { 118129, true }, - { 118160, true }, - { 118175, true }, - { 118196, true }, - { 118210, true }, - { 118228, true }, - { 118238, true }, - { 118248, true }, - { 118261, true }, - { 118276, true }, - { 118288, true }, - { 118303, true }, - { 118316, true }, - { 118328, true }, - { 118336, true }, - { 118354, false }, - { 118364, true }, - { 118379, true }, - { 118396, true }, - { 118411, true }, - { 118424, true }, - { 118436, true }, - { 118452, true }, - { 118472, true }, - { 118487, true }, - { 118503, true }, - { 118517, true }, - { 118529, true }, - { 118542, true }, - { 118552, true }, - { 118566, true }, - { 118576, true }, - { 118596, true }, - { 118605, true }, - { 118615, true }, - { 118626, false }, - { 118635, true }, - { 118648, true }, + { 118058, true }, + { 118071, true }, + { 118087, true }, + { 118106, true }, + { 118120, true }, + { 118135, true }, + { 118146, true }, + { 118156, true }, + { 118168, true }, + { 118183, true }, + { 118200, true }, + { 118231, true }, + { 118246, true }, + { 118267, true }, + { 118281, true }, + { 118299, true }, + { 118309, true }, + { 118319, true }, + { 118332, true }, + { 118347, true }, + { 118359, true }, + { 118374, true }, + { 118387, true }, + { 118399, true }, + { 118407, true }, + { 118425, false }, + { 118435, true }, + { 118450, true }, + { 118467, true }, + { 118482, true }, + { 118495, true }, + { 118507, true }, + { 118523, true }, + { 118543, true }, + { 118558, true }, + { 118574, true }, + { 118588, true }, + { 118600, true }, + { 118613, true }, + { 118623, true }, + { 118637, true }, + { 118647, true }, { 118667, true }, - { 118677, true }, - { 118688, true }, - { 118701, true }, - { 118708, true }, - { 118724, true }, - { 118735, true }, - { 118742, true }, - { 118751, true }, + { 118676, true }, + { 118686, true }, + { 118697, false }, + { 118706, true }, + { 118719, true }, + { 118738, true }, + { 118748, true }, { 118759, true }, - { 118769, true }, - { 118790, true }, - { 118802, true }, - { 118811, true }, - { 118819, true }, - { 118828, true }, - { 118839, true }, - { 118849, true }, - { 118860, true }, - { 118867, true }, - { 118876, true }, - { 118884, true }, - { 118895, true }, - { 118907, true }, - { 118915, true }, - { 118923, true }, - { 118937, true }, + { 118772, true }, + { 118779, true }, + { 118795, true }, + { 118806, true }, + { 118813, true }, + { 118822, true }, + { 118830, true }, + { 118840, true }, + { 118861, true }, + { 118873, true }, + { 118882, true }, + { 118890, true }, + { 118899, true }, + { 118910, true }, + { 118920, true }, + { 118931, true }, + { 118938, true }, { 118947, true }, - { 118963, true }, - { 118975, true }, - { 119005, true }, - { 119025, true }, - { 119039, false }, - { 119057, false }, - { 119073, true }, - { 119088, true }, - { 119109, true }, - { 119123, true }, - { 119142, true }, - { 119153, true }, - { 119163, true }, - { 119174, true }, - { 119188, true }, - { 119202, true }, - { 119215, true }, - { 119225, false }, - { 119241, true }, - { 119260, true }, + { 118955, true }, + { 118966, true }, + { 118978, true }, + { 118986, true }, + { 118994, true }, + { 119008, true }, + { 119018, true }, + { 119034, true }, + { 119046, true }, + { 119076, true }, + { 119096, true }, + { 119110, false }, + { 119128, false }, + { 119144, true }, + { 119159, true }, + { 119180, true }, + { 119194, true }, + { 119213, true }, + { 119224, true }, + { 119234, true }, + { 119245, true }, + { 119259, true }, + { 119273, true }, { 119286, true }, - { 119309, true }, - { 119326, true }, - { 119339, true }, - { 119355, true }, - { 119363, true }, - { 119376, true }, - { 119383, true }, - { 119395, true }, - { 119405, true }, - { 119417, true }, - { 119437, false }, - { 119455, true }, - { 119468, true }, - { 119479, true }, - { 119489, true }, - { 119503, false }, - { 119519, true }, - { 119530, true }, + { 119296, false }, + { 119312, true }, + { 119331, true }, + { 119357, true }, + { 119380, true }, + { 119397, true }, + { 119410, true }, + { 119426, true }, + { 119434, true }, + { 119447, true }, + { 119454, true }, + { 119466, true }, + { 119476, true }, + { 119488, true }, + { 119508, false }, + { 119526, true }, { 119539, true }, - { 119547, true }, - { 119557, true }, - { 119574, true }, - { 119585, true }, + { 119550, true }, + { 119560, true }, + { 119574, false }, + { 119590, true }, { 119601, true }, - { 119612, true }, - { 119624, true }, - { 119634, false }, - { 119649, true }, - { 119664, true }, - { 119679, true }, - { 119698, true }, - { 119718, true }, - { 119729, true }, - { 119743, true }, - { 119758, true }, - { 119774, true }, - { 119796, true }, - { 119809, true }, - { 119828, true }, - { 119841, true }, - { 119850, true }, - { 119865, true }, - { 119878, true }, - { 119890, true }, - { 119907, true }, - { 119931, true }, - { 119944, true }, + { 119610, true }, + { 119618, true }, + { 119628, true }, + { 119645, true }, + { 119656, true }, + { 119672, true }, + { 119683, true }, + { 119695, true }, + { 119705, false }, + { 119720, true }, + { 119735, true }, + { 119750, true }, + { 119769, true }, + { 119789, true }, + { 119800, true }, + { 119814, true }, + { 119829, true }, + { 119845, true }, + { 119867, true }, + { 119880, true }, + { 119899, true }, + { 119912, true }, + { 119921, true }, + { 119936, true }, + { 119949, true }, { 119961, true }, - { 119973, true }, - { 119986, true }, - { 119999, true }, - { 120014, true }, - { 120021, true }, - { 120034, true }, - { 120047, true }, - { 120061, true }, - { 120078, true }, - { 120093, true }, - { 120107, true }, - { 120119, true }, - { 120127, true }, - { 120142, true }, - { 120157, true }, - { 120172, true }, - { 120191, true }, - { 120210, true }, - { 120229, true }, - { 120244, true }, - { 120254, true }, - { 120267, true }, + { 119978, true }, + { 120002, true }, + { 120015, true }, + { 120032, true }, + { 120044, true }, + { 120057, true }, + { 120070, true }, + { 120085, true }, + { 120092, true }, + { 120105, true }, + { 120118, true }, + { 120132, true }, + { 120149, true }, + { 120164, true }, + { 120178, true }, + { 120190, true }, + { 120198, true }, + { 120213, true }, + { 120228, true }, + { 120243, true }, + { 120262, true }, { 120281, true }, - { 120292, true }, - { 120307, true }, - { 120323, true }, - { 120336, true }, - { 120349, true }, - { 120369, true }, + { 120300, true }, + { 120315, true }, + { 120325, true }, + { 120338, true }, + { 120352, true }, + { 120363, true }, { 120378, true }, { 120394, true }, { 120407, true }, - { 120422, true }, - { 120431, true }, - { 120444, true }, - { 120462, true }, - { 120470, true }, - { 120483, true }, - { 120501, true }, - { 120519, true }, - { 120550, true }, - { 120580, true }, - { 120602, true }, - { 120618, true }, - { 120629, false }, - { 120642, true }, - { 120654, true }, - { 120669, true }, - { 120686, false }, - { 120705, true }, - { 120716, true }, - { 120732, false }, - { 120740, true }, - { 120750, true }, - { 120762, true }, - { 120778, true }, - { 120789, true }, - { 120806, true }, - { 120819, true }, - { 120839, true }, - { 120849, true }, - { 120860, true }, - { 120870, true }, - { 120885, true }, - { 120900, true }, - { 120917, true }, - { 120932, true }, + { 120427, true }, + { 120436, true }, + { 120452, true }, + { 120465, true }, + { 120480, true }, + { 120489, true }, + { 120502, true }, + { 120520, true }, + { 120528, true }, + { 120541, true }, + { 120559, true }, + { 120577, true }, + { 120608, true }, + { 120638, true }, + { 120660, true }, + { 120676, true }, + { 120687, false }, + { 120700, true }, + { 120712, true }, + { 120727, true }, + { 120744, false }, + { 120763, true }, + { 120774, true }, + { 120790, false }, + { 120798, true }, + { 120808, true }, + { 120820, true }, + { 120836, true }, + { 120847, true }, + { 120864, true }, + { 120877, true }, + { 120897, true }, + { 120907, true }, + { 120918, true }, + { 120928, true }, { 120943, true }, - { 120956, true }, - { 120969, true }, - { 120982, true }, - { 120999, true }, - { 121011, true }, - { 121028, true }, - { 121041, true }, - { 121050, true }, - { 121061, true }, - { 121071, true }, - { 121085, true }, - { 121096, true }, - { 121104, true }, - { 121113, true }, - { 121127, true }, - { 121137, true }, - { 121149, true }, - { 121159, true }, - { 121168, true }, - { 121179, true }, - { 121187, true }, - { 121194, true }, - { 121205, false }, - { 121225, true }, - { 121232, false }, - { 121248, true }, - { 121260, true }, - { 121280, true }, - { 121294, false }, - { 121305, true }, - { 121321, true }, - { 121331, true }, - { 121344, true }, - { 121362, true }, - { 121376, true }, - { 121393, true }, - { 121412, true }, - { 121435, true }, - { 121447, true }, - { 121469, true }, - { 121479, true }, + { 120958, true }, + { 120975, true }, + { 120990, true }, + { 121001, true }, + { 121014, true }, + { 121027, true }, + { 121040, true }, + { 121057, true }, + { 121069, true }, + { 121086, true }, + { 121099, true }, + { 121108, true }, + { 121119, true }, + { 121129, true }, + { 121143, true }, + { 121154, true }, + { 121162, true }, + { 121171, true }, + { 121185, true }, + { 121195, true }, + { 121207, true }, + { 121217, true }, + { 121226, true }, + { 121237, true }, + { 121245, true }, + { 121252, true }, + { 121263, false }, + { 121283, true }, + { 121290, false }, + { 121306, true }, + { 121318, true }, + { 121338, true }, + { 121352, false }, + { 121363, true }, + { 121379, true }, + { 121389, true }, + { 121402, true }, + { 121420, true }, + { 121434, true }, + { 121451, true }, + { 121470, true }, { 121493, true }, - { 121503, true }, - { 121514, true }, - { 121523, true }, - { 121532, true }, - { 121545, true }, - { 121562, true }, - { 121578, true }, - { 121592, true }, - { 121600, true }, - { 121614, true }, - { 121633, true }, - { 121649, true }, - { 121663, true }, - { 121676, true }, - { 121693, true }, - { 121708, true }, - { 121719, true }, - { 121730, true }, - { 121744, true }, - { 121758, true }, - { 121773, true }, - { 121794, true }, - { 121810, true }, - { 121828, true }, - { 121846, true }, - { 121859, true }, - { 121871, true }, - { 121887, true }, - { 121911, true }, - { 121928, true }, - { 121939, true }, - { 121958, true }, - { 121966, true }, - { 121980, true }, - { 121989, true }, - { 121996, false }, - { 122006, false }, - { 122026, true }, - { 122036, false }, - { 122055, false }, - { 122068, false }, - { 122079, false }, - { 122091, true }, - { 122112, true }, - { 122125, true }, - { 122143, true }, - { 122161, true }, + { 121505, true }, + { 121527, true }, + { 121537, true }, + { 121551, true }, + { 121561, true }, + { 121572, true }, + { 121581, true }, + { 121590, true }, + { 121603, true }, + { 121620, true }, + { 121636, true }, + { 121650, true }, + { 121658, true }, + { 121672, true }, + { 121691, true }, + { 121707, true }, + { 121721, true }, + { 121734, true }, + { 121751, true }, + { 121766, true }, + { 121777, true }, + { 121788, true }, + { 121802, true }, + { 121816, true }, + { 121831, true }, + { 121852, true }, + { 121868, true }, + { 121886, true }, + { 121904, true }, + { 121917, true }, + { 121929, true }, + { 121945, true }, + { 121969, true }, + { 121986, true }, + { 121997, true }, + { 122016, true }, + { 122024, true }, + { 122038, true }, + { 122047, true }, + { 122054, false }, + { 122064, false }, + { 122084, true }, + { 122094, false }, + { 122113, false }, + { 122126, false }, + { 122137, false }, + { 122149, true }, { 122170, true }, - { 122186, true }, - { 122210, false }, - { 122226, true }, + { 122183, true }, + { 122201, true }, + { 122219, true }, + { 122228, true }, { 122244, true }, - { 122256, true }, - { 122273, true }, - { 122287, true }, + { 122268, false }, + { 122284, true }, { 122302, true }, - { 122321, true }, - { 122335, true }, - { 122353, true }, - { 122363, false }, - { 122392, true }, - { 122416, true }, - { 122426, true }, - { 122437, true }, - { 122456, true }, - { 122469, true }, + { 122314, true }, + { 122331, true }, + { 122345, true }, + { 122360, true }, + { 122379, true }, + { 122393, true }, + { 122411, true }, + { 122421, false }, + { 122450, true }, + { 122474, true }, { 122484, true }, - { 122498, true }, - { 122513, true }, - { 122531, true }, - { 122541, false }, + { 122495, true }, + { 122514, true }, + { 122527, true }, + { 122542, true }, { 122556, true }, - { 122564, true }, - { 122577, false }, - { 122591, true }, - { 122602, true }, - { 122610, true }, - { 122618, true }, - { 122632, true }, - { 122654, true }, - { 122666, true }, - { 122678, true }, - { 122693, true }, - { 122713, true }, + { 122571, true }, + { 122589, true }, + { 122599, false }, + { 122614, true }, + { 122622, true }, + { 122635, false }, + { 122649, true }, + { 122660, true }, + { 122668, true }, + { 122676, true }, + { 122690, true }, + { 122712, true }, + { 122724, true }, { 122736, true }, - { 122755, true }, - { 122774, true }, - { 122793, true }, - { 122812, true }, - { 122831, true }, - { 122850, true }, - { 122869, true }, - { 122886, true }, - { 122904, true }, - { 122921, true }, - { 122934, true }, - { 122948, true }, - { 122963, true }, - { 122978, true }, - { 122991, false }, - { 123005, true }, - { 123029, true }, - { 123046, true }, - { 123064, true }, - { 123080, true }, - { 123098, true }, - { 123115, true }, - { 123131, true }, - { 123144, true }, - { 123161, true }, - { 123193, true }, - { 123210, true }, - { 123218, true }, - { 123231, true }, - { 123245, true }, - { 123272, true }, - { 123288, true }, - { 123304, true }, - { 123318, true }, - { 123331, true }, - { 123344, true }, - { 123354, true }, - { 123367, true }, - { 123377, true }, - { 123392, true }, - { 123407, false }, - { 123417, false }, - { 123427, true }, - { 123438, true }, - { 123451, true }, - { 123463, true }, - { 123483, true }, - { 123494, true }, - { 123515, true }, - { 123531, true }, - { 123548, true }, - { 123567, true }, - { 123577, true }, - { 123588, true }, - { 123597, true }, - { 123606, true }, - { 123619, true }, - { 123648, true }, + { 122751, true }, + { 122771, true }, + { 122794, true }, + { 122813, true }, + { 122832, true }, + { 122851, true }, + { 122870, true }, + { 122889, true }, + { 122908, true }, + { 122927, true }, + { 122944, true }, + { 122962, true }, + { 122979, true }, + { 122992, true }, + { 123006, true }, + { 123021, true }, + { 123036, true }, + { 123049, false }, + { 123063, true }, + { 123087, true }, + { 123104, true }, + { 123122, true }, + { 123138, true }, + { 123156, true }, + { 123173, true }, + { 123189, true }, + { 123202, true }, + { 123219, true }, + { 123251, true }, + { 123268, true }, + { 123276, true }, + { 123289, true }, + { 123303, true }, + { 123330, true }, + { 123346, true }, + { 123362, true }, + { 123376, true }, + { 123389, true }, + { 123402, true }, + { 123412, true }, + { 123425, true }, + { 123435, true }, + { 123450, true }, + { 123465, false }, + { 123475, false }, + { 123485, true }, + { 123497, true }, + { 123508, true }, + { 123521, true }, + { 123533, true }, + { 123553, true }, + { 123564, true }, + { 123585, true }, + { 123601, true }, + { 123618, true }, + { 123637, true }, + { 123647, true }, + { 123658, true }, { 123667, true }, - { 123684, true }, - { 123707, true }, - { 123715, true }, - { 123733, false }, - { 123747, false }, - { 123758, true }, - { 123771, true }, - { 123782, true }, - { 123795, true }, - { 123812, true }, - { 123825, true }, - { 123836, false }, - { 123848, true }, - { 123857, true }, - { 123867, true }, - { 123876, true }, - { 123886, true }, - { 123899, true }, - { 123909, true }, - { 123922, true }, - { 123932, true }, - { 123941, true }, - { 123954, true }, - { 123973, true }, - { 123984, true }, - { 123998, true }, - { 124013, true }, - { 124027, true }, - { 124038, true }, - { 124050, true }, - { 124058, true }, - { 124072, true }, - { 124087, false }, - { 124101, true }, - { 124113, true }, + { 123676, true }, + { 123689, true }, + { 123718, true }, + { 123737, true }, + { 123754, true }, + { 123777, true }, + { 123785, true }, + { 123803, false }, + { 123817, false }, + { 123828, true }, + { 123841, true }, + { 123852, true }, + { 123865, true }, + { 123882, true }, + { 123895, true }, + { 123906, false }, + { 123918, true }, + { 123927, true }, + { 123937, true }, + { 123946, true }, + { 123956, true }, + { 123969, true }, + { 123979, true }, + { 123992, true }, + { 124002, true }, + { 124011, true }, + { 124024, true }, + { 124043, true }, + { 124054, true }, + { 124068, true }, + { 124083, true }, + { 124097, true }, + { 124108, true }, + { 124120, true }, { 124128, true }, { 124142, true }, - { 124151, true }, - { 124170, true }, - { 124191, true }, - { 124206, true }, - { 124218, true }, - { 124229, true }, - { 124242, true }, - { 124252, true }, - { 124273, true }, - { 124291, true }, + { 124157, false }, + { 124171, true }, + { 124183, true }, + { 124198, true }, + { 124212, true }, + { 124221, true }, + { 124240, true }, + { 124261, true }, + { 124276, true }, + { 124288, true }, + { 124299, true }, { 124312, true }, - { 124338, true }, + { 124322, true }, + { 124343, true }, { 124361, true }, - { 124394, true }, - { 124413, true }, - { 124438, true }, - { 124462, true }, - { 124473, true }, - { 124484, true }, - { 124497, true }, + { 124382, true }, + { 124408, true }, + { 124431, true }, + { 124464, true }, + { 124483, true }, { 124508, true }, - { 124522, true }, - { 124533, true }, + { 124532, true }, { 124543, true }, - { 124551, true }, - { 124558, true }, - { 124569, true }, - { 124580, true }, - { 124590, true }, - { 124599, true }, - { 124614, true }, - { 124629, true }, - { 124640, true }, - { 124649, true }, + { 124554, true }, + { 124567, true }, + { 124578, true }, + { 124592, true }, + { 124603, true }, + { 124613, true }, + { 124621, true }, + { 124628, true }, + { 124639, true }, + { 124650, true }, { 124660, true }, - { 124671, true }, - { 124685, true }, - { 124694, true }, + { 124669, true }, + { 124684, true }, + { 124699, true }, { 124710, true }, - { 124718, true }, + { 124719, true }, { 124730, true }, - { 124740, true }, - { 124759, true }, - { 124767, true }, + { 124741, true }, + { 124755, true }, + { 124764, true }, { 124780, true }, - { 124789, true }, - { 124810, true }, - { 124829, true }, - { 124845, true }, - { 124860, true }, - { 124873, true }, - { 124890, true }, - { 124906, true }, - { 124915, true }, - { 124923, true }, - { 124937, true }, - { 124956, false }, - { 124965, true }, - { 124987, true }, - { 125009, true }, - { 125024, true }, - { 125037, false }, - { 125051, true }, - { 125059, true }, - { 125071, true }, - { 125082, true }, - { 125094, true }, - { 125104, true }, - { 125113, true }, - { 125124, true }, - { 125134, true }, - { 125150, true }, - { 125160, true }, - { 125170, true }, - { 125184, true }, - { 125199, true }, + { 124788, true }, + { 124800, true }, + { 124812, true }, + { 124828, true }, + { 124838, true }, + { 124857, true }, + { 124865, true }, + { 124878, true }, + { 124887, true }, + { 124908, true }, + { 124927, true }, + { 124943, true }, + { 124958, true }, + { 124971, true }, + { 124988, true }, + { 125004, true }, + { 125013, true }, + { 125021, true }, + { 125035, true }, + { 125054, false }, + { 125063, true }, + { 125085, true }, + { 125107, true }, + { 125122, true }, + { 125135, false }, + { 125149, true }, + { 125157, true }, + { 125169, true }, + { 125180, true }, + { 125192, true }, + { 125202, true }, { 125211, true }, - { 125220, true }, - { 125233, true }, - { 125243, true }, - { 125256, true }, - { 125267, true }, - { 125290, false }, - { 125304, true }, - { 125316, true }, - { 125329, true }, - { 125342, true }, - { 125353, true }, - { 125367, true }, - { 125381, true }, - { 125391, true }, - { 125400, true }, - { 125410, true }, - { 125420, true }, - { 125435, true }, - { 125447, true }, - { 125459, true }, - { 125473, true }, - { 125490, true }, - { 125500, false }, - { 125509, false }, - { 125528, true }, - { 125544, true }, - { 125559, true }, - { 125569, true }, - { 125584, true }, - { 125597, true }, - { 125609, true }, - { 125622, true }, - { 125640, true }, - { 125655, true }, - { 125670, false }, - { 125686, true }, - { 125698, true }, - { 125710, true }, - { 125721, true }, - { 125734, false }, - { 125749, true }, - { 125764, true }, - { 125774, true }, - { 125794, true }, - { 125804, true }, - { 125818, true }, - { 125832, true }, - { 125844, true }, - { 125855, true }, - { 125871, true }, - { 125882, true }, - { 125900, true }, - { 125918, true }, - { 125931, true }, - { 125952, false }, - { 125971, true }, - { 125991, true }, - { 126013, true }, - { 126025, true }, - { 126043, true }, - { 126058, true }, - { 126070, true }, - { 126086, true }, - { 126101, true }, - { 126117, true }, - { 126133, true }, - { 126149, true }, - { 126166, true }, - { 126188, true }, + { 125222, true }, + { 125232, true }, + { 125248, true }, + { 125258, true }, + { 125268, true }, + { 125282, true }, + { 125297, true }, + { 125309, true }, + { 125318, true }, + { 125331, true }, + { 125341, true }, + { 125354, true }, + { 125365, true }, + { 125388, false }, + { 125402, true }, + { 125414, true }, + { 125427, true }, + { 125440, true }, + { 125451, true }, + { 125465, true }, + { 125479, true }, + { 125489, true }, + { 125498, true }, + { 125508, true }, + { 125518, true }, + { 125533, true }, + { 125545, true }, + { 125557, true }, + { 125571, true }, + { 125588, true }, + { 125598, false }, + { 125607, false }, + { 125626, true }, + { 125642, true }, + { 125657, true }, + { 125667, true }, + { 125682, true }, + { 125695, true }, + { 125707, true }, + { 125720, true }, + { 125738, true }, + { 125753, true }, + { 125768, false }, + { 125784, true }, + { 125796, true }, + { 125808, true }, + { 125819, true }, + { 125832, false }, + { 125847, true }, + { 125862, true }, + { 125872, true }, + { 125892, true }, + { 125902, true }, + { 125916, true }, + { 125930, true }, + { 125942, true }, + { 125953, true }, + { 125969, true }, + { 125980, true }, + { 125998, true }, + { 126016, true }, + { 126029, true }, + { 126050, false }, + { 126069, true }, + { 126089, true }, + { 126111, true }, + { 126123, true }, + { 126141, true }, + { 126156, true }, + { 126168, true }, + { 126184, true }, { 126199, true }, - { 126215, false }, - { 126228, true }, - { 126248, true }, - { 126259, true }, - { 126274, true }, - { 126290, true }, - { 126305, true }, - { 126320, true }, - { 126343, true }, - { 126358, true }, - { 126383, true }, - { 126401, true }, - { 126416, true }, - { 126432, true }, - { 126447, true }, - { 126476, true }, - { 126501, true }, - { 126523, true }, - { 126541, true }, - { 126555, true }, - { 126568, true }, - { 126583, true }, - { 126590, true }, - { 126606, true }, - { 126617, true }, - { 126628, true }, - { 126638, true }, - { 126652, true }, + { 126215, true }, + { 126231, true }, + { 126247, true }, + { 126264, true }, + { 126286, true }, + { 126297, true }, + { 126313, false }, + { 126326, true }, + { 126346, true }, + { 126357, true }, + { 126372, true }, + { 126388, true }, + { 126403, true }, + { 126418, true }, + { 126441, true }, + { 126456, true }, + { 126481, true }, + { 126499, true }, + { 126514, true }, + { 126530, true }, + { 126545, true }, + { 126574, true }, + { 126599, true }, + { 126621, true }, + { 126639, true }, + { 126653, true }, { 126666, true }, - { 126678, true }, - { 126690, true }, - { 126701, true }, - { 126716, true }, - { 126731, true }, - { 126738, true }, - { 126748, true }, - { 126758, true }, - { 126767, true }, - { 126783, true }, - { 126792, true }, - { 126801, true }, - { 126816, true }, - { 126825, true }, - { 126837, true }, - { 126853, true }, - { 126872, true }, - { 126884, false }, - { 126901, true }, - { 126921, true }, - { 126936, true }, - { 126949, true }, - { 126967, true }, - { 126982, true }, - { 126991, true }, - { 127007, true }, - { 127022, true }, - { 127036, true }, - { 127052, true }, - { 127067, true }, + { 126681, true }, + { 126688, true }, + { 126704, true }, + { 126715, true }, + { 126726, true }, + { 126736, true }, + { 126750, true }, + { 126764, true }, + { 126776, true }, + { 126788, true }, + { 126799, true }, + { 126814, true }, + { 126829, true }, + { 126836, true }, + { 126846, true }, + { 126856, true }, + { 126865, true }, + { 126881, true }, + { 126890, true }, + { 126899, true }, + { 126914, true }, + { 126923, true }, + { 126935, true }, + { 126951, true }, + { 126970, true }, + { 126982, false }, + { 126999, true }, + { 127019, true }, + { 127034, true }, + { 127047, true }, + { 127065, true }, + { 127080, true }, { 127089, true }, - { 127108, true }, - { 127127, true }, - { 127143, true }, - { 127154, true }, - { 127163, true }, - { 127173, true }, - { 127192, true }, - { 127207, true }, - { 127221, true }, - { 127234, true }, - { 127242, true }, - { 127250, true }, - { 127259, true }, + { 127105, true }, + { 127120, true }, + { 127134, true }, + { 127150, true }, + { 127165, true }, + { 127187, true }, + { 127206, true }, + { 127225, true }, + { 127241, true }, + { 127252, true }, + { 127261, true }, { 127271, true }, - { 127283, true }, - { 127292, true }, - { 127304, true }, - { 127312, true }, - { 127324, true }, - { 127350, true }, - { 127373, false }, - { 127389, true }, - { 127409, true }, - { 127430, true }, - { 127449, true }, - { 127463, true }, - { 127477, true }, - { 127494, true }, - { 127508, true }, - { 127522, false }, - { 127537, true }, - { 127545, true }, - { 127560, true }, + { 127290, true }, + { 127305, true }, + { 127319, true }, + { 127332, true }, + { 127340, true }, + { 127348, true }, + { 127357, true }, + { 127369, true }, + { 127381, true }, + { 127390, true }, + { 127402, true }, + { 127410, true }, + { 127422, true }, + { 127448, true }, + { 127471, false }, + { 127487, true }, + { 127507, true }, + { 127528, true }, + { 127547, true }, + { 127561, true }, { 127575, true }, - { 127586, true }, - { 127600, true }, - { 127611, true }, - { 127629, true }, - { 127646, true }, - { 127666, true }, - { 127690, true }, - { 127697, true }, - { 127708, true }, - { 127721, true }, - { 127733, false }, - { 127748, true }, + { 127592, true }, + { 127606, true }, + { 127620, false }, + { 127635, true }, + { 127643, true }, + { 127658, true }, + { 127673, true }, + { 127684, true }, + { 127698, true }, + { 127709, true }, + { 127727, true }, + { 127744, true }, { 127764, true }, - { 127777, true }, - { 127787, true }, - { 127802, false }, - { 127811, true }, - { 127825, true }, - { 127840, true }, - { 127850, true }, + { 127788, true }, + { 127795, true }, + { 127806, true }, + { 127819, true }, + { 127831, false }, + { 127846, true }, { 127862, true }, - { 127872, true }, + { 127875, true }, { 127885, true }, - { 127897, true }, - { 127905, true }, - { 127916, true }, - { 127937, true }, - { 127947, false }, - { 127967, true }, - { 127978, true }, - { 127985, true }, + { 127900, false }, + { 127909, true }, + { 127923, true }, + { 127938, true }, + { 127948, true }, + { 127960, true }, + { 127970, true }, + { 127983, true }, { 127995, true }, - { 128005, true }, - { 128013, false }, - { 128033, true }, - { 128042, true }, - { 128060, true }, - { 128075, true }, - { 128087, true }, - { 128100, true }, - { 128108, true }, - { 128126, true }, - { 128137, true }, - { 128145, true }, - { 128155, true }, - { 128164, true }, - { 128177, true }, - { 128187, true }, - { 128199, true }, - { 128211, true }, - { 128225, true }, - { 128241, true }, - { 128259, true }, - { 128272, true }, - { 128285, false }, - { 128298, true }, - { 128317, true }, - { 128325, true }, - { 128337, true }, - { 128357, true }, - { 128369, true }, - { 128387, true }, - { 128404, true }, - { 128415, true }, - { 128427, true }, - { 128440, true }, - { 128456, true }, - { 128470, true }, - { 128488, true }, - { 128504, true }, - { 128527, true }, - { 128546, true }, - { 128560, true }, - { 128576, true }, - { 128592, true }, - { 128609, true }, - { 128639, false }, - { 128655, true }, + { 128003, true }, + { 128014, true }, + { 128035, true }, + { 128045, false }, + { 128065, true }, + { 128076, true }, + { 128083, true }, + { 128093, true }, + { 128103, true }, + { 128111, false }, + { 128131, true }, + { 128140, true }, + { 128149, true }, + { 128167, true }, + { 128182, true }, + { 128194, true }, + { 128207, true }, + { 128215, true }, + { 128233, true }, + { 128244, true }, + { 128252, true }, + { 128262, true }, + { 128271, true }, + { 128284, true }, + { 128294, true }, + { 128306, true }, + { 128318, true }, + { 128332, true }, + { 128348, true }, + { 128366, true }, + { 128379, true }, + { 128392, false }, + { 128405, true }, + { 128424, true }, + { 128432, true }, + { 128444, true }, + { 128464, true }, + { 128476, true }, + { 128494, true }, + { 128511, true }, + { 128522, true }, + { 128534, true }, + { 128547, true }, + { 128563, true }, + { 128577, true }, + { 128595, true }, + { 128611, true }, + { 128634, true }, + { 128653, true }, { 128667, true }, - { 128678, true }, - { 128691, true }, - { 128708, true }, - { 128722, true }, - { 128739, true }, - { 128754, true }, - { 128769, true }, - { 128780, true }, + { 128683, true }, + { 128699, true }, + { 128716, true }, + { 128746, false }, + { 128762, true }, + { 128774, true }, + { 128785, true }, { 128798, true }, - { 128814, true }, - { 128826, true }, - { 128843, true }, - { 128855, false }, - { 128869, true }, - { 128876, false }, - { 128908, true }, - { 128922, true }, - { 128932, true }, - { 128946, true }, - { 128963, true }, - { 128975, true }, - { 128989, true }, - { 129005, true }, - { 129020, true }, - { 129031, true }, - { 129042, true }, - { 129054, true }, - { 129063, true }, - { 129072, true }, - { 129079, true }, - { 129090, true }, - { 129098, true }, - { 129105, true }, - { 129115, true }, - { 129126, true }, - { 129134, true }, - { 129142, true }, - { 129150, true }, - { 129163, true }, - { 129178, true }, - { 129188, true }, - { 129198, true }, + { 128815, true }, + { 128829, true }, + { 128846, true }, + { 128861, true }, + { 128876, true }, + { 128887, true }, + { 128905, true }, + { 128921, true }, + { 128933, true }, + { 128950, true }, + { 128962, false }, + { 128976, true }, + { 128983, false }, + { 129015, true }, + { 129029, true }, + { 129039, true }, + { 129053, true }, + { 129070, true }, + { 129082, true }, + { 129096, true }, + { 129112, true }, + { 129127, true }, + { 129138, true }, + { 129149, true }, + { 129161, true }, + { 129170, true }, + { 129179, true }, + { 129186, true }, + { 129197, true }, { 129205, true }, - { 129221, true }, + { 129212, true }, + { 129222, true }, { 129233, true }, - { 129245, true }, + { 129241, true }, + { 129249, true }, { 129257, true }, - { 129266, true }, - { 129277, true }, - { 129292, true }, - { 129300, true }, - { 129311, true }, - { 129322, true }, - { 129336, true }, + { 129270, true }, + { 129285, true }, + { 129295, true }, + { 129305, true }, + { 129312, true }, + { 129328, true }, + { 129340, true }, { 129352, true }, { 129364, true }, - { 129378, true }, - { 129392, false }, - { 129402, true }, - { 129423, true }, - { 129444, true }, - { 129458, true }, - { 129470, true }, + { 129373, true }, + { 129384, true }, + { 129399, true }, + { 129407, true }, + { 129418, true }, + { 129429, true }, + { 129443, true }, + { 129459, true }, + { 129471, true }, { 129485, true }, - { 129502, true }, - { 129515, true }, - { 129529, true }, - { 129540, true }, - { 129549, true }, - { 129559, true }, - { 129566, true }, - { 129574, true }, - { 129586, true }, - { 129595, true }, - { 129607, true }, - { 129616, true }, - { 129624, true }, - { 129639, true }, + { 129499, false }, + { 129509, true }, + { 129530, true }, + { 129551, true }, + { 129565, true }, + { 129577, true }, + { 129592, true }, + { 129609, true }, + { 129622, true }, + { 129636, true }, { 129647, true }, - { 129659, false }, - { 129669, true }, - { 129679, true }, - { 129690, true }, - { 129699, true }, - { 129717, true }, - { 129727, false }, - { 129738, true }, - { 129760, true }, - { 129768, true }, - { 129776, false }, - { 129784, true }, - { 129800, true }, - { 129813, true }, + { 129656, true }, + { 129666, true }, + { 129673, true }, + { 129681, true }, + { 129693, true }, + { 129702, true }, + { 129714, true }, + { 129723, true }, + { 129731, true }, + { 129746, true }, + { 129754, true }, + { 129766, false }, + { 129776, true }, + { 129786, true }, + { 129797, true }, + { 129806, true }, { 129824, true }, - { 129836, true }, - { 129855, true }, - { 129881, true }, - { 129895, true }, - { 129909, true }, - { 129923, true }, - { 129938, false }, - { 129956, true }, - { 129972, true }, - { 129987, true }, - { 129998, true }, - { 130017, true }, - { 130033, true }, - { 130045, true }, - { 130057, true }, - { 130070, true }, - { 130082, true }, - { 130089, true }, - { 130102, true }, - { 130119, true }, - { 130141, true }, - { 130151, true }, - { 130161, true }, - { 130173, false }, - { 130184, true }, - { 130198, true }, - { 130207, true }, - { 130218, true }, - { 130231, true }, - { 130247, true }, - { 130274, true }, - { 130286, true }, - { 130300, true }, - { 130308, true }, - { 130318, true }, - { 130341, true }, - { 130350, false }, - { 130373, true }, - { 130391, true }, - { 130408, true }, - { 130417, true }, - { 130429, true }, - { 130443, true }, - { 130452, true }, - { 130460, true }, - { 130473, true }, + { 129834, false }, + { 129845, true }, + { 129867, true }, + { 129875, true }, + { 129883, false }, + { 129891, true }, + { 129907, true }, + { 129920, true }, + { 129931, true }, + { 129943, true }, + { 129962, true }, + { 129988, true }, + { 130002, true }, + { 130016, true }, + { 130030, true }, + { 130045, false }, + { 130063, true }, + { 130079, true }, + { 130094, true }, + { 130105, true }, + { 130124, true }, + { 130140, true }, + { 130152, true }, + { 130164, true }, + { 130177, true }, + { 130189, true }, + { 130196, true }, + { 130209, true }, + { 130226, true }, + { 130248, true }, + { 130258, true }, + { 130268, true }, + { 130280, false }, + { 130291, true }, + { 130305, true }, + { 130314, true }, + { 130325, true }, + { 130338, true }, + { 130354, true }, + { 130381, true }, + { 130393, true }, + { 130407, true }, + { 130415, true }, + { 130425, true }, + { 130448, true }, + { 130457, false }, + { 130480, true }, { 130498, true }, - { 130509, true }, - { 130522, true }, + { 130515, true }, + { 130524, true }, { 130536, true }, - { 130549, false }, - { 130560, true }, - { 130568, true }, + { 130550, true }, + { 130559, true }, + { 130567, true }, { 130580, true }, - { 130591, true }, - { 130606, true }, - { 130626, true }, - { 130634, true }, - { 130648, true }, - { 130666, true }, - { 130686, false }, - { 130699, true }, - { 130718, true }, - { 130739, true }, - { 130757, true }, - { 130767, true }, - { 130780, true }, - { 130811, true }, - { 130831, true }, - { 130848, true }, - { 130861, true }, - { 130876, true }, - { 130888, true }, - { 130898, true }, - { 130905, true }, - { 130922, true }, + { 130605, true }, + { 130616, true }, + { 130629, true }, + { 130643, true }, + { 130656, false }, + { 130667, true }, + { 130675, true }, + { 130687, true }, + { 130698, true }, + { 130713, true }, + { 130733, true }, + { 130741, true }, + { 130755, true }, + { 130773, true }, + { 130793, false }, + { 130806, true }, + { 130825, true }, + { 130846, true }, + { 130864, true }, + { 130874, true }, + { 130887, true }, + { 130918, true }, { 130938, true }, - { 130950, true }, - { 130964, true }, - { 130976, true }, - { 130991, true }, - { 131009, true }, - { 131022, true }, - { 131032, true }, - { 131043, true }, - { 131054, true }, - { 131065, true }, - { 131080, true }, - { 131091, true }, - { 131103, false }, - { 131115, true }, - { 131132, true }, - { 131146, true }, - { 131163, true }, - { 131173, true }, - { 131186, false }, - { 131204, true }, - { 131215, true }, - { 131231, true }, - { 131246, true }, - { 131263, true }, + { 130955, true }, + { 130968, true }, + { 130983, true }, + { 130995, true }, + { 131005, true }, + { 131012, true }, + { 131029, true }, + { 131045, true }, + { 131057, true }, + { 131071, true }, + { 131083, true }, + { 131098, true }, + { 131116, true }, + { 131129, true }, + { 131139, true }, + { 131150, true }, + { 131161, true }, + { 131172, true }, + { 131187, true }, + { 131198, true }, + { 131210, false }, + { 131222, true }, + { 131239, true }, + { 131253, true }, + { 131270, true }, { 131280, true }, - { 131297, true }, - { 131307, true }, + { 131293, false }, + { 131311, true }, { 131322, true }, - { 131332, true }, - { 131347, true }, - { 131364, true }, - { 131382, true }, - { 131397, true }, - { 131422, true }, + { 131338, true }, + { 131353, true }, + { 131370, false }, + { 131387, false }, + { 131404, true }, + { 131414, true }, + { 131429, true }, { 131439, true }, - { 131458, true }, - { 131475, true }, - { 131495, true }, - { 131516, true }, - { 131530, true }, - { 131555, true }, - { 131576, true }, - { 131598, true }, - { 131628, true }, - { 131652, true }, - { 131667, true }, - { 131680, true }, - { 131690, true }, - { 131713, true }, - { 131724, true }, - { 131731, true }, - { 131745, true }, - { 131764, true }, - { 131771, true }, - { 131791, true }, - { 131802, true }, - { 131821, true }, - { 131837, true }, - { 131847, true }, - { 131858, true }, - { 131868, true }, - { 131879, true }, - { 131892, true }, - { 131906, true }, - { 131918, true }, - { 131934, true }, - { 131942, true }, - { 131952, true }, - { 131962, true }, - { 131974, true }, - { 131985, true }, - { 132001, true }, - { 132016, true }, - { 132040, true }, - { 132054, true }, - { 132062, true }, - { 132080, true }, - { 132091, true }, - { 132104, true }, - { 132115, true }, - { 132134, true }, - { 132145, true }, - { 132160, true }, - { 132175, true }, + { 131454, true }, + { 131471, true }, + { 131489, true }, + { 131504, true }, + { 131529, true }, + { 131546, true }, + { 131565, true }, + { 131582, true }, + { 131602, true }, + { 131623, true }, + { 131637, true }, + { 131662, true }, + { 131683, true }, + { 131705, true }, + { 131735, true }, + { 131759, true }, + { 131774, true }, + { 131787, true }, + { 131797, true }, + { 131820, true }, + { 131831, true }, + { 131838, true }, + { 131852, true }, + { 131871, true }, + { 131878, true }, + { 131898, true }, + { 131909, true }, + { 131928, true }, + { 131944, true }, + { 131954, true }, + { 131965, true }, + { 131975, true }, + { 131986, true }, + { 131999, true }, + { 132013, true }, + { 132025, true }, + { 132041, true }, + { 132049, true }, + { 132059, true }, + { 132069, true }, + { 132081, true }, + { 132092, true }, + { 132108, true }, + { 132123, true }, + { 132147, true }, + { 132161, true }, + { 132169, true }, { 132187, true }, - { 132205, true }, - { 132225, true }, - { 132237, true }, - { 132254, true }, - { 132269, true }, - { 132283, true }, - { 132297, true }, - { 132308, true }, - { 132317, true }, - { 132326, true }, + { 132198, true }, + { 132211, true }, + { 132222, true }, + { 132241, true }, + { 132252, true }, + { 132267, true }, + { 132282, true }, + { 132294, true }, + { 132312, true }, + { 132332, true }, { 132344, true }, - { 132355, true }, - { 132369, true }, + { 132361, true }, { 132376, true }, - { 132393, false }, - { 132419, false }, - { 132431, true }, - { 132444, true }, - { 132458, true }, - { 132469, true }, - { 132486, true }, - { 132496, true }, - { 132509, true }, - { 132524, true }, - { 132545, true }, - { 132569, true }, - { 132583, true }, - { 132594, true }, - { 132608, true }, - { 132620, true }, - { 132635, true }, - { 132645, true }, - { 132658, true }, - { 132671, true }, - { 132684, true }, - { 132707, true }, + { 132390, true }, + { 132404, true }, + { 132415, true }, + { 132424, true }, + { 132433, true }, + { 132451, true }, + { 132462, true }, + { 132476, true }, + { 132483, true }, + { 132500, false }, + { 132526, false }, + { 132538, true }, + { 132551, true }, + { 132565, true }, + { 132576, true }, + { 132593, true }, + { 132603, true }, + { 132616, true }, + { 132631, true }, + { 132652, true }, + { 132676, true }, + { 132690, true }, + { 132701, true }, + { 132715, true }, { 132727, true }, - { 132749, true }, - { 132763, true }, + { 132742, true }, + { 132752, true }, + { 132765, true }, { 132778, true }, - { 132793, false }, - { 132806, true }, - { 132821, true }, - { 132832, true }, - { 132852, true }, - { 132865, false }, - { 132884, true }, - { 132895, true }, - { 132914, true }, - { 132922, true }, + { 132791, true }, + { 132814, true }, + { 132834, true }, + { 132856, true }, + { 132870, true }, + { 132885, true }, + { 132900, false }, + { 132913, true }, + { 132928, true }, { 132939, true }, - { 132955, true }, - { 132964, true }, - { 132975, true }, - { 132985, true }, - { 132995, true }, - { 133006, true }, - { 133016, true }, - { 133028, true }, - { 133035, true }, - { 133053, true }, - { 133065, true }, - { 133072, true }, - { 133083, true }, - { 133105, true }, - { 133119, true }, - { 133138, true }, - { 133158, true }, - { 133166, true }, - { 133185, true }, - { 133194, true }, - { 133206, true }, - { 133224, true }, - { 133238, true }, - { 133257, true }, - { 133266, true }, - { 133282, true }, - { 133290, true }, - { 133302, true }, - { 133317, true }, - { 133337, true }, + { 132959, true }, + { 132972, false }, + { 132991, true }, + { 133002, true }, + { 133021, true }, + { 133029, true }, + { 133046, true }, + { 133062, true }, + { 133071, true }, + { 133082, true }, + { 133092, true }, + { 133102, true }, + { 133113, true }, + { 133123, true }, + { 133135, true }, + { 133142, true }, + { 133160, true }, + { 133172, true }, + { 133179, true }, + { 133190, true }, + { 133212, true }, + { 133226, true }, + { 133245, true }, + { 133265, true }, + { 133273, true }, + { 133292, true }, + { 133301, true }, + { 133313, true }, + { 133331, true }, { 133345, true }, - { 133358, true }, - { 133376, true }, - { 133388, true }, - { 133407, true }, - { 133421, true }, - { 133434, true }, - { 133446, true }, - { 133470, true }, - { 133486, true }, - { 133500, true }, + { 133364, true }, + { 133373, true }, + { 133389, true }, + { 133397, true }, + { 133409, true }, + { 133424, true }, + { 133444, true }, + { 133452, true }, + { 133465, true }, + { 133483, true }, + { 133495, true }, { 133514, true }, - { 133531, true }, - { 133543, true }, - { 133559, true }, - { 133576, true }, - { 133584, true }, + { 133528, true }, + { 133541, true }, + { 133553, true }, + { 133577, true }, { 133593, true }, - { 133611, true }, - { 133620, false }, - { 133629, true }, - { 133643, true }, - { 133653, true }, - { 133664, true }, - { 133673, true }, - { 133696, true }, - { 133708, true }, - { 133718, false }, - { 133727, true }, - { 133734, true }, - { 133743, true }, - { 133751, true }, + { 133607, true }, + { 133621, true }, + { 133638, true }, + { 133650, true }, + { 133666, true }, + { 133683, true }, + { 133691, true }, + { 133700, true }, + { 133718, true }, + { 133727, false }, + { 133736, true }, + { 133750, true }, { 133760, true }, - { 133772, false }, - { 133786, true }, - { 133800, true }, - { 133810, true }, - { 133820, true }, - { 133830, true }, - { 133848, false }, - { 133861, true }, - { 133879, true }, - { 133889, true }, - { 133900, true }, - { 133909, true }, - { 133922, true }, - { 133936, true }, - { 133951, true }, - { 133964, true }, - { 133974, true }, - { 133985, true }, - { 133994, true }, - { 134011, true }, - { 134020, true }, - { 134033, true }, - { 134044, true }, - { 134062, true }, - { 134072, true }, - { 134084, true }, - { 134096, false }, - { 134113, true }, - { 134136, true }, - { 134147, true }, - { 134164, true }, - { 134177, true }, - { 134186, true }, - { 134199, false }, - { 134208, false }, - { 134219, true }, - { 134231, false }, - { 134246, false }, - { 134257, false }, - { 134264, true }, - { 134280, true }, - { 134295, true }, - { 134313, true }, - { 134332, true }, - { 134347, true }, - { 134364, true }, - { 134378, true }, - { 134394, true }, - { 134407, true }, - { 134421, true }, - { 134438, true }, - { 134457, true }, - { 134472, false }, - { 134486, true }, - { 134500, true }, - { 134513, true }, - { 134534, true }, - { 134546, true }, - { 134559, true }, - { 134569, true }, - { 134589, true }, - { 134602, true }, - { 134614, true }, - { 134632, true }, - { 134651, true }, - { 134669, true }, - { 134683, true }, - { 134695, true }, - { 134705, true }, - { 134719, true }, - { 134729, true }, - { 134745, true }, + { 133771, true }, + { 133780, true }, + { 133803, true }, + { 133815, true }, + { 133825, false }, + { 133834, true }, + { 133841, true }, + { 133850, true }, + { 133858, true }, + { 133867, true }, + { 133879, false }, + { 133893, true }, + { 133907, true }, + { 133917, true }, + { 133927, true }, + { 133937, true }, + { 133955, false }, + { 133968, true }, + { 133986, true }, + { 133996, true }, + { 134007, true }, + { 134016, true }, + { 134029, true }, + { 134043, true }, + { 134058, true }, + { 134071, true }, + { 134081, true }, + { 134092, true }, + { 134101, true }, + { 134118, true }, + { 134127, true }, + { 134140, true }, + { 134151, true }, + { 134169, true }, + { 134179, true }, + { 134191, true }, + { 134203, false }, + { 134220, true }, + { 134243, true }, + { 134254, true }, + { 134271, true }, + { 134284, true }, + { 134293, true }, + { 134306, false }, + { 134315, false }, + { 134326, true }, + { 134338, false }, + { 134353, false }, + { 134364, false }, + { 134371, true }, + { 134387, true }, + { 134402, true }, + { 134420, true }, + { 134439, true }, + { 134454, true }, + { 134471, true }, + { 134485, true }, + { 134501, true }, + { 134514, true }, + { 134528, true }, + { 134545, true }, + { 134564, true }, + { 134579, false }, + { 134593, true }, + { 134607, true }, + { 134620, true }, + { 134641, true }, + { 134653, true }, + { 134666, true }, + { 134676, true }, + { 134696, true }, + { 134709, true }, + { 134721, true }, + { 134739, true }, { 134758, true }, - { 134773, true }, - { 134789, true }, - { 134813, true }, - { 134829, true }, - { 134839, true }, - { 134853, true }, + { 134776, true }, + { 134790, true }, + { 134802, true }, + { 134812, true }, + { 134826, true }, + { 134836, true }, + { 134852, true }, { 134865, true }, - { 134877, true }, - { 134895, true }, - { 134908, true }, - { 134927, true }, - { 134945, true }, + { 134880, true }, + { 134896, true }, + { 134920, true }, + { 134936, true }, + { 134946, true }, { 134960, true }, - { 134983, true }, - { 135000, true }, - { 135019, true }, - { 135039, true }, - { 135062, true }, - { 135081, true }, - { 135100, true }, - { 135119, true }, - { 135138, true }, - { 135149, true }, - { 135159, true }, - { 135174, true }, - { 135195, true }, - { 135215, true }, - { 135234, true }, - { 135248, true }, - { 135260, true }, - { 135272, true }, - { 135290, true }, - { 135306, true }, - { 135327, true }, - { 135339, true }, - { 135349, false }, - { 135361, true }, - { 135378, true }, - { 135396, true }, - { 135416, true }, - { 135431, true }, - { 135443, true }, - { 135454, true }, - { 135466, true }, - { 135478, false }, + { 134972, true }, + { 134984, true }, + { 135002, true }, + { 135015, true }, + { 135034, true }, + { 135052, true }, + { 135067, true }, + { 135090, true }, + { 135107, true }, + { 135126, true }, + { 135146, true }, + { 135169, true }, + { 135188, true }, + { 135207, true }, + { 135226, true }, + { 135245, true }, + { 135256, true }, + { 135266, true }, + { 135281, true }, + { 135302, true }, + { 135322, true }, + { 135341, true }, + { 135355, true }, + { 135367, true }, + { 135377, true }, + { 135389, true }, + { 135407, true }, + { 135423, true }, + { 135444, true }, + { 135456, true }, + { 135466, false }, + { 135478, true }, { 135495, true }, - { 135508, true }, - { 135526, true }, - { 135541, true }, - { 135556, true }, - { 135568, true }, - { 135588, true }, - { 135600, true }, - { 135614, true }, - { 135632, true }, - { 135645, true }, - { 135661, true }, - { 135676, true }, - { 135688, true }, - { 135704, true }, - { 135714, true }, - { 135721, true }, - { 135736, true }, - { 135756, true }, - { 135769, true }, - { 135780, true }, + { 135513, true }, + { 135533, true }, + { 135548, true }, + { 135560, true }, + { 135571, true }, + { 135583, true }, + { 135595, false }, + { 135612, true }, + { 135625, true }, + { 135643, true }, + { 135658, true }, + { 135673, true }, + { 135685, true }, + { 135705, true }, + { 135717, true }, + { 135731, true }, + { 135749, true }, + { 135762, true }, + { 135778, true }, { 135793, true }, - { 135802, true }, - { 135822, true }, - { 135842, true }, - { 135865, true }, - { 135885, true }, + { 135805, true }, + { 135821, true }, + { 135831, true }, + { 135838, true }, + { 135853, true }, + { 135873, true }, + { 135886, true }, { 135897, true }, - { 135908, true }, - { 135919, false }, - { 135930, true }, - { 135941, false }, - { 135951, false }, - { 135968, true }, - { 135980, true }, - { 135996, true }, - { 136009, true }, - { 136018, true }, - { 136032, true }, - { 136043, true }, - { 136055, true }, - { 136073, true }, - { 136087, true }, - { 136100, true }, - { 136109, true }, - { 136124, true }, + { 135910, true }, + { 135919, true }, + { 135939, true }, + { 135959, true }, + { 135982, true }, + { 136002, true }, + { 136014, true }, + { 136025, true }, + { 136036, false }, + { 136047, true }, + { 136058, false }, + { 136068, false }, + { 136085, true }, + { 136097, true }, + { 136113, true }, + { 136126, true }, { 136135, true }, - { 136145, true }, - { 136165, true }, - { 136177, true }, - { 136187, true }, - { 136198, true }, - { 136231, true }, - { 136243, true }, - { 136262, true }, - { 136273, true }, - { 136280, true }, - { 136294, true }, - { 136308, false }, - { 136328, true }, - { 136345, true }, - { 136356, true }, - { 136369, true }, - { 136384, true }, - { 136400, true }, - { 136418, true }, - { 136434, true }, - { 136451, true }, - { 136463, true }, - { 136477, true }, - { 136493, true }, - { 136506, true }, - { 136518, true }, - { 136529, true }, - { 136546, true }, + { 136149, true }, + { 136160, true }, + { 136172, true }, + { 136190, true }, + { 136204, true }, + { 136217, true }, + { 136226, true }, + { 136237, true }, + { 136257, true }, + { 136269, true }, + { 136279, true }, + { 136290, true }, + { 136323, true }, + { 136335, true }, + { 136354, true }, + { 136365, true }, + { 136372, true }, + { 136386, true }, + { 136400, false }, + { 136420, true }, + { 136437, true }, + { 136448, true }, + { 136461, true }, + { 136476, true }, + { 136492, true }, + { 136510, true }, + { 136526, true }, + { 136543, true }, { 136555, true }, - { 136564, true }, - { 136577, true }, - { 136608, true }, + { 136569, true }, + { 136585, true }, + { 136598, true }, + { 136610, true }, { 136621, true }, - { 136634, true }, + { 136638, true }, { 136647, true }, - { 136658, true }, - { 136667, true }, - { 136682, true }, - { 136694, true }, - { 136710, true }, - { 136731, true }, - { 136748, true }, - { 136762, true }, + { 136656, true }, + { 136669, true }, + { 136700, true }, + { 136713, true }, + { 136726, true }, + { 136739, true }, + { 136750, true }, + { 136759, true }, { 136774, true }, - { 136785, true }, + { 136786, true }, { 136802, true }, - { 136813, true }, - { 136832, true }, - { 136850, false }, - { 136862, true }, - { 136898, true }, - { 136911, true }, - { 136925, true }, - { 136934, true }, - { 136944, true }, - { 136956, true }, - { 136974, true }, - { 136988, true }, - { 137006, true }, - { 137027, true }, - { 137047, true }, - { 137070, true }, - { 137086, true }, - { 137100, true }, - { 137116, true }, - { 137130, true }, - { 137143, true }, - { 137164, true }, - { 137184, true }, - { 137193, true }, - { 137210, true }, - { 137221, true }, - { 137232, true }, - { 137243, true }, - { 137262, true }, - { 137274, true }, - { 137287, true }, - { 137303, true }, - { 137322, true }, - { 137337, true }, - { 137354, false }, - { 137369, true }, - { 137389, true }, - { 137400, true }, - { 137411, true }, - { 137431, false }, - { 137440, true }, - { 137449, true }, - { 137460, true }, - { 137472, true }, - { 137486, true }, - { 137504, true }, - { 137518, true }, - { 137530, true }, - { 137553, true }, - { 137568, true }, - { 137581, true }, - { 137598, true }, - { 137608, true }, - { 137629, true }, - { 137657, false }, - { 137668, true }, - { 137675, true }, - { 137686, true }, - { 137696, true }, - { 137706, true }, - { 137720, true }, - { 137734, true }, - { 137745, false }, - { 137756, true }, - { 137764, false }, - { 137784, true }, - { 137799, true }, + { 136823, true }, + { 136840, true }, + { 136854, true }, + { 136866, true }, + { 136877, true }, + { 136894, true }, + { 136905, true }, + { 136924, true }, + { 136942, false }, + { 136954, true }, + { 136990, true }, + { 137003, true }, + { 137017, true }, + { 137026, true }, + { 137036, true }, + { 137048, true }, + { 137066, true }, + { 137080, true }, + { 137098, true }, + { 137119, true }, + { 137139, true }, + { 137162, true }, + { 137178, true }, + { 137192, true }, + { 137208, true }, + { 137222, true }, + { 137235, true }, + { 137256, true }, + { 137276, true }, + { 137285, true }, + { 137302, true }, + { 137313, true }, + { 137324, true }, + { 137335, true }, + { 137354, true }, + { 137366, true }, + { 137379, true }, + { 137395, true }, + { 137414, true }, + { 137429, true }, + { 137446, false }, + { 137461, true }, + { 137481, true }, + { 137492, true }, + { 137503, true }, + { 137523, false }, + { 137532, true }, + { 137541, true }, + { 137552, true }, + { 137564, true }, + { 137578, true }, + { 137596, true }, + { 137610, true }, + { 137622, true }, + { 137645, true }, + { 137660, true }, + { 137673, true }, + { 137690, true }, + { 137700, true }, + { 137721, true }, + { 137749, false }, + { 137760, true }, + { 137767, true }, + { 137778, true }, + { 137788, true }, + { 137798, true }, { 137812, true }, - { 137828, true }, - { 137843, true }, - { 137856, true }, - { 137869, true }, - { 137885, true }, - { 137905, true }, - { 137918, true }, - { 137937, true }, - { 137955, true }, - { 137965, true }, - { 137979, true }, + { 137826, true }, + { 137837, false }, + { 137848, true }, + { 137856, false }, + { 137876, true }, + { 137891, true }, + { 137904, true }, + { 137920, true }, + { 137935, true }, + { 137948, true }, + { 137961, true }, + { 137977, true }, { 137997, true }, - { 138005, true }, - { 138025, true }, + { 138010, true }, + { 138029, true }, + { 138047, true }, { 138057, true }, - { 138072, true }, - { 138091, true }, - { 138106, true }, - { 138127, true }, - { 138148, true }, - { 138162, true }, - { 138184, true }, - { 138200, true }, - { 138225, true }, - { 138237, true }, - { 138250, true }, - { 138261, true }, - { 138278, true }, - { 138302, true }, - { 138316, true }, + { 138071, true }, + { 138089, true }, + { 138097, true }, + { 138117, true }, + { 138149, true }, + { 138164, true }, + { 138183, true }, + { 138198, true }, + { 138219, true }, + { 138240, true }, + { 138254, true }, + { 138276, true }, + { 138292, true }, + { 138317, true }, { 138329, true }, - { 138341, true }, - { 138354, true }, - { 138372, true }, - { 138389, true }, - { 138409, true }, - { 138434, true }, - { 138447, true }, - { 138461, true }, - { 138475, true }, - { 138492, true }, - { 138512, true }, - { 138528, true }, - { 138546, true }, - { 138561, true }, - { 138576, true }, - { 138589, true }, + { 138342, true }, + { 138353, true }, + { 138370, true }, + { 138394, true }, + { 138408, true }, + { 138421, true }, + { 138433, true }, + { 138446, true }, + { 138464, true }, + { 138481, true }, + { 138501, true }, + { 138526, true }, + { 138539, true }, + { 138553, true }, + { 138567, true }, + { 138584, true }, { 138604, true }, - { 138612, false }, - { 138625, true }, - { 138637, true }, - { 138651, true }, - { 138659, true }, + { 138620, true }, + { 138638, true }, + { 138653, true }, + { 138668, true }, { 138681, true }, - { 138695, true }, - { 138709, true }, + { 138696, true }, + { 138704, false }, { 138717, true }, - { 138728, true }, - { 138744, true }, - { 138754, true }, - { 138767, true }, - { 138780, true }, - { 138794, true }, - { 138810, true }, - { 138823, true }, - { 138837, true }, - { 138848, true }, - { 138858, true }, - { 138878, true }, - { 138892, true }, - { 138907, true }, - { 138919, true }, - { 138933, true }, - { 138941, true }, - { 138953, true }, - { 138964, true }, - { 138985, true }, - { 139004, true }, - { 139022, true }, - { 139040, true }, - { 139060, true }, - { 139069, true }, - { 139087, true }, - { 139103, true }, - { 139116, true }, - { 139136, true }, - { 139150, true }, - { 139169, true }, - { 139182, true }, - { 139194, true }, - { 139206, true }, - { 139217, true }, - { 139231, true }, - { 139245, false }, - { 139260, true }, - { 139277, true }, - { 139288, true }, - { 139299, true }, - { 139313, true }, - { 139334, true }, - { 139350, true }, + { 138729, true }, + { 138743, true }, + { 138751, true }, + { 138773, true }, + { 138787, true }, + { 138801, true }, + { 138809, true }, + { 138820, true }, + { 138836, true }, + { 138846, true }, + { 138859, true }, + { 138872, true }, + { 138886, true }, + { 138902, true }, + { 138915, true }, + { 138929, true }, + { 138940, true }, + { 138950, true }, + { 138970, true }, + { 138984, true }, + { 138999, true }, + { 139011, true }, + { 139025, true }, + { 139033, true }, + { 139045, true }, + { 139056, true }, + { 139077, true }, + { 139096, true }, + { 139114, true }, + { 139132, true }, + { 139152, true }, + { 139161, true }, + { 139179, true }, + { 139195, true }, + { 139208, true }, + { 139228, true }, + { 139242, true }, + { 139261, true }, + { 139274, true }, + { 139286, true }, + { 139298, true }, + { 139309, true }, + { 139323, true }, + { 139337, false }, + { 139352, true }, { 139369, true }, - { 139385, true }, - { 139403, true }, + { 139380, true }, + { 139391, true }, + { 139405, true }, { 139426, true }, - { 139438, true }, - { 139451, true }, - { 139469, true }, - { 139484, true }, - { 139499, true }, - { 139515, true }, + { 139442, true }, + { 139461, true }, + { 139477, true }, + { 139495, true }, + { 139518, true }, { 139530, true }, - { 139545, true }, - { 139560, true }, + { 139543, true }, + { 139561, true }, { 139576, true }, { 139591, true }, - { 139606, true }, - { 139621, true }, + { 139607, true }, + { 139622, true }, { 139637, true }, - { 139647, true }, - { 139660, true }, - { 139673, true }, + { 139652, true }, + { 139668, true }, { 139683, true }, - { 139695, false }, - { 139706, true }, - { 139720, true }, - { 139732, false }, - { 139751, true }, - { 139768, true }, - { 139781, true }, - { 139797, true }, - { 139807, false }, - { 139820, false }, - { 139830, true }, + { 139698, true }, + { 139713, true }, + { 139729, true }, + { 139739, true }, + { 139752, true }, + { 139765, true }, + { 139775, true }, + { 139787, false }, + { 139798, true }, + { 139812, true }, + { 139824, false }, { 139843, true }, - { 139853, true }, - { 139863, false }, - { 139872, false }, - { 139880, false }, - { 139900, true }, - { 139913, true }, - { 139925, false }, - { 139937, true }, - { 139951, true }, - { 139968, true }, - { 139984, true }, - { 140003, true }, - { 140019, false }, - { 140036, true }, - { 140050, true }, - { 140064, true }, - { 140085, true }, - { 140099, true }, - { 140115, true }, - { 140128, false }, + { 139860, true }, + { 139873, true }, + { 139889, true }, + { 139899, false }, + { 139912, false }, + { 139922, true }, + { 139935, true }, + { 139945, true }, + { 139955, false }, + { 139964, false }, + { 139972, false }, + { 139992, true }, + { 140005, true }, + { 140017, false }, + { 140029, true }, + { 140043, true }, + { 140060, true }, + { 140076, true }, + { 140095, true }, + { 140111, false }, + { 140128, true }, { 140142, true }, - { 140157, true }, - { 140171, true }, - { 140190, true }, - { 140212, true }, - { 140227, true }, - { 140244, true }, - { 140257, true }, - { 140267, true }, - { 140275, true }, - { 140287, true }, - { 140300, true }, - { 140313, true }, - { 140323, true }, - { 140336, false }, - { 140345, false }, - { 140356, true }, - { 140371, true }, - { 140382, true }, - { 140391, true }, - { 140400, false }, - { 140414, true }, - { 140432, true }, - { 140450, true }, - { 140467, true }, - { 140479, false }, - { 140495, false }, - { 140519, true }, - { 140546, true }, - { 140565, true }, - { 140573, true }, - { 140582, true }, - { 140594, true }, - { 140606, true }, - { 140631, true }, - { 140648, true }, + { 140156, true }, + { 140177, true }, + { 140191, true }, + { 140207, true }, + { 140220, false }, + { 140234, true }, + { 140249, true }, + { 140263, true }, + { 140282, true }, + { 140304, true }, + { 140319, true }, + { 140336, true }, + { 140349, true }, + { 140359, true }, + { 140367, true }, + { 140379, true }, + { 140392, true }, + { 140405, true }, + { 140415, true }, + { 140428, false }, + { 140437, false }, + { 140448, true }, + { 140463, true }, + { 140474, true }, + { 140483, true }, + { 140492, false }, + { 140506, true }, + { 140524, true }, + { 140542, true }, + { 140559, true }, + { 140571, false }, + { 140587, false }, + { 140611, true }, + { 140638, true }, + { 140657, true }, { 140665, true }, - { 140680, true }, - { 140692, true }, - { 140705, true }, + { 140674, true }, + { 140686, true }, + { 140698, true }, { 140723, true }, - { 140732, false }, { 140740, true }, - { 140761, true }, - { 140775, true }, + { 140757, true }, + { 140772, true }, + { 140784, true }, { 140797, true }, - { 140810, true }, - { 140823, true }, - { 140835, true }, - { 140848, true }, - { 140861, true }, - { 140877, true }, - { 140891, true }, - { 140912, true }, - { 140924, true }, - { 140945, true }, - { 140964, true }, - { 140989, true }, - { 141001, true }, - { 141014, true }, - { 141027, true }, - { 141039, true }, - { 141051, true }, - { 141068, true }, - { 141086, true }, - { 141098, false }, - { 141107, true }, - { 141122, true }, - { 141144, true }, - { 141158, true }, - { 141172, true }, - { 141185, true }, - { 141207, true }, - { 141222, true }, - { 141237, true }, - { 141248, true }, - { 141273, true }, - { 141290, true }, - { 141302, true }, - { 141318, false }, - { 141333, false }, - { 141357, true }, - { 141365, true }, - { 141377, true }, - { 141390, true }, - { 141403, true }, - { 141415, true }, - { 141431, true }, - { 141446, true }, - { 141465, true }, - { 141479, true }, - { 141493, true }, - { 141513, true }, - { 141529, true }, - { 141548, true }, - { 141568, true }, - { 141580, true }, - { 141592, true }, - { 141622, true }, - { 141634, true }, - { 141645, true }, - { 141655, true }, - { 141669, true }, - { 141682, true }, - { 141700, false }, - { 141710, true }, + { 140815, true }, + { 140824, false }, + { 140832, true }, + { 140853, true }, + { 140867, true }, + { 140889, true }, + { 140902, true }, + { 140915, true }, + { 140927, true }, + { 140940, true }, + { 140953, true }, + { 140969, true }, + { 140983, true }, + { 141004, true }, + { 141016, true }, + { 141037, true }, + { 141056, true }, + { 141081, true }, + { 141093, true }, + { 141106, true }, + { 141119, true }, + { 141131, true }, + { 141143, true }, + { 141160, true }, + { 141178, true }, + { 141190, false }, + { 141199, true }, + { 141214, true }, + { 141236, true }, + { 141250, true }, + { 141264, true }, + { 141277, true }, + { 141292, true }, + { 141307, true }, + { 141318, true }, + { 141343, true }, + { 141360, true }, + { 141372, true }, + { 141388, false }, + { 141403, false }, + { 141427, true }, + { 141435, true }, + { 141447, true }, + { 141460, true }, + { 141473, true }, + { 141485, true }, + { 141501, true }, + { 141516, true }, + { 141535, true }, + { 141549, true }, + { 141563, true }, + { 141583, true }, + { 141599, true }, + { 141618, true }, + { 141638, true }, + { 141650, true }, + { 141662, true }, + { 141692, true }, + { 141704, true }, + { 141715, true }, { 141725, true }, - { 141743, true }, + { 141739, true }, { 141752, true }, - { 141765, false }, - { 141782, true }, - { 141798, true }, - { 141809, true }, - { 141820, true }, - { 141830, true }, - { 141839, true }, - { 141853, true }, - { 141874, true }, - { 141885, true }, - { 141907, true }, - { 141922, true }, - { 141932, true }, - { 141954, true }, - { 141976, true }, - { 141993, true }, + { 141770, false }, + { 141780, true }, + { 141795, true }, + { 141813, true }, + { 141822, true }, + { 141835, true }, + { 141851, true }, + { 141862, true }, + { 141873, true }, + { 141883, true }, + { 141892, true }, + { 141906, true }, + { 141927, true }, + { 141938, true }, + { 141960, true }, + { 141975, true }, + { 141985, true }, { 142007, true }, - { 142020, true }, - { 142037, true }, - { 142062, true }, - { 142078, true }, - { 142088, true }, - { 142099, true }, - { 142108, false }, - { 142117, true }, - { 142126, true }, - { 142136, true }, - { 142150, true }, - { 142168, true }, - { 142177, true }, - { 142201, true }, - { 142222, true }, - { 142242, true }, - { 142260, true }, - { 142273, true }, - { 142290, true }, - { 142311, true }, - { 142329, true }, - { 142341, true }, - { 142363, false }, + { 142029, true }, + { 142046, true }, + { 142060, true }, + { 142073, true }, + { 142090, true }, + { 142115, true }, + { 142131, true }, + { 142141, true }, + { 142152, true }, + { 142161, false }, + { 142170, true }, + { 142179, true }, + { 142189, true }, + { 142203, true }, + { 142221, true }, + { 142230, true }, + { 142254, true }, + { 142275, true }, + { 142295, true }, + { 142313, true }, + { 142326, true }, + { 142343, true }, + { 142364, true }, { 142382, true }, - { 142393, true }, - { 142406, true }, - { 142427, true }, - { 142438, true }, - { 142453, true }, - { 142465, true }, - { 142482, true }, - { 142508, true }, - { 142525, false }, - { 142543, true }, - { 142562, false }, - { 142581, true }, - { 142593, true }, - { 142613, true }, - { 142635, true }, - { 142648, true }, - { 142670, true }, - { 142683, true }, - { 142706, true }, - { 142720, true }, - { 142743, true }, - { 142753, true }, - { 142763, true }, - { 142782, true }, - { 142795, true }, - { 142810, false }, - { 142822, true }, - { 142842, true }, - { 142852, true }, - { 142871, true }, - { 142883, true }, - { 142904, true }, - { 142930, true }, - { 142951, true }, - { 142971, true }, + { 142394, true }, + { 142416, false }, + { 142435, true }, + { 142446, true }, + { 142459, true }, + { 142480, true }, + { 142491, true }, + { 142506, true }, + { 142518, true }, + { 142535, true }, + { 142561, true }, + { 142578, false }, + { 142596, true }, + { 142615, false }, + { 142634, true }, + { 142646, true }, + { 142666, true }, + { 142688, true }, + { 142701, true }, + { 142723, true }, + { 142736, true }, + { 142759, true }, + { 142773, true }, + { 142796, true }, + { 142806, true }, + { 142816, true }, + { 142835, true }, + { 142848, true }, + { 142863, false }, + { 142875, true }, + { 142895, true }, + { 142905, true }, + { 142924, true }, + { 142936, true }, + { 142957, true }, { 142983, true }, - { 142997, true }, - { 143016, true }, - { 143028, true }, - { 143051, true }, - { 143067, true }, - { 143079, true }, + { 143004, true }, + { 143024, true }, + { 143036, true }, + { 143050, true }, + { 143069, true }, + { 143081, true }, { 143104, true }, - { 143119, true }, - { 143140, true }, + { 143120, true }, + { 143132, true }, { 143157, true }, - { 143178, false }, - { 143195, true }, - { 143213, true }, - { 143223, true }, - { 143237, true }, - { 143251, true }, - { 143261, true }, - { 143273, true }, - { 143285, true }, - { 143295, true }, - { 143309, true }, - { 143321, true }, - { 143350, true }, - { 143365, true }, - { 143379, true }, - { 143395, true }, - { 143410, true }, - { 143422, true }, - { 143442, true }, - { 143456, true }, - { 143469, true }, - { 143481, true }, - { 143494, true }, - { 143507, true }, - { 143519, true }, - { 143538, true }, - { 143564, true }, - { 143588, true }, - { 143611, true }, - { 143623, true }, + { 143172, true }, + { 143193, true }, + { 143210, true }, + { 143231, false }, + { 143248, true }, + { 143266, true }, + { 143276, true }, + { 143290, true }, + { 143304, true }, + { 143314, true }, + { 143326, true }, + { 143338, true }, + { 143348, true }, + { 143362, true }, + { 143374, true }, + { 143403, true }, + { 143418, true }, + { 143432, true }, + { 143448, true }, + { 143463, true }, + { 143475, true }, + { 143495, true }, + { 143509, true }, + { 143522, true }, + { 143534, true }, + { 143547, true }, + { 143560, true }, + { 143572, true }, + { 143591, true }, + { 143617, true }, { 143641, true }, - { 143657, true }, - { 143677, true }, - { 143695, true }, - { 143715, true }, - { 143729, true }, - { 143750, true }, - { 143763, true }, - { 143783, true }, + { 143664, true }, + { 143682, true }, + { 143698, true }, + { 143718, true }, + { 143736, true }, + { 143756, true }, + { 143770, true }, { 143791, true }, - { 143810, true }, - { 143829, true }, - { 143843, true }, - { 143861, true }, - { 143877, false }, - { 143896, true }, - { 143917, true }, - { 143936, true }, - { 143950, true }, - { 143959, true }, + { 143804, true }, + { 143824, true }, + { 143832, true }, + { 143851, true }, + { 143870, true }, + { 143884, true }, + { 143902, true }, + { 143918, false }, + { 143937, true }, + { 143958, true }, { 143977, true }, - { 143994, true }, - { 144010, true }, - { 144032, true }, - { 144049, true }, - { 144067, true }, - { 144086, true }, - { 144103, true }, - { 144116, true }, - { 144126, true }, - { 144134, true }, - { 144162, true }, - { 144179, true }, - { 144193, true }, - { 144208, true }, - { 144221, true }, - { 144233, true }, - { 144243, true }, - { 144256, true }, - { 144271, true }, - { 144283, true }, - { 144295, true }, - { 144307, true }, - { 144319, true }, - { 144332, true }, - { 144345, true }, - { 144357, true }, + { 143991, true }, + { 144000, true }, + { 144018, true }, + { 144035, true }, + { 144051, true }, + { 144073, true }, + { 144090, true }, + { 144108, true }, + { 144127, true }, + { 144144, true }, + { 144157, true }, + { 144167, true }, + { 144175, true }, + { 144203, true }, + { 144220, true }, + { 144234, true }, + { 144249, true }, + { 144262, true }, + { 144274, true }, + { 144284, true }, + { 144297, true }, + { 144312, true }, + { 144324, true }, + { 144336, true }, + { 144348, true }, + { 144360, true }, { 144373, true }, - { 144385, true }, + { 144386, true }, { 144398, true }, - { 144408, true }, - { 144418, true }, - { 144433, true }, - { 144444, true }, - { 144462, true }, - { 144470, true }, - { 144478, true }, - { 144490, true }, - { 144504, true }, - { 144521, true }, - { 144536, true }, - { 144552, true }, - { 144567, true }, - { 144582, true }, - { 144597, true }, - { 144605, true }, - { 144620, true }, - { 144633, true }, - { 144641, true }, - { 144651, true }, + { 144414, true }, + { 144426, true }, + { 144439, true }, + { 144449, true }, + { 144459, true }, + { 144474, true }, + { 144485, true }, + { 144496, true }, + { 144514, true }, + { 144522, true }, + { 144530, true }, + { 144542, true }, + { 144556, true }, + { 144573, true }, + { 144588, true }, + { 144604, true }, + { 144619, true }, + { 144634, true }, + { 144649, true }, + { 144657, true }, { 144672, true }, { 144685, true }, - { 144697, true }, - { 144705, true }, - { 144722, true }, - { 144738, true }, - { 144745, true }, - { 144753, false }, - { 144777, true }, - { 144809, true }, - { 144836, true }, - { 144856, true }, - { 144880, true }, - { 144897, true }, - { 144910, true }, - { 144925, true }, - { 144936, true }, - { 144947, true }, - { 144957, true }, - { 144969, true }, + { 144693, true }, + { 144703, true }, + { 144724, true }, + { 144737, true }, + { 144749, true }, + { 144757, true }, + { 144774, true }, + { 144790, true }, + { 144797, true }, + { 144805, false }, + { 144829, true }, + { 144861, true }, + { 144888, true }, + { 144908, true }, + { 144932, true }, + { 144949, true }, + { 144962, true }, { 144977, true }, - { 144989, false }, - { 145001, false }, - { 145009, false }, - { 145034, true }, - { 145047, true }, - { 145062, true }, - { 145076, true }, - { 145089, true }, - { 145101, true }, + { 144988, true }, + { 144999, true }, + { 145009, true }, + { 145021, true }, + { 145029, true }, + { 145041, false }, + { 145053, false }, + { 145061, false }, + { 145086, true }, + { 145099, true }, { 145114, true }, - { 145131, true }, - { 145145, true }, - { 145162, true }, - { 145176, true }, - { 145191, true }, - { 145206, true }, - { 145217, true }, - { 145224, true }, - { 145238, true }, - { 145246, true }, - { 145254, false }, + { 145128, true }, + { 145141, true }, + { 145153, true }, + { 145166, true }, + { 145183, true }, + { 145197, true }, + { 145214, true }, + { 145228, true }, + { 145243, true }, + { 145258, true }, { 145269, true }, - { 145281, true }, - { 145295, true }, - { 145306, true }, - { 145316, true }, - { 145326, true }, + { 145276, true }, + { 145290, true }, + { 145298, true }, + { 145306, false }, + { 145321, true }, { 145333, true }, - { 145346, true }, - { 145359, true }, + { 145347, true }, + { 145358, true }, { 145368, true }, - { 145376, true }, - { 145384, true }, - { 145393, true }, - { 145409, true }, + { 145378, true }, + { 145385, true }, + { 145398, true }, + { 145411, true }, { 145420, true }, - { 145432, true }, - { 145442, true }, - { 145459, false }, - { 145470, true }, - { 145478, true }, - { 145488, true }, - { 145497, true }, - { 145518, true }, - { 145543, true }, - { 145559, true }, - { 145571, true }, - { 145583, true }, - { 145596, true }, - { 145604, true }, - { 145612, false }, - { 145632, false }, - { 145651, true }, - { 145665, false }, - { 145684, false }, - { 145704, false }, - { 145724, false }, - { 145744, false }, - { 145763, false }, - { 145782, true }, - { 145793, true }, - { 145803, true }, - { 145812, true }, - { 145825, true }, - { 145840, true }, - { 145850, true }, - { 145863, true }, - { 145875, false }, - { 145886, true }, - { 145897, true }, - { 145906, true }, - { 145914, true }, - { 145927, true }, - { 145937, true }, - { 145946, true }, - { 145966, true }, - { 145989, true }, - { 146008, false }, - { 146019, true }, - { 146041, true }, - { 146055, true }, - { 146064, true }, - { 146071, true }, - { 146080, true }, - { 146087, true }, + { 145428, true }, + { 145436, true }, + { 145445, true }, + { 145461, true }, + { 145472, true }, + { 145484, true }, + { 145494, true }, + { 145511, false }, + { 145522, true }, + { 145532, true }, + { 145541, true }, + { 145562, true }, + { 145587, true }, + { 145603, true }, + { 145615, true }, + { 145627, true }, + { 145640, true }, + { 145648, true }, + { 145656, false }, + { 145676, false }, + { 145695, true }, + { 145709, false }, + { 145728, false }, + { 145748, false }, + { 145768, false }, + { 145788, false }, + { 145807, false }, + { 145826, true }, + { 145837, true }, + { 145847, true }, + { 145856, true }, + { 145869, true }, + { 145884, true }, + { 145894, true }, + { 145907, true }, + { 145919, false }, + { 145930, true }, + { 145941, true }, + { 145950, true }, + { 145958, true }, + { 145971, true }, + { 145981, true }, + { 145990, true }, + { 146010, true }, + { 146033, true }, + { 146052, false }, + { 146063, true }, + { 146085, true }, { 146099, true }, - { 146116, true }, - { 146123, true }, + { 146108, true }, + { 146115, true }, + { 146124, true }, { 146131, true }, - { 146142, true }, - { 146156, true }, - { 146168, true }, - { 146180, true }, - { 146189, true }, - { 146198, true }, - { 146210, false }, - { 146221, true }, - { 146234, true }, - { 146260, true }, - { 146283, false }, - { 146303, true }, - { 146320, true }, - { 146335, true }, - { 146349, true }, - { 146367, true }, - { 146386, true }, - { 146399, true }, - { 146410, true }, - { 146428, true }, + { 146143, true }, + { 146160, true }, + { 146167, true }, + { 146175, true }, + { 146186, true }, + { 146200, true }, + { 146212, true }, + { 146224, false }, + { 146233, true }, + { 146242, true }, + { 146254, false }, + { 146265, true }, + { 146278, true }, + { 146304, true }, + { 146327, false }, + { 146347, true }, + { 146364, true }, + { 146379, true }, + { 146393, true }, + { 146411, true }, + { 146430, true }, { 146443, true }, - { 146463, true }, + { 146454, true }, { 146472, true }, - { 146493, true }, - { 146513, true }, - { 146528, true }, - { 146543, true }, - { 146558, true }, + { 146487, true }, + { 146507, true }, + { 146516, true }, + { 146537, true }, + { 146557, true }, { 146572, true }, - { 146586, true }, - { 146595, true }, - { 146606, true }, - { 146621, true }, + { 146587, true }, + { 146602, true }, + { 146616, true }, { 146630, true }, - { 146638, true }, - { 146656, true }, - { 146667, true }, - { 146677, true }, - { 146686, true }, - { 146697, true }, - { 146707, true }, - { 146716, true }, - { 146729, true }, - { 146740, true }, - { 146750, true }, - { 146757, true }, - { 146768, true }, - { 146779, true }, - { 146793, true }, - { 146800, true }, - { 146811, true }, - { 146819, true }, - { 146837, true }, + { 146639, true }, + { 146650, true }, + { 146665, true }, + { 146674, true }, + { 146682, true }, + { 146695, true }, + { 146713, true }, + { 146724, true }, + { 146734, true }, + { 146743, true }, + { 146754, true }, + { 146764, true }, + { 146773, true }, + { 146786, true }, + { 146797, true }, + { 146807, true }, + { 146814, true }, + { 146825, true }, + { 146836, true }, { 146850, true }, - { 146862, true }, - { 146870, true }, - { 146890, false }, - { 146906, true }, - { 146925, true }, - { 146948, true }, - { 146967, true }, - { 146978, true }, - { 147000, true }, - { 147013, true }, - { 147022, true }, - { 147045, true }, + { 146857, true }, + { 146868, true }, + { 146876, true }, + { 146894, true }, + { 146907, true }, + { 146919, true }, + { 146927, true }, + { 146947, false }, + { 146963, true }, + { 146982, true }, + { 147005, true }, + { 147024, true }, + { 147035, true }, + { 147057, true }, + { 147070, true }, { 147079, true }, - { 147095, true }, - { 147111, true }, - { 147133, true }, - { 147160, true }, - { 147174, true }, - { 147184, true }, - { 147202, true }, - { 147212, true }, + { 147102, true }, + { 147136, true }, + { 147152, true }, + { 147168, true }, + { 147190, true }, + { 147217, true }, { 147231, true }, - { 147245, true }, + { 147241, true }, { 147259, true }, - { 147275, true }, - { 147286, true }, - { 147301, true }, - { 147312, true }, - { 147335, true }, + { 147269, true }, + { 147288, true }, + { 147302, true }, + { 147316, true }, + { 147332, true }, + { 147343, true }, { 147358, true }, - { 147376, true }, - { 147393, true }, - { 147403, true }, - { 147428, true }, - { 147446, true }, - { 147456, true }, - { 147468, true }, - { 147481, true }, - { 147492, true }, - { 147509, true }, - { 147519, true }, - { 147535, true }, - { 147556, true }, - { 147578, true }, - { 147596, true }, - { 147607, true }, - { 147621, true }, - { 147634, true }, - { 147645, true }, - { 147659, true }, - { 147672, true }, - { 147683, true }, - { 147693, true }, - { 147707, true }, - { 147717, true }, - { 147728, true }, - { 147741, true }, - { 147759, true }, - { 147768, true }, - { 147783, true }, - { 147799, true }, - { 147815, false }, - { 147828, false }, - { 147841, false }, - { 147853, true }, - { 147870, true }, - { 147881, true }, - { 147896, true }, - { 147908, true }, - { 147925, true }, - { 147939, true }, - { 147952, true }, - { 147961, true }, - { 147972, true }, - { 147983, true }, - { 147995, true }, - { 148008, true }, - { 148021, true }, - { 148030, true }, - { 148041, true }, - { 148057, true }, - { 148069, true }, - { 148081, true }, - { 148093, true }, - { 148110, true }, - { 148122, true }, - { 148136, true }, - { 148146, true }, - { 148159, true }, - { 148176, true }, - { 148190, true }, - { 148205, true }, - { 148215, true }, - { 148231, true }, + { 147369, true }, + { 147392, true }, + { 147415, true }, + { 147433, true }, + { 147450, true }, + { 147460, true }, + { 147485, true }, + { 147503, true }, + { 147513, true }, + { 147525, true }, + { 147538, true }, + { 147549, true }, + { 147566, true }, + { 147576, true }, + { 147592, true }, + { 147613, true }, + { 147635, true }, + { 147653, true }, + { 147664, true }, + { 147678, true }, + { 147691, true }, + { 147702, true }, + { 147716, true }, + { 147729, true }, + { 147740, true }, + { 147750, true }, + { 147764, true }, + { 147774, true }, + { 147785, true }, + { 147798, true }, + { 147816, true }, + { 147825, true }, + { 147840, true }, + { 147856, true }, + { 147872, false }, + { 147885, false }, + { 147898, false }, + { 147910, true }, + { 147927, true }, + { 147938, true }, + { 147953, true }, + { 147965, true }, + { 147982, true }, + { 147996, true }, + { 148009, true }, + { 148018, true }, + { 148029, true }, + { 148040, true }, + { 148052, true }, + { 148065, true }, + { 148078, true }, + { 148087, true }, + { 148098, true }, + { 148114, true }, + { 148126, true }, + { 148138, true }, + { 148150, true }, + { 148167, true }, + { 148179, true }, + { 148193, true }, + { 148203, true }, + { 148216, true }, + { 148233, true }, { 148247, true }, - { 148256, true }, - { 148263, true }, - { 148274, true }, - { 148291, true }, + { 148262, true }, + { 148272, true }, + { 148288, true }, { 148304, true }, - { 148319, true }, - { 148329, true }, - { 148340, true }, - { 148363, true }, - { 148375, false }, - { 148389, true }, - { 148405, true }, - { 148416, true }, + { 148313, true }, + { 148320, true }, + { 148331, true }, + { 148348, true }, + { 148361, true }, + { 148376, true }, + { 148386, true }, + { 148397, true }, + { 148420, true }, { 148432, false }, - { 148451, true }, - { 148470, true }, - { 148481, true }, - { 148502, true }, - { 148518, true }, - { 148530, true }, - { 148544, true }, - { 148558, true }, - { 148569, true }, - { 148590, true }, - { 148603, true }, - { 148613, true }, - { 148624, true }, - { 148641, true }, - { 148661, true }, - { 148676, true }, - { 148695, false }, - { 148712, true }, - { 148728, true }, - { 148751, true }, - { 148766, true }, - { 148782, true }, - { 148793, true }, - { 148801, true }, - { 148824, true }, - { 148836, true }, - { 148844, true }, - { 148870, true }, - { 148888, true }, + { 148446, true }, + { 148462, true }, + { 148473, true }, + { 148489, false }, + { 148508, true }, + { 148527, true }, + { 148538, true }, + { 148559, true }, + { 148575, true }, + { 148587, true }, + { 148601, true }, + { 148615, true }, + { 148626, true }, + { 148647, true }, + { 148660, true }, + { 148670, true }, + { 148681, true }, + { 148698, true }, + { 148718, true }, + { 148733, true }, + { 148752, false }, + { 148769, true }, + { 148785, true }, + { 148808, true }, + { 148823, true }, + { 148839, true }, + { 148850, true }, + { 148858, true }, + { 148881, true }, + { 148893, true }, { 148901, true }, - { 148909, true }, - { 148921, true }, - { 148948, true }, - { 148979, true }, - { 148995, true }, - { 149006, true }, - { 149016, true }, - { 149031, true }, - { 149042, true }, - { 149053, false }, - { 149066, true }, - { 149075, true }, + { 148927, true }, + { 148945, true }, + { 148958, true }, + { 148966, true }, + { 148978, true }, + { 149005, true }, + { 149036, true }, + { 149052, true }, + { 149063, true }, + { 149073, true }, { 149088, true }, - { 149116, true }, - { 149137, true }, - { 149151, true }, + { 149099, true }, + { 149110, false }, + { 149123, true }, + { 149132, true }, + { 149145, true }, { 149173, true }, - { 149190, true }, - { 149200, true }, - { 149212, true }, - { 149228, true }, - { 149242, true }, - { 149253, true }, - { 149267, true }, + { 149194, true }, + { 149208, true }, + { 149230, true }, + { 149247, true }, + { 149257, true }, + { 149269, true }, { 149285, true }, - { 149302, true }, - { 149322, true }, - { 149333, true }, - { 149344, false }, - { 149351, true }, - { 149378, true }, - { 149398, true }, - { 149416, true }, - { 149431, false }, - { 149442, true }, - { 149458, true }, - { 149475, true }, - { 149492, true }, - { 149514, true }, - { 149528, true }, - { 149544, false }, - { 149561, true }, - { 149577, true }, - { 149587, true }, - { 149608, true }, - { 149626, true }, + { 149299, true }, + { 149310, true }, + { 149324, true }, + { 149342, true }, + { 149359, true }, + { 149379, true }, + { 149390, true }, + { 149401, false }, + { 149408, true }, + { 149435, true }, + { 149455, true }, + { 149473, true }, + { 149488, false }, + { 149499, true }, + { 149515, true }, + { 149532, true }, + { 149549, true }, + { 149571, true }, + { 149585, true }, + { 149601, false }, + { 149618, true }, + { 149634, true }, { 149644, true }, - { 149658, true }, - { 149668, true }, - { 149679, true }, + { 149665, true }, + { 149683, true }, { 149701, true }, - { 149718, true }, - { 149738, true }, - { 149752, true }, - { 149769, true }, - { 149786, true }, - { 149803, true }, - { 149824, true }, - { 149840, true }, - { 149863, true }, - { 149880, true }, - { 149898, true }, - { 149905, true }, - { 149915, true }, - { 149931, true }, - { 149942, false }, + { 149715, true }, + { 149725, true }, + { 149736, true }, + { 149758, true }, + { 149775, true }, + { 149795, true }, + { 149809, true }, + { 149826, true }, + { 149843, true }, + { 149860, true }, + { 149881, true }, + { 149897, true }, + { 149920, true }, + { 149937, true }, + { 149955, true }, { 149962, true }, - { 149975, true }, - { 149985, true }, - { 150002, true }, - { 150022, true }, - { 150037, true }, - { 150054, true }, - { 150068, true }, - { 150086, true }, - { 150100, true }, - { 150121, true }, - { 150135, true }, - { 150151, false }, - { 150165, true }, - { 150182, true }, - { 150199, true }, - { 150215, true }, - { 150235, true }, - { 150258, true }, - { 150267, false }, - { 150275, true }, - { 150287, false }, - { 150309, true }, - { 150324, true }, - { 150338, true }, - { 150352, true }, + { 149972, true }, + { 149988, true }, + { 149999, false }, + { 150019, true }, + { 150032, true }, + { 150042, true }, + { 150059, true }, + { 150079, true }, + { 150094, true }, + { 150111, true }, + { 150125, true }, + { 150143, true }, + { 150157, true }, + { 150178, true }, + { 150189, true }, + { 150203, true }, + { 150219, false }, + { 150233, true }, + { 150250, true }, + { 150267, true }, + { 150283, true }, + { 150303, true }, + { 150326, true }, + { 150335, false }, + { 150343, false }, { 150365, true }, { 150380, true }, { 150394, true }, - { 150415, true }, - { 150426, true }, + { 150408, true }, + { 150421, true }, { 150436, true }, - { 150444, false }, - { 150466, true }, - { 150478, true }, - { 150503, true }, - { 150513, true }, - { 150538, true }, - { 150551, false }, - { 150576, true }, - { 150593, true }, - { 150606, true }, - { 150617, true }, - { 150625, true }, - { 150634, true }, - { 150648, true }, - { 150661, true }, - { 150677, true }, - { 150693, true }, - { 150703, true }, - { 150714, true }, - { 150725, true }, - { 150741, true }, - { 150751, false }, - { 150763, true }, - { 150775, true }, - { 150790, true }, - { 150808, true }, - { 150820, true }, - { 150830, true }, + { 150450, true }, + { 150471, true }, + { 150482, true }, + { 150492, true }, + { 150500, false }, + { 150522, true }, + { 150534, true }, + { 150559, true }, + { 150569, true }, + { 150594, true }, + { 150607, false }, + { 150632, true }, + { 150649, true }, + { 150662, true }, + { 150673, true }, + { 150681, true }, + { 150690, true }, + { 150704, true }, + { 150717, true }, + { 150733, true }, + { 150749, true }, + { 150759, true }, + { 150770, true }, + { 150781, true }, + { 150797, true }, + { 150807, false }, + { 150819, true }, + { 150831, true }, { 150846, true }, - { 150870, true }, - { 150877, true }, - { 150884, true }, - { 150901, true }, - { 150915, true }, - { 150927, true }, - { 150939, true }, - { 150951, true }, - { 150965, true }, - { 150986, true }, - { 150999, true }, - { 151010, true }, - { 151027, true }, + { 150864, true }, + { 150876, true }, + { 150886, true }, + { 150902, true }, + { 150926, true }, + { 150933, true }, + { 150940, true }, + { 150957, true }, + { 150971, true }, + { 150983, true }, + { 150995, true }, + { 151007, true }, + { 151021, true }, { 151042, true }, - { 151067, true }, - { 151082, true }, - { 151093, true }, - { 151102, true }, - { 151111, true }, - { 151126, true }, - { 151136, true }, - { 151152, true }, - { 151165, true }, - { 151177, true }, - { 151194, true }, - { 151215, true }, - { 151236, true }, - { 151253, true }, + { 151055, true }, + { 151066, true }, + { 151083, true }, + { 151098, true }, + { 151123, true }, + { 151138, true }, + { 151149, true }, + { 151158, true }, + { 151167, true }, + { 151182, true }, + { 151192, true }, + { 151208, true }, + { 151221, true }, + { 151233, true }, + { 151250, true }, { 151271, true }, - { 151283, true }, - { 151298, true }, - { 151314, true }, - { 151328, true }, - { 151340, true }, + { 151292, true }, + { 151309, true }, + { 151327, true }, + { 151339, true }, { 151354, true }, - { 151366, true }, - { 151385, true }, - { 151401, true }, - { 151417, true }, - { 151433, true }, - { 151451, true }, - { 151468, true }, - { 151486, true }, - { 151500, true }, - { 151518, true }, - { 151535, true }, - { 151554, true }, + { 151370, true }, + { 151384, true }, + { 151396, true }, + { 151410, true }, + { 151422, true }, + { 151441, true }, + { 151457, true }, + { 151473, true }, + { 151489, true }, + { 151507, true }, + { 151524, true }, + { 151542, true }, + { 151556, true }, { 151574, true }, { 151591, true }, - { 151607, true }, - { 151625, false }, - { 151638, true }, - { 151655, true }, - { 151672, false }, - { 151693, true }, - { 151710, true }, - { 151729, true }, - { 151743, true }, - { 151756, true }, - { 151771, true }, - { 151784, true }, - { 151795, true }, - { 151813, true }, - { 151825, true }, - { 151838, true }, - { 151862, true }, - { 151871, true }, - { 151886, true }, - { 151913, true }, - { 151931, true }, - { 151940, true }, - { 151950, true }, - { 151961, true }, - { 151971, true }, - { 151984, true }, - { 151992, true }, - { 151999, true }, - { 152018, true }, - { 152025, true }, + { 151610, true }, + { 151630, true }, + { 151647, true }, + { 151663, true }, + { 151681, false }, + { 151694, true }, + { 151711, true }, + { 151728, false }, + { 151749, true }, + { 151766, true }, + { 151785, true }, + { 151799, true }, + { 151812, true }, + { 151827, true }, + { 151840, true }, + { 151851, true }, + { 151869, true }, + { 151881, true }, + { 151894, true }, + { 151918, true }, + { 151927, true }, + { 151942, true }, + { 151969, true }, + { 151987, true }, + { 151996, true }, + { 152006, true }, + { 152017, true }, + { 152027, true }, { 152040, true }, - { 152049, true }, - { 152061, true }, - { 152073, false }, - { 152093, true }, - { 152107, true }, + { 152048, true }, + { 152055, true }, + { 152074, true }, + { 152081, true }, + { 152096, true }, + { 152105, true }, { 152117, true }, - { 152135, true }, - { 152152, true }, - { 152174, true }, - { 152187, true }, - { 152206, true }, - { 152218, true }, - { 152231, true }, - { 152250, true }, - { 152265, true }, - { 152281, true }, + { 152129, false }, + { 152149, true }, + { 152163, true }, + { 152173, true }, + { 152190, true }, + { 152208, true }, + { 152225, true }, + { 152247, true }, + { 152260, true }, + { 152279, true }, + { 152291, true }, { 152304, true }, - { 152324, true }, - { 152337, true }, - { 152349, true }, - { 152360, true }, - { 152371, true }, - { 152382, true }, - { 152401, true }, - { 152413, true }, - { 152430, true }, + { 152323, true }, + { 152338, true }, + { 152354, true }, + { 152377, true }, + { 152397, true }, + { 152410, true }, + { 152424, true }, + { 152436, true }, { 152447, true }, - { 152459, true }, - { 152476, true }, - { 152487, true }, - { 152511, true }, - { 152521, true }, - { 152533, true }, - { 152543, true }, - { 152559, true }, - { 152590, true }, - { 152599, true }, - { 152616, true }, - { 152628, true }, - { 152647, true }, - { 152663, true }, - { 152680, true }, - { 152693, true }, - { 152706, true }, - { 152716, true }, - { 152730, true }, - { 152739, true }, - { 152749, true }, - { 152764, true }, - { 152774, true }, - { 152788, true }, - { 152804, true }, - { 152819, true }, - { 152832, true }, - { 152842, true }, - { 152860, true }, - { 152877, true }, - { 152893, true }, - { 152910, true }, - { 152932, true }, - { 152944, true }, - { 152962, true }, - { 152976, false }, - { 152991, true }, - { 153004, true }, - { 153017, true }, - { 153029, true }, - { 153041, true }, - { 153052, true }, - { 153069, true }, - { 153081, true }, - { 153100, true }, - { 153126, true }, - { 153135, true }, - { 153150, false }, - { 153157, true }, - { 153173, true }, - { 153188, true }, - { 153210, true }, - { 153235, true }, - { 153251, true }, - { 153269, true }, - { 153283, true }, - { 153293, true }, - { 153303, true }, - { 153314, true }, - { 153329, true }, - { 153339, true }, - { 153351, true }, - { 153369, true }, - { 153385, true }, - { 153400, true }, - { 153415, false }, + { 152458, true }, + { 152469, true }, + { 152488, true }, + { 152500, true }, + { 152517, true }, + { 152534, true }, + { 152546, true }, + { 152563, true }, + { 152574, true }, + { 152598, true }, + { 152608, true }, + { 152620, true }, + { 152630, true }, + { 152646, true }, + { 152677, true }, + { 152686, true }, + { 152703, true }, + { 152715, true }, + { 152734, true }, + { 152750, true }, + { 152767, true }, + { 152780, true }, + { 152793, true }, + { 152803, true }, + { 152817, true }, + { 152826, true }, + { 152836, true }, + { 152851, true }, + { 152861, true }, + { 152875, true }, + { 152891, true }, + { 152906, true }, + { 152919, true }, + { 152929, true }, + { 152947, true }, + { 152964, true }, + { 152980, true }, + { 152997, true }, + { 153019, true }, + { 153031, true }, + { 153049, true }, + { 153063, false }, + { 153078, true }, + { 153091, true }, + { 153104, true }, + { 153116, true }, + { 153128, true }, + { 153139, true }, + { 153156, true }, + { 153168, true }, + { 153187, true }, + { 153213, true }, + { 153222, true }, + { 153237, false }, + { 153244, true }, + { 153260, true }, + { 153275, true }, + { 153297, true }, + { 153322, true }, + { 153338, true }, + { 153356, true }, + { 153370, true }, + { 153380, true }, + { 153390, true }, + { 153401, true }, + { 153416, true }, + { 153426, true }, { 153438, true }, - { 153446, true }, - { 153462, true }, - { 153475, true }, - { 153486, true }, - { 153503, true }, - { 153523, true }, - { 153535, true }, - { 153566, true }, - { 153587, true }, - { 153600, true }, - { 153621, true }, - { 153632, true }, - { 153649, true }, - { 153661, true }, + { 153456, true }, + { 153472, true }, + { 153487, true }, + { 153502, false }, + { 153525, true }, + { 153533, true }, + { 153549, true }, + { 153562, true }, + { 153573, true }, + { 153590, true }, + { 153610, true }, + { 153622, true }, + { 153653, true }, { 153674, true }, - { 153682, true }, - { 153693, true }, - { 153702, true }, - { 153711, true }, - { 153725, true }, - { 153737, false }, - { 153744, true }, - { 153752, true }, + { 153687, true }, + { 153708, true }, + { 153719, true }, + { 153736, true }, + { 153748, true }, { 153761, true }, - { 153772, true }, - { 153779, true }, - { 153796, true }, - { 153804, true }, - { 153818, true }, - { 153826, true }, - { 153845, false }, - { 153865, true }, - { 153875, true }, - { 153896, true }, - { 153907, false }, - { 153919, true }, - { 153936, true }, - { 153947, true }, - { 153976, true }, - { 153990, true }, - { 154004, true }, - { 154021, true }, - { 154033, true }, - { 154048, true }, - { 154056, true }, - { 154064, true }, - { 154078, true }, - { 154095, true }, - { 154113, true }, - { 154126, true }, - { 154135, false }, - { 154153, true }, - { 154166, true }, - { 154175, true }, - { 154198, true }, - { 154212, true }, - { 154225, true }, - { 154241, true }, - { 154258, true }, - { 154271, true }, - { 154289, true }, - { 154301, true }, - { 154320, true }, - { 154342, true }, - { 154364, true }, - { 154384, false }, - { 154400, true }, - { 154423, true }, - { 154432, true }, - { 154447, true }, - { 154455, true }, - { 154470, true }, - { 154489, true }, - { 154505, true }, + { 153769, true }, + { 153780, true }, + { 153789, true }, + { 153798, true }, + { 153812, true }, + { 153824, false }, + { 153831, true }, + { 153839, true }, + { 153848, true }, + { 153859, true }, + { 153866, true }, + { 153883, true }, + { 153891, true }, + { 153905, true }, + { 153913, true }, + { 153932, false }, + { 153952, true }, + { 153962, true }, + { 153983, true }, + { 153994, false }, + { 154006, true }, + { 154023, true }, + { 154034, true }, + { 154063, true }, + { 154077, true }, + { 154091, true }, + { 154108, true }, + { 154120, true }, + { 154135, true }, + { 154143, true }, + { 154151, true }, + { 154165, true }, + { 154182, true }, + { 154200, true }, + { 154213, true }, + { 154222, false }, + { 154240, true }, + { 154253, true }, + { 154262, true }, + { 154285, true }, + { 154299, true }, + { 154312, true }, + { 154328, true }, + { 154345, true }, + { 154358, true }, + { 154376, true }, + { 154388, true }, + { 154407, true }, + { 154429, true }, + { 154451, true }, + { 154471, false }, + { 154487, true }, + { 154510, true }, { 154519, true }, - { 154535, true }, - { 154555, true }, - { 154565, true }, - { 154583, true }, - { 154590, true }, - { 154602, true }, - { 154615, true }, - { 154625, true }, - { 154633, true }, - { 154641, true }, - { 154649, false }, - { 154672, true }, - { 154691, true }, - { 154716, true }, - { 154733, true }, - { 154745, true }, - { 154757, true }, - { 154772, true }, - { 154781, true }, - { 154795, true }, - { 154808, true }, - { 154830, true }, - { 154840, true }, - { 154861, true }, + { 154534, true }, + { 154542, true }, + { 154557, true }, + { 154576, true }, + { 154592, true }, + { 154606, true }, + { 154622, true }, + { 154642, true }, + { 154652, true }, + { 154670, true }, + { 154677, true }, + { 154689, true }, + { 154702, true }, + { 154712, true }, + { 154720, true }, + { 154728, true }, + { 154736, false }, + { 154759, true }, + { 154778, true }, + { 154803, true }, + { 154820, true }, + { 154832, true }, + { 154844, true }, + { 154859, true }, + { 154868, true }, { 154882, true }, - { 154899, true }, - { 154920, true }, - { 154934, true }, - { 154950, true }, - { 154963, true }, - { 154973, true }, - { 154983, true }, - { 154996, true }, - { 155020, true }, - { 155039, true }, - { 155051, true }, - { 155069, true }, - { 155078, true }, - { 155095, true }, - { 155113, true }, - { 155126, false }, - { 155147, true }, - { 155157, true }, - { 155176, true }, - { 155189, true }, + { 154895, true }, + { 154917, true }, + { 154927, true }, + { 154948, true }, + { 154969, true }, + { 154986, true }, + { 155007, true }, + { 155021, true }, + { 155037, true }, + { 155050, true }, + { 155060, true }, + { 155070, true }, + { 155083, true }, + { 155107, true }, + { 155126, true }, + { 155138, true }, + { 155156, true }, + { 155165, true }, + { 155182, true }, { 155200, true }, - { 155215, true }, - { 155235, true }, - { 155246, true }, - { 155258, true }, - { 155273, true }, - { 155286, true }, - { 155301, true }, - { 155316, true }, - { 155329, false }, - { 155338, true }, - { 155357, true }, - { 155374, false }, - { 155389, true }, + { 155213, false }, + { 155234, true }, + { 155244, true }, + { 155263, true }, + { 155276, true }, + { 155287, true }, + { 155302, true }, + { 155322, true }, + { 155333, true }, + { 155345, true }, + { 155360, true }, + { 155373, true }, + { 155388, true }, { 155403, true }, - { 155413, true }, - { 155426, true }, - { 155442, true }, - { 155460, true }, - { 155470, true }, - { 155482, true }, - { 155495, true }, - { 155508, true }, - { 155517, true }, - { 155541, true }, - { 155565, true }, - { 155582, false }, + { 155416, false }, + { 155425, true }, + { 155444, true }, + { 155461, false }, + { 155476, true }, + { 155490, true }, + { 155500, true }, + { 155513, true }, + { 155529, true }, + { 155547, true }, + { 155557, true }, + { 155569, true }, + { 155582, true }, { 155595, true }, - { 155606, true }, - { 155622, true }, - { 155634, true }, - { 155650, true }, - { 155667, true }, - { 155679, true }, - { 155696, true }, - { 155715, false }, - { 155724, true }, - { 155746, true }, - { 155760, true }, - { 155773, false }, - { 155788, true }, - { 155803, true }, - { 155815, true }, - { 155834, false }, - { 155857, true }, - { 155873, true }, - { 155889, false }, - { 155909, true }, - { 155922, true }, - { 155938, true }, - { 155949, true }, - { 155968, true }, - { 155982, true }, - { 155993, true }, - { 156003, true }, - { 156020, true }, - { 156032, true }, - { 156050, true }, + { 155604, true }, + { 155628, true }, + { 155652, true }, + { 155669, false }, + { 155682, true }, + { 155693, true }, + { 155709, true }, + { 155721, true }, + { 155737, true }, + { 155754, true }, + { 155766, true }, + { 155783, true }, + { 155802, false }, + { 155811, true }, + { 155833, true }, + { 155847, true }, + { 155860, false }, + { 155875, true }, + { 155890, true }, + { 155902, true }, + { 155921, false }, + { 155944, true }, + { 155960, true }, + { 155976, false }, + { 155996, true }, + { 156009, true }, + { 156025, true }, + { 156036, true }, + { 156055, true }, { 156069, true }, - { 156081, true }, - { 156092, true }, - { 156111, true }, - { 156132, true }, - { 156145, true }, - { 156161, true }, - { 156185, false }, - { 156203, true }, - { 156221, false }, - { 156241, true }, - { 156257, true }, - { 156275, true }, - { 156287, true }, - { 156304, true }, - { 156327, true }, - { 156346, true }, - { 156366, true }, - { 156379, true }, + { 156080, true }, + { 156090, true }, + { 156107, true }, + { 156119, true }, + { 156137, true }, + { 156156, true }, + { 156168, true }, + { 156179, true }, + { 156198, true }, + { 156219, true }, + { 156232, true }, + { 156248, true }, + { 156272, false }, + { 156290, true }, + { 156308, false }, + { 156328, true }, + { 156344, true }, + { 156362, true }, + { 156374, true }, { 156391, true }, - { 156399, true }, - { 156419, true }, - { 156427, true }, - { 156443, true }, - { 156457, true }, + { 156414, true }, + { 156433, true }, + { 156453, true }, { 156466, true }, { 156478, true }, - { 156488, true }, - { 156497, true }, + { 156486, true }, + { 156506, true }, { 156514, true }, - { 156526, true }, - { 156537, true }, - { 156547, true }, - { 156558, true }, - { 156571, true }, + { 156530, true }, + { 156544, true }, + { 156553, true }, + { 156565, true }, + { 156575, true }, { 156584, true }, { 156601, true }, - { 156612, true }, - { 156622, true }, - { 156639, true }, - { 156667, true }, - { 156681, true }, - { 156693, true }, - { 156712, true }, - { 156722, true }, - { 156739, true }, - { 156761, true }, - { 156775, true }, - { 156789, true }, - { 156804, true }, - { 156818, true }, - { 156828, true }, - { 156837, true }, - { 156843, true }, - { 156849, true }, - { 156857, true }, - { 156878, true }, - { 156888, true }, - { 156906, true }, - { 156917, true }, - { 156935, true }, - { 156948, true }, - { 156967, true }, - { 156983, true }, - { 156994, true }, - { 157007, true }, - { 157021, true }, - { 157038, false }, - { 157052, true }, - { 157071, true }, - { 157081, true }, - { 157089, true }, + { 156613, true }, + { 156624, true }, + { 156634, true }, + { 156645, true }, + { 156658, true }, + { 156671, true }, + { 156688, true }, + { 156699, true }, + { 156709, true }, + { 156726, true }, + { 156754, true }, + { 156768, true }, + { 156780, true }, + { 156799, true }, + { 156809, true }, + { 156826, true }, + { 156848, true }, + { 156862, true }, + { 156876, true }, + { 156891, true }, + { 156905, true }, + { 156915, true }, + { 156924, true }, + { 156930, true }, + { 156936, true }, + { 156944, true }, + { 156956, true }, + { 156977, true }, + { 156987, true }, + { 157005, true }, + { 157016, true }, + { 157034, true }, + { 157047, true }, + { 157066, true }, + { 157082, true }, + { 157095, true }, { 157106, true }, - { 157120, true }, - { 157132, true }, - { 157149, true }, - { 157163, true }, - { 157177, false }, - { 157190, true }, - { 157208, true }, - { 157220, true }, + { 157119, true }, + { 157133, true }, + { 157150, false }, + { 157164, true }, + { 157183, true }, + { 157193, true }, + { 157201, true }, + { 157218, true }, { 157232, true }, - { 157251, true }, - { 157270, true }, - { 157284, true }, - { 157296, true }, - { 157309, true }, - { 157325, true }, - { 157338, true }, - { 157351, true }, - { 157366, true }, - { 157394, true }, - { 157405, true }, - { 157418, true }, + { 157244, true }, + { 157261, true }, + { 157275, true }, + { 157289, false }, + { 157302, true }, + { 157320, true }, + { 157332, true }, + { 157344, true }, + { 157363, true }, + { 157382, true }, + { 157396, true }, + { 157408, true }, + { 157421, true }, { 157437, true }, { 157450, true }, - { 157475, true }, - { 157487, true }, - { 157501, true }, - { 157515, true }, + { 157463, true }, + { 157478, true }, + { 157506, true }, + { 157517, true }, { 157530, true }, - { 157544, true }, - { 157558, true }, - { 157572, true }, - { 157588, true }, - { 157611, true }, + { 157549, true }, + { 157562, true }, + { 157587, true }, + { 157599, true }, + { 157613, true }, { 157627, true }, { 157642, true }, - { 157666, true }, - { 157685, true }, - { 157698, true }, - { 157709, true }, + { 157656, true }, + { 157670, true }, + { 157684, true }, + { 157700, true }, + { 157723, true }, { 157739, true }, - { 157759, true }, - { 157779, true }, - { 157791, true }, - { 157809, true }, - { 157824, true }, - { 157843, true }, - { 157856, true }, - { 157877, true }, - { 157895, true }, - { 157919, true }, - { 157935, true }, - { 157948, true }, + { 157754, true }, + { 157778, true }, + { 157797, true }, + { 157810, true }, + { 157821, true }, + { 157851, true }, + { 157871, true }, + { 157891, true }, + { 157903, true }, + { 157921, true }, + { 157936, true }, + { 157955, true }, { 157968, true }, - { 157981, true }, - { 157998, true }, - { 158013, true }, - { 158033, true }, - { 158046, true }, - { 158061, true }, - { 158073, true }, - { 158091, true }, + { 157989, true }, + { 158007, true }, + { 158031, true }, + { 158047, true }, + { 158060, true }, + { 158080, true }, + { 158093, true }, { 158110, true }, - { 158129, true }, - { 158143, true }, + { 158125, true }, + { 158145, true }, { 158158, true }, - { 158175, true }, - { 158187, true }, - { 158204, true }, - { 158219, true }, - { 158237, true }, - { 158249, true }, - { 158263, true }, - { 158274, true }, - { 158296, true }, - { 158308, true }, - { 158317, true }, - { 158329, true }, - { 158344, true }, - { 158367, true }, - { 158378, true }, - { 158396, true }, - { 158412, true }, - { 158428, true }, - { 158445, true }, - { 158464, true }, - { 158482, true }, - { 158488, true }, - { 158506, false }, - { 158526, true }, - { 158543, true }, - { 158555, true }, - { 158574, false }, - { 158591, true }, - { 158610, true }, - { 158621, true }, - { 158640, true }, - { 158663, true }, - { 158674, true }, - { 158692, true }, - { 158709, true }, - { 158728, true }, - { 158746, true }, - { 158755, true }, - { 158762, true }, - { 158769, true }, - { 158781, false }, - { 158801, true }, - { 158809, true }, - { 158820, true }, - { 158843, true }, - { 158867, true }, - { 158890, true }, - { 158913, true }, - { 158941, true }, - { 158970, true }, - { 158983, true }, - { 158998, true }, - { 159017, true }, - { 159030, true }, - { 159048, true }, - { 159071, true }, - { 159082, true }, - { 159099, true }, - { 159110, true }, - { 159121, true }, - { 159139, true }, - { 159165, true }, - { 159194, true }, - { 159206, true }, - { 159219, false }, - { 159239, true }, - { 159251, true }, - { 159269, false }, - { 159284, true }, - { 159305, false }, - { 159321, true }, - { 159339, true }, - { 159355, true }, - { 159373, true }, - { 159389, true }, - { 159401, true }, - { 159423, true }, - { 159443, true }, - { 159461, true }, - { 159480, true }, - { 159500, true }, - { 159519, true }, - { 159536, true }, - { 159554, false }, - { 159572, true }, - { 159591, true }, - { 159618, true }, - { 159630, true }, - { 159644, true }, - { 159659, true }, - { 159671, true }, - { 159682, true }, - { 159701, true }, - { 159715, true }, - { 159730, true }, - { 159739, true }, - { 159754, true }, - { 159764, true }, - { 159777, true }, + { 158173, true }, + { 158185, true }, + { 158203, true }, + { 158222, true }, + { 158241, true }, + { 158255, true }, + { 158270, true }, + { 158287, true }, + { 158299, true }, + { 158316, true }, + { 158331, true }, + { 158349, true }, + { 158361, true }, + { 158375, true }, + { 158386, true }, + { 158408, true }, + { 158420, true }, + { 158429, true }, + { 158441, true }, + { 158456, true }, + { 158479, true }, + { 158490, true }, + { 158508, true }, + { 158524, true }, + { 158540, true }, + { 158557, true }, + { 158576, true }, + { 158594, true }, + { 158600, true }, + { 158618, false }, + { 158638, true }, + { 158655, true }, + { 158669, true }, + { 158681, true }, + { 158700, false }, + { 158717, true }, + { 158736, true }, + { 158747, true }, + { 158766, true }, + { 158789, true }, + { 158800, true }, + { 158818, true }, + { 158835, true }, + { 158854, true }, + { 158872, true }, + { 158881, true }, + { 158888, true }, + { 158895, true }, + { 158907, false }, + { 158927, true }, + { 158935, true }, + { 158946, true }, + { 158969, true }, + { 158993, true }, + { 159016, true }, + { 159039, true }, + { 159067, true }, + { 159096, true }, + { 159109, true }, + { 159124, true }, + { 159143, true }, + { 159156, true }, + { 159174, true }, + { 159197, true }, + { 159208, true }, + { 159225, true }, + { 159236, true }, + { 159247, true }, + { 159265, true }, + { 159291, true }, + { 159320, true }, + { 159332, true }, + { 159345, false }, + { 159365, true }, + { 159377, true }, + { 159395, false }, + { 159410, true }, + { 159431, false }, + { 159447, true }, + { 159465, true }, + { 159481, true }, + { 159499, true }, + { 159515, true }, + { 159527, true }, + { 159549, true }, + { 159569, true }, + { 159587, true }, + { 159606, true }, + { 159626, true }, + { 159645, true }, + { 159662, true }, + { 159680, false }, + { 159698, true }, + { 159717, true }, + { 159744, true }, + { 159756, true }, + { 159770, true }, + { 159785, true }, { 159797, true }, - { 159806, true }, - { 159816, true }, - { 159837, false }, - { 159854, true }, - { 159863, true }, - { 159876, true }, - { 159893, true }, - { 159907, true }, - { 159921, true }, - { 159933, true }, - { 159950, true }, - { 159960, true }, - { 159976, true }, - { 159988, true }, - { 159999, false }, - { 160015, true }, - { 160026, true }, - { 160042, true }, - { 160055, true }, - { 160064, true }, - { 160077, true }, - { 160094, true }, - { 160106, true }, - { 160118, true }, - { 160130, true }, - { 160139, true }, - { 160151, true }, - { 160166, true }, - { 160180, true }, + { 159808, true }, + { 159827, true }, + { 159841, true }, + { 159856, true }, + { 159865, true }, + { 159880, true }, + { 159890, true }, + { 159903, true }, + { 159923, true }, + { 159932, true }, + { 159942, true }, + { 159963, false }, + { 159980, true }, + { 159989, true }, + { 160002, true }, + { 160019, true }, + { 160033, true }, + { 160047, true }, + { 160059, true }, + { 160076, true }, + { 160086, true }, + { 160102, true }, + { 160114, true }, + { 160125, false }, + { 160141, true }, + { 160152, true }, + { 160168, true }, + { 160181, true }, { 160190, true }, - { 160211, true }, - { 160229, true }, - { 160241, true }, + { 160203, true }, + { 160220, true }, + { 160232, true }, + { 160244, true }, { 160256, true }, - { 160266, true }, - { 160281, true }, - { 160293, true }, - { 160305, true }, - { 160320, true }, - { 160331, true }, - { 160342, true }, + { 160265, true }, + { 160277, true }, + { 160292, true }, + { 160306, true }, + { 160316, true }, + { 160337, true }, { 160355, true }, - { 160368, true }, - { 160377, true }, - { 160394, true }, - { 160404, true }, - { 160417, true }, - { 160434, true }, - { 160448, true }, + { 160367, true }, + { 160382, true }, + { 160392, true }, + { 160407, true }, + { 160419, true }, + { 160431, true }, + { 160446, true }, { 160457, true }, - { 160472, true }, - { 160486, true }, - { 160499, true }, - { 160513, true }, - { 160527, true }, - { 160546, true }, - { 160554, true }, - { 160571, true }, - { 160586, true }, - { 160601, true }, - { 160615, true }, - { 160631, true }, - { 160647, true }, - { 160661, true }, - { 160677, true }, - { 160694, true }, - { 160707, true }, - { 160721, false }, - { 160739, true }, - { 160754, true }, - { 160771, true }, - { 160788, false }, - { 160814, true }, - { 160829, true }, - { 160847, true }, - { 160860, true }, - { 160870, true }, - { 160883, true }, - { 160895, true }, - { 160914, true }, - { 160924, true }, - { 160939, true }, + { 160468, true }, + { 160481, true }, + { 160494, true }, + { 160503, true }, + { 160520, true }, + { 160530, true }, + { 160543, true }, + { 160560, true }, + { 160574, true }, + { 160583, true }, + { 160598, true }, + { 160612, true }, + { 160625, true }, + { 160639, true }, + { 160653, true }, + { 160672, true }, + { 160680, true }, + { 160697, true }, + { 160712, true }, + { 160727, true }, + { 160741, true }, + { 160757, true }, + { 160773, true }, + { 160787, true }, + { 160803, true }, + { 160820, true }, + { 160833, true }, + { 160847, false }, + { 160865, true }, + { 160880, true }, + { 160897, true }, + { 160914, false }, + { 160940, true }, { 160955, true }, - { 160967, true }, - { 160980, true }, - { 160991, true }, - { 161008, true }, - { 161039, true }, - { 161049, true }, - { 161060, true }, - { 161071, true }, - { 161083, true }, - { 161097, true }, - { 161109, true }, - { 161117, true }, - { 161125, true }, - { 161136, true }, - { 161147, false }, - { 161167, true }, - { 161182, false }, - { 161196, true }, - { 161216, true }, - { 161227, true }, - { 161252, true }, - { 161270, true }, - { 161285, true }, - { 161302, true }, - { 161318, true }, - { 161343, true }, - { 161354, true }, - { 161365, true }, - { 161378, true }, - { 161390, true }, - { 161403, false }, - { 161411, true }, - { 161421, true }, - { 161436, true }, - { 161455, true }, + { 160973, true }, + { 160986, true }, + { 160996, true }, + { 161009, true }, + { 161028, true }, + { 161038, true }, + { 161053, true }, + { 161069, true }, + { 161081, true }, + { 161094, true }, + { 161105, true }, + { 161122, true }, + { 161153, true }, + { 161163, true }, + { 161174, true }, + { 161185, true }, + { 161197, true }, + { 161211, true }, + { 161223, true }, + { 161231, true }, + { 161239, true }, + { 161250, true }, + { 161261, false }, + { 161281, true }, + { 161296, false }, + { 161310, true }, + { 161330, true }, + { 161341, true }, + { 161366, true }, + { 161384, true }, + { 161399, true }, + { 161416, true }, + { 161432, true }, + { 161457, true }, { 161468, true }, - { 161481, true }, - { 161496, true }, - { 161509, true }, - { 161523, true }, - { 161536, true }, - { 161556, true }, - { 161574, true }, - { 161588, true }, - { 161599, true }, + { 161479, true }, + { 161492, true }, + { 161504, true }, + { 161517, false }, + { 161525, true }, + { 161535, true }, + { 161550, true }, + { 161569, true }, + { 161582, true }, + { 161595, true }, { 161610, true }, { 161623, true }, - { 161640, true }, - { 161648, true }, - { 161663, true }, - { 161676, true }, - { 161690, true }, - { 161705, true }, - { 161730, true }, - { 161766, true }, - { 161779, true }, - { 161789, true }, + { 161637, true }, + { 161650, true }, + { 161670, true }, + { 161688, true }, + { 161702, true }, + { 161713, true }, + { 161724, true }, + { 161737, true }, + { 161754, true }, + { 161762, true }, + { 161777, true }, + { 161790, true }, { 161804, true }, - { 161817, true }, - { 161839, true }, - { 161857, true }, - { 161870, true }, - { 161881, true }, + { 161819, true }, + { 161844, true }, + { 161880, true }, { 161893, true }, - { 161911, true }, - { 161919, true }, - { 161952, true }, - { 161959, true }, - { 161976, true }, - { 161994, false }, - { 162012, true }, - { 162030, true }, - { 162042, true }, - { 162054, true }, - { 162067, true }, - { 162083, true }, - { 162097, true }, - { 162117, true }, - { 162137, true }, - { 162148, true }, - { 162158, true }, - { 162167, true }, - { 162178, true }, + { 161903, true }, + { 161918, true }, + { 161931, true }, + { 161953, true }, + { 161971, true }, + { 161984, true }, + { 161995, true }, + { 162007, true }, + { 162025, true }, + { 162033, true }, + { 162066, true }, + { 162073, true }, + { 162090, true }, + { 162108, false }, + { 162126, true }, + { 162144, true }, + { 162156, true }, + { 162168, true }, + { 162181, true }, { 162197, true }, { 162211, true }, - { 162225, true }, - { 162248, true }, + { 162231, true }, + { 162251, true }, { 162262, true }, - { 162276, true }, - { 162288, true }, - { 162302, true }, - { 162312, true }, - { 162326, true }, - { 162335, true }, - { 162347, true }, - { 162359, true }, - { 162370, true }, - { 162379, true }, - { 162388, true }, - { 162400, true }, - { 162414, true }, - { 162420, true }, - { 162432, true }, - { 162447, false }, - { 162474, true }, - { 162494, true }, - { 162504, true }, - { 162517, true }, - { 162530, true }, + { 162272, true }, + { 162281, true }, + { 162292, true }, + { 162311, true }, + { 162325, true }, + { 162339, true }, + { 162362, true }, + { 162376, true }, + { 162390, true }, + { 162402, true }, + { 162416, true }, + { 162426, true }, + { 162440, true }, + { 162449, true }, + { 162461, true }, + { 162473, true }, + { 162484, true }, + { 162493, true }, + { 162502, true }, + { 162514, true }, + { 162528, true }, + { 162534, true }, { 162546, true }, - { 162567, true }, - { 162586, true }, - { 162596, true }, + { 162561, false }, + { 162588, true }, { 162608, true }, - { 162619, false }, - { 162627, true }, - { 162642, true }, - { 162656, true }, - { 162665, true }, - { 162677, true }, - { 162690, true }, + { 162618, true }, + { 162631, true }, + { 162644, true }, + { 162660, true }, + { 162681, true }, { 162700, true }, - { 162721, true }, - { 162733, true }, - { 162744, true }, - { 162764, true }, - { 162783, true }, - { 162794, true }, - { 162809, true }, - { 162834, false }, - { 162862, false }, - { 162874, true }, - { 162885, true }, - { 162896, true }, - { 162911, true }, - { 162926, true }, - { 162943, true }, - { 162955, false }, - { 162972, true }, + { 162710, true }, + { 162722, true }, + { 162733, false }, + { 162741, true }, + { 162756, true }, + { 162770, true }, + { 162779, true }, + { 162791, true }, + { 162804, true }, + { 162814, true }, + { 162835, true }, + { 162847, true }, + { 162858, true }, + { 162878, true }, + { 162897, true }, + { 162908, true }, + { 162923, true }, + { 162948, false }, + { 162976, false }, { 162988, true }, - { 163002, true }, - { 163017, true }, - { 163032, true }, - { 163048, true }, - { 163065, true }, - { 163088, true }, - { 163107, true }, - { 163121, true }, - { 163142, true }, + { 162999, true }, + { 163010, true }, + { 163025, true }, + { 163040, true }, + { 163057, true }, + { 163069, false }, + { 163086, true }, + { 163102, true }, + { 163116, true }, + { 163131, true }, + { 163146, true }, { 163162, true }, - { 163180, true }, - { 163199, true }, - { 163217, true }, - { 163235, false }, - { 163252, true }, - { 163267, false }, - { 163282, false }, - { 163296, true }, - { 163307, true }, - { 163318, true }, - { 163330, true }, - { 163345, true }, - { 163363, true }, - { 163385, true }, - { 163399, true }, - { 163413, true }, - { 163430, true }, - { 163449, true }, - { 163470, true }, - { 163484, true }, + { 163179, true }, + { 163202, true }, + { 163221, true }, + { 163235, true }, + { 163256, true }, + { 163276, true }, + { 163294, true }, + { 163313, true }, + { 163331, true }, + { 163349, false }, + { 163366, true }, + { 163381, false }, + { 163396, false }, + { 163410, true }, + { 163421, true }, + { 163432, true }, + { 163444, true }, + { 163459, true }, + { 163477, true }, { 163499, true }, - { 163515, true }, - { 163533, true }, - { 163543, true }, - { 163555, false }, - { 163566, true }, - { 163579, true }, - { 163598, false }, - { 163617, true }, - { 163632, true }, - { 163645, false }, - { 163664, true }, - { 163675, true }, + { 163513, true }, + { 163527, true }, + { 163544, true }, + { 163563, true }, + { 163584, true }, + { 163598, true }, + { 163613, true }, + { 163629, true }, + { 163647, true }, + { 163657, true }, + { 163669, false }, + { 163680, true }, { 163693, true }, - { 163707, true }, - { 163732, true }, - { 163747, true }, - { 163765, true }, - { 163780, true }, - { 163795, true }, - { 163812, true }, - { 163823, true }, - { 163833, true }, - { 163848, true }, - { 163857, true }, - { 163867, true }, - { 163877, true }, + { 163712, false }, + { 163731, true }, + { 163746, true }, + { 163759, false }, + { 163778, true }, + { 163789, true }, + { 163807, true }, + { 163821, true }, + { 163846, true }, + { 163861, true }, + { 163879, true }, { 163894, true }, - { 163909, false }, - { 163922, true }, - { 163938, true }, - { 163959, true }, - { 163979, true }, - { 163998, true }, - { 164010, true }, - { 164021, true }, - { 164031, true }, - { 164043, true }, - { 164058, true }, - { 164072, true }, - { 164092, true }, - { 164115, true }, - { 164128, true }, - { 164146, true }, - { 164154, true }, - { 164162, true }, - { 164174, true }, - { 164191, true }, - { 164203, true }, - { 164220, true }, - { 164231, true }, - { 164248, false }, - { 164265, true }, - { 164278, true }, - { 164289, false }, - { 164302, true }, - { 164317, false }, - { 164341, false }, - { 164353, true }, - { 164378, true }, - { 164387, true }, - { 164399, true }, - { 164419, true }, - { 164436, true }, - { 164446, true }, + { 163909, true }, + { 163926, true }, + { 163937, true }, + { 163947, true }, + { 163962, true }, + { 163971, true }, + { 163981, true }, + { 163991, true }, + { 164008, true }, + { 164023, false }, + { 164036, true }, + { 164052, true }, + { 164073, true }, + { 164093, true }, + { 164112, true }, + { 164124, true }, + { 164135, true }, + { 164145, true }, + { 164157, true }, + { 164172, true }, + { 164186, true }, + { 164206, true }, + { 164229, true }, + { 164242, true }, + { 164260, true }, + { 164268, true }, + { 164276, true }, + { 164288, true }, + { 164305, true }, + { 164317, true }, + { 164334, true }, + { 164345, true }, + { 164362, false }, + { 164379, true }, + { 164392, true }, + { 164403, false }, + { 164416, true }, + { 164431, false }, + { 164455, false }, { 164467, true }, - { 164476, true }, - { 164495, true }, + { 164492, true }, + { 164501, true }, { 164513, true }, - { 164529, true }, - { 164544, true }, - { 164559, true }, - { 164574, true }, - { 164594, true }, - { 164607, true }, - { 164620, true }, - { 164629, true }, + { 164533, true }, + { 164550, true }, + { 164560, true }, + { 164581, true }, + { 164590, true }, + { 164609, true }, + { 164627, true }, { 164643, true }, - { 164666, true }, + { 164658, true }, + { 164673, true }, { 164688, true }, - { 164714, true }, - { 164729, true }, - { 164744, true }, - { 164758, true }, - { 164770, true }, - { 164793, true }, - { 164803, true }, - { 164811, true }, - { 164827, true }, - { 164841, true }, - { 164853, true }, - { 164866, false }, + { 164708, true }, + { 164721, true }, + { 164734, true }, + { 164743, true }, + { 164757, true }, + { 164780, true }, + { 164802, true }, + { 164828, true }, + { 164843, true }, + { 164858, true }, + { 164872, true }, { 164884, true }, - { 164895, true }, - { 164908, true }, - { 164919, true }, - { 164932, true }, - { 164942, true }, - { 164957, true }, - { 164970, true }, - { 164986, true }, - { 164996, false }, - { 165006, true }, - { 165019, true }, - { 165034, true }, - { 165044, true }, - { 165060, true }, - { 165072, true }, - { 165081, true }, - { 165096, true }, - { 165107, true }, - { 165125, true }, - { 165145, true }, - { 165161, true }, - { 165178, true }, - { 165191, true }, - { 165201, true }, - { 165211, true }, - { 165225, true }, - { 165237, true }, - { 165250, true }, - { 165267, true }, - { 165282, true }, - { 165299, true }, - { 165311, true }, - { 165328, true }, - { 165342, true }, - { 165358, true }, - { 165371, true }, - { 165386, false }, - { 165398, true }, - { 165408, true }, - { 165417, true }, - { 165429, true }, - { 165437, true }, - { 165445, true }, - { 165453, true }, - { 165459, true }, - { 165474, true }, - { 165487, true }, - { 165502, true }, - { 165521, true }, - { 165545, true }, - { 165558, true }, + { 164907, true }, + { 164917, true }, + { 164925, true }, + { 164941, true }, + { 164955, true }, + { 164967, true }, + { 164980, false }, + { 164998, true }, + { 165009, true }, + { 165022, true }, + { 165033, true }, + { 165046, true }, + { 165056, true }, + { 165071, true }, + { 165084, true }, + { 165100, true }, + { 165110, false }, + { 165120, true }, + { 165133, true }, + { 165148, true }, + { 165158, true }, + { 165174, true }, + { 165186, true }, + { 165195, true }, + { 165210, true }, + { 165221, true }, + { 165239, true }, + { 165259, true }, + { 165275, true }, + { 165292, true }, + { 165305, true }, + { 165315, true }, + { 165325, true }, + { 165339, true }, + { 165351, true }, + { 165364, true }, + { 165381, true }, + { 165396, true }, + { 165413, true }, + { 165425, true }, + { 165442, true }, + { 165456, true }, + { 165472, true }, + { 165485, true }, + { 165500, false }, + { 165512, true }, + { 165522, true }, + { 165531, true }, + { 165543, true }, + { 165551, true }, + { 165559, true }, + { 165567, true }, { 165573, true }, - { 165597, true }, - { 165607, true }, - { 165623, true }, - { 165644, true }, - { 165667, true }, - { 165688, true }, - { 165701, true }, - { 165714, true }, - { 165731, true }, - { 165745, true }, - { 165757, false }, - { 165770, true }, - { 165789, true }, - { 165807, true }, - { 165831, false }, - { 165858, true }, + { 165588, true }, + { 165601, true }, + { 165616, true }, + { 165635, true }, + { 165659, true }, + { 165672, true }, + { 165687, true }, + { 165711, true }, + { 165721, true }, + { 165737, true }, + { 165758, true }, + { 165781, true }, + { 165802, true }, + { 165815, true }, + { 165828, true }, + { 165845, true }, + { 165859, true }, + { 165871, false }, { 165884, true }, - { 165899, true }, - { 165916, true }, - { 165932, true }, - { 165949, true }, - { 165962, true }, - { 165973, true }, - { 165984, true }, - { 165994, true }, - { 166003, true }, - { 166016, true }, - { 166034, true }, - { 166047, true }, - { 166061, true }, - { 166071, true }, - { 166082, false }, - { 166091, true }, - { 166112, true }, - { 166126, true }, - { 166135, true }, - { 166142, true }, - { 166149, true }, - { 166157, true }, - { 166180, true }, - { 166193, true }, - { 166207, true }, - { 166220, true }, - { 166235, true }, - { 166244, true }, - { 166253, true }, - { 166261, true }, - { 166274, true }, - { 166282, true }, - { 166300, true }, - { 166311, false }, - { 166327, true }, - { 166343, true }, - { 166356, true }, + { 165903, true }, + { 165921, true }, + { 165945, false }, + { 165972, true }, + { 165998, true }, + { 166013, true }, + { 166030, true }, + { 166046, true }, + { 166063, true }, + { 166076, true }, + { 166087, true }, + { 166098, true }, + { 166108, true }, + { 166117, true }, + { 166130, true }, + { 166148, true }, + { 166161, true }, + { 166175, true }, + { 166185, true }, + { 166196, false }, + { 166205, true }, + { 166226, true }, + { 166240, true }, + { 166249, true }, + { 166256, true }, + { 166263, true }, + { 166271, true }, + { 166294, true }, + { 166307, true }, + { 166321, true }, + { 166334, true }, + { 166349, true }, + { 166358, true }, { 166367, true }, - { 166379, true }, - { 166394, true }, - { 166403, true }, - { 166415, true }, - { 166426, true }, - { 166438, true }, - { 166451, true }, - { 166466, true }, - { 166486, true }, - { 166498, true }, - { 166515, true }, - { 166525, true }, - { 166536, true }, - { 166546, true }, - { 166553, true }, - { 166563, true }, - { 166577, true }, - { 166589, true }, - { 166605, true }, - { 166620, true }, + { 166375, true }, + { 166388, true }, + { 166396, true }, + { 166414, true }, + { 166425, false }, + { 166441, true }, + { 166457, true }, + { 166470, true }, + { 166481, true }, + { 166493, true }, + { 166508, true }, + { 166517, true }, + { 166529, true }, + { 166540, true }, + { 166552, true }, + { 166565, true }, + { 166580, true }, + { 166600, true }, + { 166612, true }, { 166629, true }, - { 166643, true }, - { 166663, true }, - { 166675, true }, - { 166688, true }, - { 166706, true }, - { 166713, true }, - { 166730, true }, - { 166747, true }, - { 166767, true }, - { 166786, true }, - { 166802, false }, + { 166639, true }, + { 166650, true }, + { 166660, true }, + { 166667, true }, + { 166677, true }, + { 166691, true }, + { 166703, true }, + { 166719, true }, + { 166734, true }, + { 166743, true }, + { 166757, true }, + { 166777, true }, + { 166789, true }, + { 166802, true }, { 166820, true }, - { 166847, true }, - { 166864, true }, - { 166878, true }, - { 166892, true }, - { 166907, false }, - { 166926, true }, - { 166944, true }, - { 166962, true }, - { 166980, true }, - { 166997, true }, - { 167018, true }, - { 167037, true }, - { 167051, true }, - { 167062, true }, - { 167070, true }, - { 167085, true }, - { 167100, true }, + { 166827, true }, + { 166844, true }, + { 166861, true }, + { 166881, true }, + { 166900, true }, + { 166916, false }, + { 166934, true }, + { 166961, true }, + { 166978, true }, + { 166992, true }, + { 167006, true }, + { 167021, false }, + { 167040, true }, + { 167058, true }, + { 167076, true }, + { 167094, true }, { 167111, true }, - { 167133, true }, - { 167146, true }, + { 167132, true }, + { 167151, true }, { 167165, true }, - { 167191, true }, - { 167207, true }, + { 167176, true }, + { 167184, true }, + { 167199, true }, + { 167214, true }, { 167225, true }, - { 167243, true }, - { 167258, true }, - { 167266, true }, + { 167247, true }, + { 167260, true }, { 167279, true }, - { 167287, true }, - { 167298, true }, - { 167312, true }, - { 167328, true }, - { 167337, true }, - { 167354, true }, - { 167364, true }, - { 167377, true }, - { 167395, true }, - { 167408, true }, - { 167427, false }, - { 167437, true }, - { 167454, true }, - { 167470, true }, - { 167493, true }, - { 167518, true }, - { 167532, true }, - { 167545, true }, - { 167556, true }, - { 167571, true }, - { 167583, true }, - { 167601, true }, - { 167626, true }, - { 167638, true }, - { 167650, true }, - { 167662, true }, - { 167680, true }, - { 167701, true }, - { 167717, true }, - { 167729, true }, - { 167743, true }, - { 167758, true }, - { 167771, true }, - { 167789, true }, - { 167803, true }, - { 167813, false }, - { 167824, true }, - { 167832, false }, - { 167844, true }, - { 167861, true }, - { 167871, true }, - { 167882, true }, - { 167889, true }, - { 167900, true }, + { 167305, true }, + { 167321, true }, + { 167339, true }, + { 167357, true }, + { 167372, true }, + { 167380, true }, + { 167393, true }, + { 167401, true }, + { 167412, true }, + { 167426, true }, + { 167442, true }, + { 167451, true }, + { 167468, true }, + { 167478, true }, + { 167491, true }, + { 167509, true }, + { 167522, true }, + { 167541, false }, + { 167551, true }, + { 167568, true }, + { 167584, true }, + { 167607, true }, + { 167632, true }, + { 167646, true }, + { 167659, true }, + { 167670, true }, + { 167685, true }, + { 167697, true }, + { 167715, true }, + { 167740, true }, + { 167752, true }, + { 167764, true }, + { 167776, true }, + { 167794, true }, + { 167815, true }, + { 167831, true }, + { 167843, true }, + { 167857, true }, + { 167872, true }, + { 167885, true }, + { 167903, true }, { 167917, true }, - { 167937, true }, - { 167952, true }, - { 167961, true }, - { 167968, true }, - { 167978, true }, - { 167989, true }, - { 168004, true }, - { 168016, true }, - { 168026, true }, - { 168047, true }, - { 168056, true }, - { 168072, false }, - { 168085, true }, + { 167927, false }, + { 167938, true }, + { 167946, false }, + { 167958, true }, + { 167975, true }, + { 167985, true }, + { 167996, true }, + { 168003, true }, + { 168014, true }, + { 168034, true }, + { 168049, true }, + { 168058, true }, + { 168065, true }, + { 168075, true }, + { 168086, true }, { 168101, true }, - { 168121, true }, - { 168135, true }, - { 168151, true }, - { 168165, true }, - { 168180, true }, - { 168188, true }, - { 168201, true }, - { 168217, true }, - { 168230, true }, - { 168243, true }, - { 168257, true }, - { 168279, true }, - { 168300, true }, - { 168319, true }, - { 168347, true }, - { 168368, true }, - { 168387, true }, - { 168411, true }, - { 168421, true }, - { 168430, true }, - { 168443, true }, - { 168449, true }, - { 168461, true }, - { 168475, true }, - { 168489, false }, - { 168502, true }, - { 168515, true }, - { 168526, true }, - { 168539, true }, - { 168549, true }, - { 168562, true }, - { 168575, true }, - { 168594, true }, - { 168613, true }, + { 168113, true }, + { 168123, true }, + { 168144, true }, + { 168153, true }, + { 168169, false }, + { 168182, true }, + { 168198, true }, + { 168218, true }, + { 168232, true }, + { 168248, true }, + { 168262, true }, + { 168277, true }, + { 168285, true }, + { 168298, true }, + { 168314, true }, + { 168327, true }, + { 168341, true }, + { 168363, true }, + { 168384, true }, + { 168403, true }, + { 168431, true }, + { 168452, true }, + { 168471, true }, + { 168495, true }, + { 168505, true }, + { 168514, true }, + { 168527, true }, + { 168533, true }, + { 168545, true }, + { 168559, true }, + { 168573, false }, + { 168586, true }, + { 168599, true }, + { 168610, true }, + { 168623, true }, { 168633, true }, - { 168642, true }, - { 168653, true }, - { 168662, true }, - { 168681, false }, - { 168697, false }, - { 168710, true }, - { 168721, true }, - { 168731, true }, + { 168646, true }, + { 168659, true }, + { 168678, true }, + { 168697, true }, + { 168717, true }, + { 168726, true }, + { 168737, true }, { 168746, true }, - { 168757, true }, - { 168776, true }, - { 168789, true }, - { 168801, true }, - { 168814, true }, - { 168829, true }, - { 168838, true }, - { 168851, true }, - { 168863, true }, - { 168878, true }, - { 168894, true }, - { 168911, true }, - { 168920, true }, - { 168934, true }, - { 168948, true }, - { 168972, true }, - { 168987, true }, - { 169003, true }, + { 168765, false }, + { 168781, false }, + { 168794, true }, + { 168805, true }, + { 168815, true }, + { 168830, true }, + { 168841, true }, + { 168860, true }, + { 168873, true }, + { 168885, true }, + { 168898, true }, + { 168913, true }, + { 168922, true }, + { 168935, true }, + { 168947, true }, + { 168962, true }, + { 168978, true }, + { 168995, true }, + { 169004, true }, { 169018, true }, - { 169031, true }, - { 169054, true }, - { 169067, true }, - { 169076, true }, - { 169089, true }, - { 169109, true }, - { 169120, true }, - { 169134, true }, - { 169143, true }, - { 169152, true }, - { 169170, true }, - { 169188, true }, - { 169202, true }, - { 169219, true }, + { 169032, true }, + { 169056, true }, + { 169071, true }, + { 169087, true }, + { 169102, true }, + { 169115, true }, + { 169138, true }, + { 169151, true }, + { 169160, true }, + { 169173, true }, + { 169193, true }, + { 169204, true }, + { 169218, true }, + { 169227, true }, { 169236, true }, - { 169252, true }, - { 169264, true }, - { 169278, true }, - { 169299, true }, - { 169324, true }, - { 169340, true }, - { 169357, true }, - { 169376, true }, - { 169391, true }, - { 169401, true }, - { 169425, true }, - { 169437, true }, - { 169450, true }, - { 169464, true }, - { 169473, true }, - { 169502, true }, - { 169527, true }, - { 169552, true }, - { 169581, true }, - { 169593, true }, - { 169609, true }, - { 169618, true }, - { 169630, true }, - { 169644, true }, - { 169658, true }, - { 169672, true }, - { 169685, true }, - { 169704, true }, - { 169717, true }, - { 169734, true }, - { 169743, true }, - { 169761, true }, - { 169775, false }, - { 169786, true }, - { 169806, false }, - { 169819, true }, - { 169829, true }, - { 169848, true }, + { 169254, true }, + { 169272, true }, + { 169286, true }, + { 169303, true }, + { 169320, true }, + { 169336, true }, + { 169348, true }, + { 169362, true }, + { 169383, true }, + { 169408, true }, + { 169424, true }, + { 169441, true }, + { 169460, true }, + { 169475, true }, + { 169485, true }, + { 169509, true }, + { 169521, true }, + { 169534, true }, + { 169548, true }, + { 169557, true }, + { 169586, true }, + { 169611, true }, + { 169636, true }, + { 169665, true }, + { 169677, true }, + { 169693, true }, + { 169702, true }, + { 169714, true }, + { 169728, true }, + { 169742, true }, + { 169756, true }, + { 169769, true }, + { 169788, true }, + { 169801, true }, + { 169818, true }, + { 169827, true }, + { 169845, true }, + { 169859, false }, { 169870, true }, - { 169881, true }, - { 169892, true }, + { 169890, false }, { 169903, true }, { 169913, true }, - { 169922, true }, - { 169930, true }, - { 169936, false }, - { 169944, true }, - { 169953, true }, - { 169961, true }, - { 169971, true }, - { 169979, true }, - { 169998, true }, - { 170023, true }, - { 170030, true }, - { 170043, true }, - { 170057, true }, - { 170067, true }, - { 170077, true }, - { 170096, true }, - { 170108, true }, - { 170123, true }, - { 170135, true }, - { 170148, true }, + { 169932, true }, + { 169954, true }, + { 169965, true }, + { 169976, true }, + { 169987, true }, + { 169997, true }, + { 170006, true }, + { 170014, true }, + { 170020, false }, + { 170028, true }, + { 170037, true }, + { 170045, true }, + { 170055, true }, + { 170063, true }, + { 170082, true }, + { 170107, true }, + { 170114, true }, + { 170127, true }, + { 170141, true }, + { 170151, true }, { 170161, true }, - { 170173, true }, - { 170183, true }, - { 170202, true }, - { 170213, false }, - { 170224, true }, - { 170239, true }, - { 170255, true }, - { 170277, true }, - { 170291, true }, - { 170304, true }, - { 170317, true }, - { 170336, true }, - { 170352, true }, - { 170365, true }, - { 170385, false }, - { 170412, false }, - { 170428, true }, - { 170444, true }, - { 170459, true }, - { 170475, true }, - { 170493, true }, + { 170180, true }, + { 170192, true }, + { 170207, true }, + { 170219, true }, + { 170232, true }, + { 170245, true }, + { 170257, true }, + { 170267, true }, + { 170286, true }, + { 170297, false }, + { 170308, true }, + { 170323, true }, + { 170339, true }, + { 170361, true }, + { 170375, true }, + { 170388, true }, + { 170401, true }, + { 170420, true }, + { 170436, true }, + { 170449, true }, + { 170469, false }, + { 170496, false }, { 170512, true }, - { 170521, true }, - { 170534, true }, - { 170551, true }, - { 170570, true }, - { 170583, true }, - { 170599, true }, - { 170612, true }, - { 170631, true }, - { 170648, true }, - { 170662, true }, - { 170680, true }, - { 170697, true }, + { 170528, true }, + { 170543, true }, + { 170559, true }, + { 170577, true }, + { 170596, true }, + { 170605, true }, + { 170618, true }, + { 170635, true }, + { 170654, true }, + { 170667, true }, + { 170683, true }, + { 170696, true }, { 170715, true }, - { 170733, true }, - { 170751, true }, + { 170732, true }, + { 170746, true }, { 170764, true }, - { 170780, true }, - { 170801, true }, - { 170811, true }, - { 170832, true }, - { 170845, true }, - { 170854, true }, - { 170865, true }, - { 170878, false }, - { 170891, true }, - { 170904, true }, - { 170920, true }, - { 170933, true }, - { 170947, false }, - { 170962, true }, - { 170976, true }, - { 170991, true }, - { 171003, true }, - { 171020, true }, - { 171036, true }, - { 171055, true }, - { 171071, true }, - { 171084, true }, - { 171099, true }, - { 171108, true }, - { 171118, true }, - { 171127, true }, - { 171154, false }, - { 171171, true }, - { 171189, true }, - { 171213, true }, - { 171237, true }, - { 171256, true }, - { 171270, true }, - { 171278, true }, - { 171289, true }, - { 171317, true }, - { 171331, true }, - { 171343, true }, - { 171352, true }, + { 170781, true }, + { 170799, true }, + { 170817, true }, + { 170835, true }, + { 170848, true }, + { 170864, true }, + { 170885, true }, + { 170895, true }, + { 170916, true }, + { 170929, true }, + { 170938, true }, + { 170949, true }, + { 170962, false }, + { 170975, true }, + { 170988, true }, + { 171004, true }, + { 171017, true }, + { 171031, false }, + { 171046, true }, + { 171060, true }, + { 171075, true }, + { 171087, true }, + { 171104, true }, + { 171120, true }, + { 171139, true }, + { 171155, true }, + { 171168, true }, + { 171183, true }, + { 171192, true }, + { 171202, true }, + { 171211, true }, + { 171238, false }, + { 171255, true }, + { 171273, true }, + { 171297, true }, + { 171321, true }, + { 171340, true }, + { 171354, true }, { 171362, true }, - { 171382, true }, - { 171396, true }, - { 171409, true }, - { 171429, true }, - { 171447, true }, - { 171459, true }, - { 171474, true }, - { 171489, true }, - { 171505, true }, - { 171520, false }, - { 171537, true }, - { 171549, false }, - { 171572, true }, + { 171373, true }, + { 171401, true }, + { 171415, true }, + { 171427, true }, + { 171436, true }, + { 171446, true }, + { 171466, true }, + { 171480, true }, + { 171493, true }, + { 171513, true }, + { 171531, true }, + { 171543, true }, + { 171558, true }, + { 171573, true }, { 171589, true }, - { 171602, true }, - { 171613, true }, - { 171636, true }, - { 171654, true }, - { 171675, true }, + { 171604, false }, + { 171621, true }, + { 171633, false }, + { 171656, true }, + { 171673, true }, + { 171686, true }, { 171697, true }, - { 171718, true }, - { 171739, true }, - { 171749, false }, - { 171763, true }, - { 171780, true }, - { 171797, true }, - { 171807, true }, - { 171820, true }, - { 171835, true }, - { 171853, true }, - { 171870, true }, - { 171886, true }, - { 171923, true }, - { 171942, true }, - { 171957, true }, - { 171972, false }, - { 171984, true }, - { 172001, true }, - { 172018, false }, - { 172033, true }, - { 172046, true }, - { 172067, false }, - { 172079, false }, - { 172096, true }, - { 172113, true }, + { 171720, true }, + { 171738, true }, + { 171759, true }, + { 171781, true }, + { 171802, true }, + { 171823, true }, + { 171833, false }, + { 171847, true }, + { 171864, true }, + { 171881, true }, + { 171891, true }, + { 171904, true }, + { 171919, true }, + { 171937, true }, + { 171954, true }, + { 171970, true }, + { 172007, true }, + { 172026, true }, + { 172041, true }, + { 172056, false }, + { 172068, true }, + { 172085, true }, + { 172102, false }, + { 172117, true }, { 172130, true }, - { 172143, true }, - { 172159, true }, - { 172167, true }, - { 172183, true }, - { 172196, true }, + { 172151, false }, + { 172163, false }, + { 172180, true }, + { 172197, true }, { 172214, true }, - { 172224, true }, - { 172235, true }, + { 172227, true }, + { 172243, true }, { 172251, true }, - { 172261, true }, + { 172267, true }, { 172280, true }, - { 172293, true }, - { 172307, true }, - { 172322, true }, - { 172333, true }, - { 172353, true }, - { 172366, true }, - { 172379, true }, + { 172298, true }, + { 172308, true }, + { 172319, true }, + { 172335, true }, + { 172345, true }, + { 172364, true }, + { 172377, true }, { 172391, true }, - { 172410, true }, - { 172423, true }, - { 172434, true }, - { 172445, true }, - { 172465, true }, + { 172406, true }, + { 172417, true }, + { 172437, true }, + { 172450, true }, + { 172463, true }, { 172475, true }, - { 172485, true }, + { 172494, true }, { 172507, true }, - { 172527, true }, - { 172545, true }, - { 172558, true }, - { 172567, true }, - { 172578, true }, - { 172593, true }, - { 172609, true }, - { 172625, true }, - { 172647, true }, - { 172663, true }, - { 172679, true }, - { 172703, true }, - { 172718, true }, + { 172518, true }, + { 172529, true }, + { 172549, true }, + { 172559, true }, + { 172569, true }, + { 172591, true }, + { 172611, true }, + { 172629, true }, + { 172642, true }, + { 172651, true }, + { 172662, true }, + { 172677, true }, + { 172693, true }, + { 172709, true }, { 172731, true }, - { 172750, true }, - { 172760, true }, - { 172774, true }, - { 172785, true }, - { 172803, true }, - { 172820, true }, - { 172832, true }, - { 172845, true }, - { 172862, true }, - { 172874, true }, - { 172891, true }, - { 172900, true }, - { 172920, false }, - { 172940, true }, - { 172957, true }, - { 172967, true }, + { 172747, true }, + { 172763, true }, + { 172787, true }, + { 172802, true }, + { 172815, true }, + { 172834, true }, + { 172844, true }, + { 172858, true }, + { 172869, true }, + { 172887, true }, + { 172904, true }, + { 172916, true }, + { 172929, true }, + { 172946, true }, + { 172958, true }, + { 172975, true }, { 172984, true }, - { 172996, true }, - { 173013, true }, - { 173028, true }, - { 173047, true }, - { 173064, true }, - { 173081, true }, - { 173098, true }, - { 173109, true }, - { 173121, true }, - { 173133, true }, - { 173143, true }, - { 173152, true }, + { 173004, false }, + { 173024, true }, + { 173041, true }, + { 173051, true }, + { 173068, true }, + { 173080, true }, + { 173097, true }, + { 173112, true }, + { 173131, true }, + { 173148, false }, { 173165, true }, - { 173175, true }, - { 173187, true }, - { 173201, false }, - { 173210, true }, - { 173222, true }, - { 173233, true }, - { 173250, true }, - { 173263, true }, - { 173273, true }, - { 173283, true }, + { 173182, true }, + { 173193, true }, + { 173205, true }, + { 173217, true }, + { 173227, true }, + { 173236, true }, + { 173249, true }, + { 173259, true }, + { 173271, true }, + { 173285, false }, { 173294, true }, - { 173303, true }, - { 173315, false }, - { 173328, true }, - { 173344, true }, - { 173355, true }, - { 173369, false }, - { 173380, true }, - { 173390, true }, - { 173413, true }, - { 173421, true }, - { 173431, true }, - { 173443, true }, - { 173456, true }, + { 173306, true }, + { 173317, true }, + { 173334, true }, + { 173347, true }, + { 173357, true }, + { 173367, true }, + { 173378, true }, + { 173387, true }, + { 173399, false }, + { 173412, true }, + { 173428, true }, + { 173439, true }, + { 173453, false }, { 173464, true }, - { 173472, true }, - { 173487, true }, + { 173474, true }, { 173497, true }, - { 173510, true }, + { 173507, true }, { 173519, true }, - { 173531, true }, + { 173532, true }, { 173540, true }, - { 173549, true }, - { 173568, true }, - { 173583, true }, - { 173605, true }, - { 173621, true }, - { 173637, true }, - { 173651, true }, - { 173664, true }, - { 173675, true }, - { 173687, true }, - { 173695, true }, - { 173709, true }, - { 173720, true }, - { 173737, true }, - { 173750, true }, + { 173548, true }, + { 173563, true }, + { 173573, true }, + { 173586, true }, + { 173595, true }, + { 173607, true }, + { 173616, true }, + { 173625, true }, + { 173644, true }, + { 173659, true }, + { 173681, true }, + { 173697, true }, + { 173713, true }, + { 173727, true }, + { 173740, true }, + { 173751, true }, { 173763, true }, - { 173779, true }, - { 173800, true }, - { 173817, true }, - { 173833, true }, - { 173846, true }, - { 173857, true }, - { 173871, true }, - { 173898, true }, + { 173771, true }, + { 173785, true }, + { 173796, true }, + { 173813, true }, + { 173826, true }, + { 173839, true }, + { 173855, true }, + { 173876, true }, + { 173893, true }, + { 173909, true }, { 173922, true }, - { 173945, true }, - { 173967, true }, - { 173980, false }, - { 173993, true }, - { 174007, true }, - { 174021, false }, - { 174042, true }, - { 174052, true }, - { 174072, true }, - { 174084, true }, - { 174110, true }, - { 174123, true }, - { 174137, true }, - { 174154, true }, - { 174173, true }, - { 174190, true }, - { 174208, true }, - { 174229, true }, - { 174243, true }, - { 174265, true }, + { 173933, true }, + { 173947, true }, + { 173974, false }, + { 173998, false }, + { 174021, true }, + { 174043, true }, + { 174056, false }, + { 174069, true }, + { 174083, true }, + { 174097, false }, + { 174118, true }, + { 174128, true }, + { 174148, true }, + { 174160, true }, + { 174186, true }, + { 174199, true }, + { 174213, true }, + { 174230, true }, + { 174249, true }, + { 174266, true }, { 174284, true }, - { 174296, true }, - { 174308, true }, - { 174332, true }, - { 174342, true }, - { 174355, true }, - { 174370, true }, - { 174387, true }, - { 174403, true }, - { 174421, true }, - { 174438, true }, - { 174453, true }, - { 174469, true }, - { 174496, true }, - { 174510, true }, - { 174526, true }, - { 174541, true }, - { 174554, true }, - { 174563, true }, - { 174579, true }, - { 174594, true }, - { 174607, true }, - { 174618, true }, + { 174305, true }, + { 174319, true }, + { 174341, true }, + { 174360, true }, + { 174372, true }, + { 174384, true }, + { 174408, true }, + { 174418, true }, + { 174431, true }, + { 174446, true }, + { 174463, true }, + { 174479, true }, + { 174497, true }, + { 174514, true }, + { 174529, true }, + { 174545, true }, + { 174572, true }, + { 174586, true }, + { 174602, true }, + { 174617, true }, { 174630, true }, - { 174647, true }, - { 174658, true }, - { 174669, true }, - { 174692, true }, - { 174702, true }, - { 174716, true }, - { 174725, true }, - { 174732, true }, - { 174746, false }, - { 174766, true }, - { 174777, true }, - { 174791, true }, - { 174804, false }, - { 174818, true }, - { 174826, true }, - { 174837, true }, - { 174855, true }, - { 174865, true }, - { 174882, true }, - { 174892, true }, - { 174903, true }, - { 174928, true }, - { 174942, true }, - { 174953, true }, - { 174964, true }, + { 174639, true }, + { 174655, true }, + { 174670, true }, + { 174683, true }, + { 174694, true }, + { 174706, true }, + { 174723, true }, + { 174734, true }, + { 174745, true }, + { 174768, true }, + { 174778, true }, + { 174792, true }, + { 174801, true }, + { 174808, true }, + { 174822, false }, + { 174842, true }, + { 174853, true }, + { 174867, true }, + { 174880, false }, + { 174894, true }, + { 174902, true }, + { 174913, true }, + { 174931, true }, + { 174941, true }, + { 174958, true }, + { 174968, true }, { 174979, true }, - { 174994, true }, - { 175010, false }, - { 175021, true }, - { 175036, true }, - { 175051, false }, + { 175004, true }, + { 175018, true }, + { 175029, true }, + { 175040, true }, + { 175055, true }, { 175070, true }, - { 175081, true }, - { 175091, true }, - { 175111, true }, - { 175133, true }, - { 175147, true }, - { 175161, true }, - { 175172, true }, - { 175179, true }, - { 175192, false }, - { 175202, true }, - { 175211, true }, - { 175221, true }, - { 175232, true }, - { 175244, true }, - { 175252, true }, - { 175262, true }, - { 175279, true }, - { 175296, true }, - { 175305, true }, - { 175324, true }, - { 175335, true }, - { 175354, false }, - { 175365, true }, - { 175382, true }, - { 175399, true }, - { 175412, true }, - { 175428, true }, - { 175439, true }, - { 175450, true }, - { 175467, true }, - { 175484, false }, - { 175493, false }, - { 175501, true }, - { 175510, false }, - { 175523, true }, - { 175534, true }, - { 175541, true }, - { 175555, true }, - { 175569, true }, - { 175589, false }, - { 175601, true }, + { 175086, false }, + { 175097, true }, + { 175112, true }, + { 175127, false }, + { 175146, true }, + { 175157, true }, + { 175167, true }, + { 175187, true }, + { 175209, true }, + { 175223, true }, + { 175237, true }, + { 175248, true }, + { 175255, true }, + { 175268, false }, + { 175278, true }, + { 175287, true }, + { 175297, true }, + { 175308, true }, + { 175320, true }, + { 175328, true }, + { 175338, true }, + { 175355, true }, + { 175372, true }, + { 175381, true }, + { 175400, true }, + { 175411, true }, + { 175430, false }, + { 175441, true }, + { 175458, true }, + { 175475, true }, + { 175488, true }, + { 175504, true }, + { 175515, true }, + { 175526, true }, + { 175543, true }, + { 175560, false }, + { 175569, false }, + { 175577, true }, + { 175586, false }, + { 175599, true }, + { 175610, true }, { 175617, true }, - { 175629, true }, - { 175648, true }, - { 175672, true }, - { 175680, true }, - { 175697, true }, - { 175713, true }, - { 175729, true }, - { 175738, true }, - { 175750, true }, - { 175763, true }, - { 175777, true }, - { 175793, false }, - { 175808, true }, - { 175817, true }, - { 175837, true }, - { 175845, true }, - { 175859, true }, - { 175872, true }, - { 175883, true }, - { 175893, false }, - { 175903, true }, - { 175917, true }, - { 175929, true }, - { 175939, false }, - { 175952, true }, - { 175968, true }, - { 175990, true }, - { 176007, true }, - { 176016, true }, - { 176025, true }, - { 176040, true }, - { 176054, true }, - { 176064, true }, - { 176074, true }, + { 175631, true }, + { 175645, true }, + { 175665, false }, + { 175677, true }, + { 175693, true }, + { 175705, true }, + { 175724, true }, + { 175748, true }, + { 175756, true }, + { 175773, true }, + { 175789, true }, + { 175805, true }, + { 175814, true }, + { 175826, true }, + { 175839, true }, + { 175853, true }, + { 175869, false }, + { 175884, true }, + { 175893, true }, + { 175913, true }, + { 175921, true }, + { 175935, true }, + { 175948, true }, + { 175959, true }, + { 175969, false }, + { 175979, true }, + { 175993, true }, + { 176005, true }, + { 176015, false }, + { 176028, true }, + { 176044, true }, + { 176066, true }, + { 176083, true }, { 176092, true }, - { 176113, true }, - { 176128, true }, - { 176142, true }, - { 176162, true }, - { 176178, true }, - { 176190, false }, - { 176206, true }, - { 176221, true }, - { 176236, true }, - { 176253, true }, - { 176266, true }, - { 176276, false }, - { 176295, false }, - { 176307, true }, - { 176323, true }, - { 176351, true }, + { 176101, true }, + { 176116, true }, + { 176130, true }, + { 176140, true }, + { 176150, true }, + { 176168, true }, + { 176189, true }, + { 176204, true }, + { 176218, true }, + { 176238, true }, + { 176254, true }, + { 176266, false }, + { 176282, true }, + { 176297, true }, + { 176312, true }, + { 176329, true }, + { 176342, true }, + { 176352, false }, + { 176371, false }, { 176383, true }, - { 176398, true }, - { 176410, true }, - { 176419, true }, - { 176433, false }, - { 176446, true }, - { 176464, true }, - { 176472, true }, + { 176399, true }, + { 176427, true }, + { 176459, true }, + { 176474, true }, { 176486, true }, - { 176500, true }, - { 176512, true }, - { 176533, true }, + { 176495, true }, + { 176509, false }, + { 176522, true }, + { 176540, true }, { 176548, true }, - { 176563, true }, - { 176579, false }, - { 176587, false }, - { 176599, true }, - { 176608, true }, - { 176618, true }, - { 176629, true }, - { 176641, true }, - { 176654, true }, - { 176665, true }, - { 176681, true }, - { 176691, true }, - { 176702, true }, - { 176713, true }, - { 176724, true }, - { 176736, true }, - { 176746, true }, - { 176755, true }, - { 176774, true }, - { 176802, true }, - { 176818, true }, - { 176829, true }, - { 176844, true }, - { 176857, true }, - { 176873, true }, - { 176890, false }, - { 176903, true }, - { 176921, true }, - { 176935, true }, - { 176947, true }, - { 176962, true }, - { 176982, true }, - { 177001, true }, - { 177020, true }, - { 177033, true }, - { 177049, true }, - { 177062, true }, + { 176562, true }, + { 176576, true }, + { 176588, true }, + { 176609, true }, + { 176624, true }, + { 176639, true }, + { 176655, false }, + { 176663, false }, + { 176675, true }, + { 176684, true }, + { 176694, true }, + { 176705, true }, + { 176717, true }, + { 176730, true }, + { 176741, true }, + { 176757, true }, + { 176767, true }, + { 176778, true }, + { 176789, true }, + { 176800, true }, + { 176812, true }, + { 176822, true }, + { 176831, true }, + { 176850, true }, + { 176878, true }, + { 176894, true }, + { 176905, true }, + { 176920, true }, + { 176933, true }, + { 176949, true }, + { 176966, false }, + { 176979, true }, + { 176997, true }, + { 177011, true }, + { 177023, true }, + { 177038, true }, + { 177058, true }, { 177077, true }, - { 177093, true }, - { 177110, true }, - { 177126, true }, - { 177143, true }, - { 177156, true }, - { 177171, true }, - { 177190, true }, - { 177203, true }, + { 177096, true }, + { 177109, true }, + { 177125, true }, + { 177138, true }, + { 177153, true }, + { 177169, true }, + { 177186, true }, + { 177202, true }, { 177219, true }, - { 177231, true }, - { 177242, true }, - { 177255, true }, - { 177269, true }, - { 177283, true }, - { 177297, false }, - { 177313, true }, - { 177332, true }, - { 177352, true }, - { 177372, false }, - { 177388, true }, - { 177404, true }, - { 177420, true }, - { 177435, true }, - { 177450, true }, - { 177471, true }, - { 177489, false }, - { 177508, true }, - { 177519, true }, - { 177535, true }, - { 177549, true }, - { 177562, true }, - { 177575, true }, - { 177591, true }, - { 177602, true }, + { 177232, true }, + { 177247, true }, + { 177266, true }, + { 177279, true }, + { 177295, true }, + { 177307, true }, + { 177318, true }, + { 177331, true }, + { 177345, true }, + { 177359, true }, + { 177373, false }, + { 177389, true }, + { 177408, true }, + { 177428, true }, + { 177448, false }, + { 177464, true }, + { 177480, true }, + { 177496, true }, + { 177511, true }, + { 177526, true }, + { 177547, true }, + { 177565, false }, + { 177584, true }, + { 177595, true }, { 177611, true }, - { 177621, true }, - { 177632, true }, - { 177644, true }, - { 177658, true }, + { 177625, true }, + { 177638, true }, + { 177651, true }, { 177667, true }, - { 177680, true }, - { 177699, true }, - { 177716, false }, - { 177731, true }, - { 177747, false }, - { 177759, true }, - { 177779, true }, - { 177792, true }, - { 177812, true }, - { 177834, true }, - { 177857, true }, - { 177875, true }, - { 177891, true }, - { 177904, true }, - { 177916, true }, - { 177930, true }, - { 177939, true }, - { 177953, true }, - { 177961, true }, - { 177979, true }, - { 177989, true }, - { 178009, true }, - { 178026, true }, - { 178046, true }, - { 178057, true }, - { 178070, true }, + { 177678, true }, + { 177687, true }, + { 177697, true }, + { 177708, true }, + { 177720, true }, + { 177734, true }, + { 177743, true }, + { 177756, true }, + { 177775, true }, + { 177792, false }, + { 177807, true }, + { 177823, false }, + { 177835, true }, + { 177855, true }, + { 177868, true }, + { 177888, true }, + { 177910, true }, + { 177933, true }, + { 177951, true }, + { 177967, true }, + { 177980, true }, + { 177992, true }, + { 178006, true }, + { 178015, true }, + { 178029, true }, + { 178037, true }, + { 178055, true }, + { 178065, true }, { 178085, true }, - { 178097, true }, - { 178113, true }, - { 178126, true }, - { 178143, true }, - { 178164, true }, - { 178172, true }, - { 178182, true }, - { 178205, true }, - { 178214, true }, - { 178224, true }, - { 178236, true }, - { 178249, true }, - { 178259, true }, - { 178272, true }, - { 178293, false }, - { 178303, true }, - { 178317, true }, - { 178337, true }, - { 178350, true }, - { 178370, false }, + { 178102, true }, + { 178122, true }, + { 178133, true }, + { 178146, true }, + { 178161, true }, + { 178173, true }, + { 178189, true }, + { 178202, true }, + { 178219, true }, + { 178240, true }, + { 178248, true }, + { 178258, true }, + { 178281, true }, + { 178290, true }, + { 178300, true }, + { 178312, true }, + { 178325, true }, + { 178335, true }, + { 178348, true }, + { 178369, false }, + { 178379, true }, { 178393, true }, - { 178406, true }, - { 178417, true }, - { 178428, true }, - { 178438, true }, - { 178463, true }, - { 178473, true }, - { 178487, true }, - { 178501, false }, - { 178516, true }, - { 178530, true }, - { 178555, true }, - { 178569, true }, - { 178581, true }, - { 178595, true }, - { 178605, false }, - { 178625, true }, - { 178639, true }, - { 178658, true }, + { 178413, true }, + { 178426, true }, + { 178446, false }, + { 178469, true }, + { 178482, true }, + { 178493, true }, + { 178504, true }, + { 178514, true }, + { 178539, true }, + { 178549, true }, + { 178563, true }, + { 178577, false }, + { 178592, true }, + { 178606, true }, + { 178631, true }, + { 178645, true }, + { 178657, true }, { 178671, true }, - { 178686, true }, - { 178696, true }, - { 178710, true }, - { 178719, true }, - { 178730, true }, - { 178741, true }, - { 178752, true }, + { 178681, false }, + { 178701, true }, + { 178715, true }, + { 178734, true }, + { 178747, true }, { 178762, true }, - { 178771, false }, - { 178791, true }, + { 178772, true }, + { 178786, true }, + { 178795, true }, { 178806, true }, - { 178818, true }, - { 178830, true }, - { 178845, true }, - { 178864, true }, - { 178884, true }, - { 178901, true }, - { 178911, true }, - { 178925, true }, - { 178942, true }, - { 178957, true }, - { 178965, true }, - { 178983, true }, - { 179004, false }, - { 179022, true }, - { 179034, true }, - { 179050, true }, - { 179065, true }, - { 179076, true }, - { 179101, true }, - { 179123, true }, - { 179138, true }, + { 178817, true }, + { 178828, true }, + { 178838, true }, + { 178847, false }, + { 178867, true }, + { 178882, true }, + { 178894, true }, + { 178906, true }, + { 178921, true }, + { 178940, true }, + { 178960, true }, + { 178977, true }, + { 178987, true }, + { 179001, true }, + { 179018, true }, + { 179033, true }, + { 179041, true }, + { 179059, true }, + { 179080, false }, + { 179098, true }, + { 179110, true }, + { 179126, true }, + { 179141, true }, { 179152, true }, - { 179173, true }, - { 179187, true }, - { 179204, true }, - { 179223, true }, - { 179242, true }, - { 179255, true }, - { 179275, true }, - { 179291, true }, - { 179317, true }, - { 179338, true }, - { 179356, true }, - { 179375, true }, - { 179399, true }, - { 179415, true }, - { 179440, true }, - { 179466, true }, - { 179477, true }, - { 179501, true }, - { 179527, true }, - { 179549, true }, - { 179570, true }, - { 179587, true }, - { 179604, true }, - { 179630, true }, - { 179648, true }, - { 179658, true }, - { 179674, false }, - { 179692, true }, - { 179707, false }, - { 179726, true }, - { 179748, true }, - { 179771, true }, - { 179790, true }, - { 179808, true }, - { 179831, true }, - { 179844, true }, - { 179860, true }, - { 179878, true }, - { 179894, true }, - { 179908, true }, - { 179926, true }, - { 179941, true }, - { 179958, true }, - { 179972, true }, - { 179986, false }, - { 180003, true }, - { 180021, true }, - { 180037, true }, - { 180053, true }, - { 180066, true }, - { 180086, true }, - { 180104, true }, - { 180123, true }, - { 180136, true }, - { 180172, true }, - { 180195, true }, - { 180210, true }, - { 180226, true }, - { 180237, true }, - { 180255, true }, - { 180285, true }, - { 180301, true }, - { 180316, true }, + { 179177, true }, + { 179199, true }, + { 179214, true }, + { 179228, true }, + { 179249, true }, + { 179263, true }, + { 179280, true }, + { 179299, true }, + { 179318, true }, + { 179331, true }, + { 179351, true }, + { 179367, true }, + { 179393, true }, + { 179414, true }, + { 179432, true }, + { 179451, true }, + { 179475, true }, + { 179491, true }, + { 179516, true }, + { 179542, true }, + { 179553, true }, + { 179577, true }, + { 179603, true }, + { 179625, true }, + { 179646, true }, + { 179663, true }, + { 179680, true }, + { 179706, true }, + { 179724, true }, + { 179734, true }, + { 179750, false }, + { 179768, true }, + { 179783, false }, + { 179802, true }, + { 179824, true }, + { 179847, true }, + { 179866, true }, + { 179884, true }, + { 179907, true }, + { 179920, true }, + { 179936, true }, + { 179954, true }, + { 179970, true }, + { 179984, true }, + { 180002, true }, + { 180017, true }, + { 180034, true }, + { 180048, true }, + { 180062, false }, + { 180079, true }, + { 180097, true }, + { 180113, true }, + { 180129, true }, + { 180142, true }, + { 180162, true }, + { 180180, true }, + { 180199, true }, + { 180212, true }, + { 180248, true }, + { 180271, true }, + { 180286, true }, + { 180302, true }, + { 180313, true }, { 180331, true }, - { 180342, true }, - { 180356, true }, - { 180378, true }, - { 180393, true }, - { 180406, true }, - { 180429, true }, - { 180438, true }, - { 180460, true }, - { 180479, true }, - { 180503, true }, - { 180529, true }, - { 180540, true }, - { 180557, true }, - { 180571, true }, - { 180584, true }, - { 180600, true }, - { 180619, true }, - { 180643, true }, - { 180656, true }, - { 180673, true }, - { 180684, true }, - { 180699, true }, - { 180721, true }, - { 180740, true }, + { 180361, true }, + { 180377, true }, + { 180392, true }, + { 180407, true }, + { 180418, true }, + { 180432, true }, + { 180454, true }, + { 180469, true }, + { 180482, true }, + { 180505, true }, + { 180514, true }, + { 180536, true }, + { 180555, true }, + { 180579, true }, + { 180605, true }, + { 180616, true }, + { 180633, true }, + { 180647, true }, + { 180660, true }, + { 180676, true }, + { 180695, true }, + { 180719, true }, + { 180732, true }, + { 180749, true }, { 180760, true }, - { 180777, false }, - { 180792, true }, - { 180810, true }, - { 180832, true }, - { 180848, true }, - { 180860, true }, - { 180872, true }, - { 180884, true }, - { 180900, true }, - { 180916, true }, - { 180935, true }, - { 180952, true }, - { 180982, false }, - { 180996, true }, - { 181013, true }, - { 181034, true }, - { 181054, true }, - { 181068, true }, - { 181086, true }, - { 181102, true }, - { 181112, true }, - { 181123, true }, - { 181135, true }, - { 181154, true }, - { 181170, true }, - { 181190, true }, - { 181203, true }, - { 181219, true }, + { 180775, true }, + { 180797, true }, + { 180816, true }, + { 180836, true }, + { 180853, false }, + { 180868, true }, + { 180886, true }, + { 180908, true }, + { 180924, true }, + { 180936, true }, + { 180948, true }, + { 180960, true }, + { 180976, true }, + { 180992, true }, + { 181011, true }, + { 181028, true }, + { 181058, false }, + { 181072, true }, + { 181089, true }, + { 181110, true }, + { 181130, true }, + { 181144, true }, + { 181162, true }, + { 181178, true }, + { 181188, true }, + { 181199, true }, + { 181211, true }, { 181230, true }, - { 181251, true }, - { 181279, true }, - { 181295, true }, - { 181308, true }, - { 181325, true }, - { 181348, true }, - { 181366, false }, - { 181381, true }, - { 181406, true }, + { 181246, true }, + { 181266, true }, + { 181280, true }, + { 181293, true }, + { 181309, true }, + { 181320, true }, + { 181341, true }, + { 181369, true }, + { 181385, true }, + { 181398, true }, { 181415, true }, - { 181425, true }, - { 181437, true }, - { 181456, true }, - { 181473, true }, - { 181490, true }, - { 181506, false }, - { 181524, false }, - { 181544, true }, - { 181561, true }, - { 181574, true }, - { 181594, true }, - { 181618, true }, - { 181636, true }, - { 181657, true }, - { 181672, true }, - { 181687, true }, - { 181699, true }, - { 181724, true }, - { 181737, true }, - { 181759, true }, - { 181769, true }, - { 181786, true }, - { 181799, true }, - { 181813, true }, - { 181846, true }, - { 181861, true }, - { 181875, true }, - { 181884, true }, - { 181893, true }, - { 181907, true }, - { 181917, true }, - { 181928, false }, - { 181942, true }, + { 181438, true }, + { 181456, false }, + { 181471, true }, + { 181496, true }, + { 181505, true }, + { 181515, true }, + { 181527, true }, + { 181546, true }, + { 181563, true }, + { 181580, true }, + { 181596, false }, + { 181614, false }, + { 181634, true }, + { 181651, true }, + { 181664, true }, + { 181684, true }, + { 181708, true }, + { 181726, true }, + { 181747, true }, + { 181762, true }, + { 181777, true }, + { 181789, true }, + { 181814, true }, + { 181827, true }, + { 181849, true }, + { 181859, true }, + { 181876, true }, + { 181889, true }, + { 181903, true }, + { 181936, true }, { 181951, true }, - { 181962, true }, - { 181973, true }, - { 181991, true }, - { 182006, true }, - { 182019, true }, - { 182029, true }, - { 182044, true }, - { 182057, true }, - { 182076, true }, + { 181965, true }, + { 181974, true }, + { 181983, true }, + { 181997, true }, + { 182007, true }, + { 182018, false }, + { 182032, true }, + { 182041, true }, + { 182052, true }, + { 182063, true }, + { 182081, true }, { 182096, true }, - { 182113, true }, - { 182128, true }, - { 182135, true }, - { 182151, true }, - { 182169, true }, - { 182190, true }, - { 182202, true }, - { 182232, true }, - { 182245, true }, - { 182255, true }, - { 182267, true }, - { 182281, true }, - { 182295, true }, - { 182308, true }, - { 182319, true }, - { 182333, true }, - { 182352, true }, + { 182109, true }, + { 182119, true }, + { 182134, true }, + { 182147, true }, + { 182166, true }, + { 182186, true }, + { 182203, true }, + { 182218, true }, + { 182225, true }, + { 182241, true }, + { 182259, true }, + { 182280, true }, + { 182292, true }, + { 182322, true }, + { 182335, true }, + { 182345, true }, + { 182357, true }, { 182371, true }, - { 182386, true }, + { 182385, true }, { 182398, true }, { 182409, true }, - { 182424, true }, - { 182436, true }, - { 182452, true }, - { 182467, true }, - { 182483, true }, - { 182492, true }, - { 182506, true }, - { 182517, false }, - { 182532, true }, - { 182546, true }, - { 182562, true }, - { 182575, true }, - { 182595, true }, - { 182608, false }, - { 182628, true }, - { 182642, true }, - { 182653, true }, - { 182670, true }, - { 182684, true }, - { 182696, true }, - { 182710, true }, - { 182722, true }, - { 182734, true }, - { 182746, true }, - { 182758, true }, - { 182768, true }, - { 182781, true }, - { 182798, true }, - { 182825, true }, - { 182838, true }, - { 182856, true }, - { 182864, true }, - { 182876, true }, - { 182890, true }, - { 182903, true }, - { 182930, false }, - { 182941, true }, - { 182959, true }, + { 182423, true }, + { 182442, true }, + { 182461, true }, + { 182476, true }, + { 182488, true }, + { 182499, true }, + { 182514, true }, + { 182526, true }, + { 182542, true }, + { 182557, true }, + { 182573, true }, + { 182582, true }, + { 182596, true }, + { 182607, false }, + { 182622, true }, + { 182636, true }, + { 182652, true }, + { 182665, true }, + { 182685, true }, + { 182698, false }, + { 182718, true }, + { 182732, true }, + { 182743, true }, + { 182760, true }, + { 182774, true }, + { 182786, true }, + { 182800, true }, + { 182812, true }, + { 182824, true }, + { 182836, true }, + { 182848, true }, + { 182858, true }, + { 182871, true }, + { 182888, true }, + { 182915, true }, + { 182928, true }, + { 182946, true }, + { 182954, true }, { 182966, true }, - { 182974, true }, - { 182984, true }, + { 182980, true }, { 182993, true }, - { 183002, true }, - { 183010, true }, - { 183023, true }, - { 183032, true }, - { 183044, true }, + { 183020, false }, + { 183031, true }, + { 183049, true }, { 183056, true }, - { 183063, true }, - { 183079, true }, - { 183096, true }, - { 183103, true }, - { 183117, true }, + { 183064, true }, + { 183074, true }, + { 183083, true }, + { 183092, true }, + { 183100, true }, + { 183113, true }, + { 183122, true }, { 183134, true }, { 183146, true }, - { 183154, true }, - { 183161, true }, - { 183170, true }, - { 183179, true }, + { 183153, true }, + { 183169, true }, + { 183186, true }, { 183193, true }, - { 183213, true }, - { 183229, true }, - { 183245, true }, - { 183264, true }, - { 183282, true }, - { 183297, true }, - { 183315, true }, - { 183325, true }, - { 183337, true }, - { 183356, true }, - { 183371, true }, - { 183386, true }, - { 183398, true }, - { 183406, false }, - { 183431, true }, - { 183441, true }, - { 183456, true }, - { 183468, true }, - { 183482, true }, - { 183491, false }, - { 183503, true }, - { 183516, true }, - { 183549, true }, - { 183564, true }, - { 183587, true }, - { 183600, true }, - { 183611, true }, - { 183625, true }, - { 183645, true }, - { 183658, true }, - { 183672, true }, - { 183682, true }, - { 183700, true }, - { 183714, true }, - { 183726, true }, - { 183741, true }, - { 183763, true }, - { 183773, true }, - { 183785, true }, - { 183801, true }, - { 183813, true }, - { 183823, true }, - { 183836, true }, - { 183845, true }, + { 183207, true }, + { 183224, true }, + { 183236, true }, + { 183244, true }, + { 183251, true }, + { 183260, true }, + { 183269, true }, + { 183283, true }, + { 183303, true }, + { 183319, true }, + { 183335, true }, + { 183354, true }, + { 183372, true }, + { 183387, true }, + { 183405, true }, + { 183415, true }, + { 183427, true }, + { 183446, true }, + { 183461, true }, + { 183476, true }, + { 183488, true }, + { 183496, false }, + { 183521, true }, + { 183536, true }, + { 183548, true }, + { 183562, true }, + { 183571, false }, + { 183583, true }, + { 183596, true }, + { 183629, true }, + { 183644, true }, + { 183667, true }, + { 183680, true }, + { 183691, true }, + { 183705, true }, + { 183725, true }, + { 183738, true }, + { 183752, true }, + { 183762, true }, + { 183780, true }, + { 183794, true }, + { 183806, true }, + { 183821, true }, + { 183843, true }, { 183853, true }, - { 183866, false }, - { 183874, true }, - { 183885, true }, - { 183901, true }, - { 183912, true }, - { 183925, true }, - { 183937, false }, - { 183951, true }, - { 183964, true }, - { 183975, true }, - { 183985, true }, - { 183999, true }, - { 184018, true }, - { 184029, true }, - { 184043, true }, - { 184054, true }, - { 184065, true }, - { 184076, true }, - { 184087, true }, - { 184098, true }, - { 184112, true }, + { 183865, true }, + { 183881, true }, + { 183893, true }, + { 183903, true }, + { 183916, true }, + { 183931, true }, + { 183940, true }, + { 183948, true }, + { 183961, false }, + { 183969, true }, + { 183980, true }, + { 183996, true }, + { 184007, true }, + { 184020, true }, + { 184032, false }, + { 184046, true }, + { 184059, true }, + { 184070, true }, + { 184080, true }, + { 184094, true }, + { 184113, true }, { 184124, true }, - { 184139, true }, - { 184153, true }, - { 184168, true }, - { 184181, true }, - { 184197, true }, - { 184206, true }, - { 184215, true }, - { 184229, true }, - { 184240, true }, - { 184251, false }, - { 184267, true }, - { 184278, true }, - { 184289, true }, - { 184305, false }, - { 184319, true }, - { 184328, true }, - { 184341, true }, - { 184351, true }, - { 184365, true }, - { 184375, true }, - { 184388, true }, - { 184402, true }, + { 184138, true }, + { 184149, true }, + { 184160, true }, + { 184171, true }, + { 184182, true }, + { 184193, true }, + { 184207, true }, + { 184219, true }, + { 184234, true }, + { 184248, true }, + { 184263, true }, + { 184276, true }, + { 184292, true }, + { 184301, true }, + { 184310, true }, + { 184324, true }, + { 184335, true }, + { 184346, false }, + { 184362, true }, + { 184373, true }, + { 184384, true }, + { 184400, false }, + { 184414, true }, { 184423, true }, - { 184437, true }, - { 184449, true }, - { 184464, true }, + { 184436, true }, + { 184446, true }, + { 184460, true }, + { 184470, true }, { 184483, true }, - { 184493, true }, - { 184505, true }, - { 184524, true }, - { 184533, false }, - { 184548, false }, - { 184560, true }, - { 184586, true }, - { 184597, true }, - { 184618, true }, - { 184633, true }, - { 184651, true }, - { 184668, true }, - { 184683, true }, - { 184703, true }, - { 184714, true }, - { 184726, true }, - { 184737, true }, - { 184750, true }, - { 184768, true }, - { 184788, true }, - { 184807, true }, - { 184826, true }, - { 184847, true }, - { 184856, true }, - { 184880, false }, - { 184899, true }, - { 184913, true }, - { 184931, true }, - { 184948, true }, - { 184968, true }, - { 184982, true }, - { 184992, true }, - { 185005, true }, + { 184497, true }, + { 184518, true }, + { 184532, true }, + { 184544, true }, + { 184559, true }, + { 184578, true }, + { 184588, true }, + { 184600, true }, + { 184619, true }, + { 184628, false }, + { 184643, false }, + { 184655, true }, + { 184681, true }, + { 184692, true }, + { 184713, true }, + { 184728, true }, + { 184746, true }, + { 184763, true }, + { 184778, true }, + { 184798, true }, + { 184809, true }, + { 184821, true }, + { 184832, true }, + { 184845, true }, + { 184863, true }, + { 184883, true }, + { 184902, true }, + { 184921, true }, + { 184942, true }, + { 184951, true }, + { 184975, false }, + { 184994, true }, + { 185008, true }, { 185026, true }, - { 185038, true }, - { 185049, true }, - { 185064, true }, - { 185085, true }, - { 185104, true }, + { 185043, true }, + { 185063, true }, + { 185077, true }, + { 185087, true }, + { 185100, true }, + { 185121, true }, { 185133, true }, - { 185140, true }, - { 185152, true }, - { 185167, true }, - { 185183, true }, - { 185200, true }, - { 185222, true }, - { 185232, true }, - { 185244, true }, - { 185256, true }, - { 185273, false }, - { 185286, false }, - { 185306, true }, - { 185316, true }, - { 185328, true }, - { 185345, true }, - { 185361, true }, - { 185376, true }, - { 185389, true }, - { 185404, true }, - { 185417, true }, - { 185433, true }, - { 185451, true }, - { 185463, true }, - { 185477, true }, - { 185490, true }, - { 185501, true }, - { 185520, true }, - { 185539, true }, - { 185549, true }, - { 185561, true }, - { 185581, true }, - { 185594, true }, - { 185607, true }, - { 185620, true }, - { 185633, true }, - { 185646, true }, - { 185658, true }, - { 185673, true }, - { 185683, true }, - { 185696, true }, - { 185714, true }, - { 185732, true }, - { 185751, true }, - { 185764, true }, - { 185782, true }, - { 185804, true }, - { 185817, true }, - { 185834, true }, - { 185854, true }, - { 185870, true }, - { 185898, true }, - { 185923, true }, - { 185955, true }, - { 185974, true }, - { 185989, true }, - { 186009, true }, - { 186022, true }, - { 186038, true }, - { 186055, true }, - { 186072, true }, + { 185144, true }, + { 185159, true }, + { 185180, true }, + { 185199, true }, + { 185228, true }, + { 185235, true }, + { 185247, true }, + { 185262, true }, + { 185278, true }, + { 185295, true }, + { 185317, true }, + { 185327, true }, + { 185339, true }, + { 185351, true }, + { 185368, false }, + { 185381, false }, + { 185401, true }, + { 185411, true }, + { 185423, true }, + { 185440, true }, + { 185456, true }, + { 185471, true }, + { 185484, true }, + { 185499, true }, + { 185512, true }, + { 185528, true }, + { 185546, true }, + { 185558, true }, + { 185572, true }, + { 185585, true }, + { 185596, true }, + { 185615, true }, + { 185634, true }, + { 185644, true }, + { 185656, true }, + { 185676, true }, + { 185689, true }, + { 185702, true }, + { 185715, true }, + { 185728, true }, + { 185741, true }, + { 185753, true }, + { 185768, true }, + { 185778, true }, + { 185791, true }, + { 185809, true }, + { 185827, true }, + { 185846, true }, + { 185859, true }, + { 185877, true }, + { 185899, true }, + { 185912, true }, + { 185929, true }, + { 185949, true }, + { 185965, true }, + { 185993, true }, + { 186018, true }, + { 186050, true }, + { 186069, true }, { 186084, true }, - { 186097, true }, - { 186110, true }, - { 186132, true }, + { 186104, true }, + { 186117, true }, + { 186133, true }, { 186150, true }, - { 186164, true }, - { 186185, true }, - { 186197, true }, - { 186212, true }, - { 186229, true }, - { 186241, true }, - { 186256, true }, - { 186267, true }, - { 186281, true }, - { 186300, true }, - { 186317, true }, - { 186327, true }, - { 186339, true }, - { 186359, true }, - { 186373, true }, - { 186383, true }, - { 186396, true }, - { 186415, true }, - { 186429, true }, - { 186443, true }, - { 186457, true }, - { 186467, true }, - { 186479, true }, - { 186497, false }, - { 186505, true }, - { 186521, true }, - { 186533, true }, - { 186545, true }, - { 186556, true }, - { 186568, true }, - { 186577, true }, - { 186587, true }, - { 186601, true }, - { 186615, true }, - { 186629, true }, + { 186167, true }, + { 186179, true }, + { 186192, true }, + { 186205, true }, + { 186227, true }, + { 186245, true }, + { 186259, true }, + { 186280, true }, + { 186292, true }, + { 186307, true }, + { 186324, true }, + { 186336, true }, + { 186351, true }, + { 186362, true }, + { 186376, true }, + { 186395, true }, + { 186412, true }, + { 186422, true }, + { 186434, true }, + { 186454, true }, + { 186468, true }, + { 186478, true }, + { 186491, true }, + { 186510, true }, + { 186524, true }, + { 186538, true }, + { 186552, true }, + { 186562, true }, + { 186574, true }, + { 186592, false }, + { 186600, true }, + { 186616, true }, + { 186628, true }, { 186640, true }, - { 186648, true }, - { 186664, true }, - { 186675, true }, - { 186690, true }, - { 186708, true }, - { 186728, true }, - { 186741, true }, - { 186762, true }, - { 186773, true }, - { 186788, false }, - { 186806, false }, - { 186827, true }, + { 186651, true }, + { 186663, true }, + { 186672, true }, + { 186682, true }, + { 186696, true }, + { 186710, true }, + { 186724, true }, + { 186735, true }, + { 186743, true }, + { 186759, true }, + { 186770, true }, + { 186785, true }, + { 186803, true }, + { 186823, true }, { 186836, true }, - { 186859, true }, - { 186882, true }, - { 186899, true }, - { 186911, true }, - { 186932, true }, - { 186949, true }, - { 186969, true }, - { 186982, true }, - { 186995, true }, - { 187009, true }, - { 187031, true }, - { 187046, true }, - { 187063, true }, - { 187080, true }, - { 187100, true }, - { 187125, true }, - { 187150, true }, - { 187176, true }, - { 187189, true }, - { 187205, true }, - { 187216, true }, - { 187231, true }, - { 187240, true }, - { 187251, true }, - { 187263, true }, - { 187277, true }, - { 187286, true }, - { 187308, true }, - { 187320, true }, - { 187328, true }, - { 187342, true }, - { 187350, true }, - { 187360, true }, - { 187367, true }, - { 187377, true }, - { 187384, true }, - { 187401, true }, - { 187413, true }, - { 187424, true }, - { 187434, true }, - { 187447, true }, - { 187457, true }, - { 187468, true }, + { 186857, true }, + { 186868, true }, + { 186883, false }, + { 186901, false }, + { 186922, true }, + { 186931, true }, + { 186954, true }, + { 186977, true }, + { 186994, true }, + { 187006, true }, + { 187027, true }, + { 187044, true }, + { 187064, true }, + { 187077, true }, + { 187090, true }, + { 187104, true }, + { 187126, true }, + { 187141, true }, + { 187158, true }, + { 187175, true }, + { 187195, true }, + { 187220, true }, + { 187245, true }, + { 187271, true }, + { 187284, true }, + { 187300, true }, + { 187311, true }, + { 187326, true }, + { 187335, true }, + { 187346, true }, + { 187358, true }, + { 187372, true }, + { 187381, true }, + { 187403, true }, + { 187415, true }, + { 187423, true }, + { 187437, true }, + { 187445, true }, + { 187455, true }, + { 187462, true }, + { 187472, true }, { 187479, true }, - { 187487, true }, - { 187499, true }, - { 187510, true }, - { 187524, true }, - { 187533, true }, - { 187546, true }, - { 187572, true }, - { 187588, true }, - { 187604, true }, - { 187617, true }, - { 187629, true }, - { 187641, true }, - { 187662, true }, - { 187674, true }, - { 187684, true }, - { 187706, true }, + { 187496, true }, + { 187508, true }, + { 187519, true }, + { 187529, true }, + { 187542, true }, + { 187552, true }, + { 187563, true }, + { 187574, true }, + { 187582, true }, + { 187594, true }, + { 187605, true }, + { 187619, true }, + { 187628, true }, + { 187641, false }, + { 187667, true }, + { 187683, true }, + { 187699, true }, + { 187712, true }, { 187724, true }, - { 187741, true }, - { 187754, true }, - { 187765, false }, - { 187776, true }, - { 187786, true }, - { 187798, true }, - { 187807, true }, - { 187821, true }, - { 187832, false }, - { 187845, false }, - { 187865, true }, - { 187875, true }, - { 187883, false }, - { 187892, true }, - { 187905, true }, - { 187951, true }, - { 187998, true }, - { 188011, true }, - { 188024, true }, - { 188047, true }, - { 188063, true }, - { 188076, true }, - { 188092, true }, - { 188102, false }, - { 188114, true }, - { 188131, true }, - { 188149, true }, - { 188165, true }, - { 188176, true }, - { 188184, true }, - { 188194, true }, - { 188201, true }, - { 188210, true }, - { 188217, true }, + { 187736, true }, + { 187757, true }, + { 187769, true }, + { 187779, true }, + { 187801, true }, + { 187819, true }, + { 187836, true }, + { 187849, true }, + { 187860, false }, + { 187871, true }, + { 187881, true }, + { 187893, true }, + { 187902, true }, + { 187916, true }, + { 187927, false }, + { 187940, false }, + { 187960, true }, + { 187970, true }, + { 187978, false }, + { 187987, true }, + { 188000, true }, + { 188046, true }, + { 188093, true }, + { 188106, true }, + { 188119, true }, + { 188142, true }, + { 188158, true }, + { 188171, true }, + { 188187, true }, + { 188197, false }, + { 188209, true }, { 188226, true }, { 188244, true }, { 188260, true }, + { 188271, true }, { 188279, true }, - { 188292, true }, - { 188306, true }, - { 188318, true }, - { 188332, true }, - { 188347, true }, - { 188359, true }, - { 188372, true }, - { 188383, true }, - { 188404, true }, - { 188414, true }, - { 188423, true }, - { 188432, true }, - { 188439, true }, - { 188447, true }, - { 188471, true }, - { 188485, true }, - { 188495, true }, - { 188512, false }, + { 188289, true }, + { 188296, true }, + { 188305, true }, + { 188312, true }, + { 188321, true }, + { 188339, true }, + { 188355, true }, + { 188374, true }, + { 188387, true }, + { 188401, true }, + { 188413, true }, + { 188427, true }, + { 188442, true }, + { 188454, true }, + { 188467, true }, + { 188478, true }, + { 188499, true }, + { 188509, true }, + { 188518, true }, { 188527, true }, + { 188534, true }, { 188541, true }, - { 188553, true }, - { 188567, true }, - { 188584, true }, - { 188595, true }, - { 188607, true }, - { 188619, true }, + { 188549, true }, + { 188573, true }, + { 188587, true }, + { 188597, true }, + { 188614, false }, { 188629, true }, - { 188639, true }, - { 188650, true }, - { 188660, true }, - { 188679, true }, - { 188691, true }, - { 188707, true }, - { 188722, true }, - { 188745, true }, + { 188643, true }, + { 188655, true }, + { 188669, true }, + { 188686, true }, + { 188697, true }, + { 188709, true }, + { 188721, true }, + { 188731, true }, + { 188741, true }, { 188752, true }, - { 188763, true }, - { 188773, true }, - { 188780, true }, - { 188787, true }, - { 188799, true }, - { 188810, true }, - { 188820, false }, - { 188840, true }, - { 188863, true }, - { 188887, true }, - { 188897, true }, - { 188904, true }, - { 188917, true }, - { 188931, true }, - { 188945, true }, - { 188958, true }, - { 188969, true }, - { 188980, true }, - { 188990, true }, + { 188762, true }, + { 188781, true }, + { 188793, true }, + { 188809, true }, + { 188824, true }, + { 188847, true }, + { 188854, true }, + { 188865, true }, + { 188875, true }, + { 188882, true }, + { 188889, true }, + { 188901, true }, + { 188912, true }, + { 188922, false }, + { 188942, true }, + { 188965, true }, + { 188989, true }, + { 188999, true }, { 189006, true }, - { 189027, true }, - { 189037, true }, - { 189048, true }, - { 189063, true }, - { 189077, true }, - { 189088, true }, - { 189102, true }, - { 189122, true }, - { 189136, true }, - { 189145, true }, - { 189156, true }, - { 189171, true }, - { 189184, true }, - { 189207, true }, - { 189222, true }, + { 189019, true }, + { 189033, true }, + { 189047, true }, + { 189060, true }, + { 189071, true }, + { 189082, true }, + { 189092, true }, + { 189108, true }, + { 189129, true }, + { 189139, true }, + { 189150, true }, + { 189165, true }, + { 189179, true }, + { 189190, true }, + { 189204, true }, + { 189224, true }, { 189238, true }, - { 189253, true }, - { 189267, true }, - { 189283, true }, - { 189297, true }, - { 189311, true }, - { 189329, true }, - { 189347, true }, - { 189367, true }, - { 189386, true }, - { 189402, true }, - { 189417, true }, + { 189247, true }, + { 189258, true }, + { 189273, true }, + { 189286, true }, + { 189309, true }, + { 189324, true }, + { 189340, true }, + { 189355, true }, + { 189369, true }, + { 189385, true }, + { 189399, true }, + { 189413, true }, { 189431, true }, - { 189451, true }, - { 189467, true }, - { 189482, true }, - { 189496, true }, - { 189509, true }, - { 189540, true }, - { 189556, true }, - { 189567, true }, - { 189577, false }, - { 189601, true }, - { 189615, true }, - { 189627, true }, - { 189641, true }, - { 189651, true }, - { 189668, true }, - { 189681, true }, - { 189694, true }, - { 189711, true }, - { 189728, false }, - { 189745, true }, - { 189758, true }, - { 189775, true }, + { 189449, true }, + { 189469, true }, + { 189488, true }, + { 189504, true }, + { 189519, true }, + { 189533, true }, + { 189553, true }, + { 189569, true }, + { 189584, true }, + { 189598, true }, + { 189611, true }, + { 189642, true }, + { 189658, true }, + { 189669, true }, + { 189679, false }, + { 189703, true }, + { 189717, true }, + { 189729, true }, + { 189743, true }, + { 189753, true }, + { 189770, true }, + { 189783, true }, { 189796, true }, - { 189809, true }, - { 189822, true }, - { 189842, true }, + { 189813, true }, + { 189830, false }, + { 189847, true }, { 189860, true }, - { 189870, true }, - { 189883, true }, - { 189902, true }, - { 189916, true }, - { 189930, false }, - { 189941, true }, - { 189958, true }, - { 189971, true }, - { 189994, true }, - { 190022, true }, - { 190038, true }, - { 190050, true }, - { 190064, false }, - { 190077, true }, - { 190089, true }, - { 190102, true }, - { 190118, true }, - { 190128, true }, - { 190143, true }, - { 190151, true }, - { 190166, true }, - { 190183, true }, - { 190190, true }, - { 190200, true }, - { 190210, true }, - { 190231, true }, - { 190247, true }, - { 190266, true }, - { 190279, true }, - { 190299, true }, - { 190314, true }, - { 190322, true }, - { 190341, true }, - { 190357, false }, - { 190365, true }, - { 190380, true }, - { 190388, true }, - { 190399, true }, - { 190412, true }, - { 190423, true }, - { 190438, false }, - { 190458, true }, - { 190473, true }, - { 190488, true }, - { 190498, true }, - { 190510, true }, - { 190534, true }, - { 190547, true }, + { 189877, true }, + { 189898, true }, + { 189911, true }, + { 189924, true }, + { 189944, true }, + { 189962, true }, + { 189972, true }, + { 189985, true }, + { 190004, true }, + { 190018, true }, + { 190032, false }, + { 190043, true }, + { 190060, true }, + { 190073, true }, + { 190096, true }, + { 190124, true }, + { 190140, true }, + { 190152, true }, + { 190166, false }, + { 190179, true }, + { 190191, true }, + { 190204, true }, + { 190220, true }, + { 190230, true }, + { 190245, true }, + { 190253, true }, + { 190268, true }, + { 190285, true }, + { 190292, true }, + { 190302, true }, + { 190312, true }, + { 190333, true }, + { 190349, true }, + { 190368, true }, + { 190381, true }, + { 190401, true }, + { 190416, true }, + { 190424, true }, + { 190443, true }, + { 190459, false }, + { 190467, true }, + { 190482, true }, + { 190490, true }, + { 190501, true }, + { 190514, true }, + { 190525, true }, + { 190540, false }, { 190560, true }, - { 190572, true }, - { 190585, true }, - { 190599, true }, - { 190615, true }, - { 190634, true }, - { 190654, true }, - { 190665, true }, - { 190675, true }, - { 190686, true }, - { 190694, true }, - { 190707, true }, - { 190721, true }, - { 190731, true }, - { 190749, true }, - { 190776, true }, - { 190785, true }, - { 190798, false }, - { 190821, true }, - { 190843, true }, - { 190854, true }, - { 190867, true }, - { 190882, true }, - { 190889, true }, - { 190896, true }, - { 190907, true }, + { 190575, true }, + { 190590, true }, + { 190600, true }, + { 190612, true }, + { 190636, true }, + { 190649, true }, + { 190662, true }, + { 190674, true }, + { 190687, true }, + { 190701, true }, + { 190717, true }, + { 190736, true }, + { 190756, true }, + { 190767, true }, + { 190777, true }, + { 190788, true }, + { 190796, true }, + { 190809, true }, + { 190823, true }, + { 190833, true }, + { 190851, true }, + { 190878, true }, + { 190887, true }, + { 190900, false }, { 190923, true }, - { 190936, true }, - { 190948, true }, - { 190958, true }, - { 190975, true }, - { 190990, true }, - { 190999, true }, - { 191010, true }, - { 191028, true }, - { 191042, true }, - { 191054, true }, - { 191063, true }, - { 191073, true }, - { 191085, true }, - { 191097, true }, - { 191110, true }, - { 191126, true }, - { 191145, true }, - { 191164, true }, - { 191179, true }, - { 191196, true }, - { 191206, true }, - { 191225, true }, - { 191244, true }, - { 191262, true }, - { 191274, true }, - { 191293, false }, + { 190945, true }, + { 190956, true }, + { 190969, true }, + { 190984, true }, + { 190991, true }, + { 190998, true }, + { 191009, true }, + { 191025, true }, + { 191038, true }, + { 191050, true }, + { 191060, true }, + { 191077, true }, + { 191092, true }, + { 191101, true }, + { 191112, true }, + { 191130, true }, + { 191144, true }, + { 191156, true }, + { 191165, true }, + { 191175, true }, + { 191187, true }, + { 191199, true }, + { 191212, true }, + { 191228, true }, + { 191247, true }, + { 191266, true }, + { 191281, true }, + { 191298, true }, { 191308, true }, - { 191322, false }, - { 191332, true }, - { 191343, false }, - { 191353, true }, - { 191359, true }, - { 191368, true }, + { 191327, true }, + { 191346, true }, + { 191364, true }, { 191376, true }, - { 191395, true }, - { 191404, true }, - { 191418, true }, - { 191436, true }, - { 191448, true }, - { 191458, true }, - { 191482, true }, - { 191505, true }, - { 191518, true }, - { 191534, true }, - { 191546, true }, - { 191560, false }, - { 191573, true }, - { 191592, true }, - { 191602, true }, - { 191624, true }, - { 191637, true }, - { 191646, true }, - { 191657, true }, - { 191670, true }, - { 191683, true }, + { 191395, false }, + { 191410, true }, + { 191424, true }, + { 191435, false }, + { 191445, true }, + { 191451, true }, + { 191460, true }, + { 191468, true }, + { 191487, true }, + { 191496, true }, + { 191510, true }, + { 191528, true }, + { 191540, true }, + { 191550, true }, + { 191574, true }, + { 191597, true }, + { 191610, true }, + { 191626, true }, + { 191638, true }, + { 191652, false }, + { 191665, true }, + { 191684, true }, { 191694, true }, - { 191708, true }, - { 191723, true }, + { 191716, true }, + { 191729, true }, { 191738, true }, - { 191761, false }, - { 191774, false }, - { 191788, true }, - { 191803, true }, + { 191749, true }, + { 191762, true }, + { 191775, true }, + { 191786, true }, + { 191800, true }, { 191815, true }, - { 191825, true }, - { 191839, true }, - { 191852, true }, - { 191865, false }, - { 191879, true }, - { 191891, true }, - { 191903, true }, - { 191919, true }, - { 191945, true }, - { 191963, false }, - { 191976, true }, - { 191994, true }, - { 192004, true }, - { 192014, true }, - { 192025, true }, - { 192040, true }, - { 192052, true }, + { 191830, true }, + { 191853, false }, + { 191866, false }, + { 191880, true }, + { 191895, true }, + { 191907, true }, + { 191917, true }, + { 191931, true }, + { 191944, true }, + { 191957, false }, + { 191971, true }, + { 191983, true }, + { 191995, true }, + { 192011, true }, + { 192037, true }, + { 192055, false }, { 192068, true }, - { 192076, true }, { 192086, true }, { 192096, true }, { 192106, true }, { 192117, true }, - { 192137, true }, - { 192145, false }, - { 192166, true }, - { 192179, true }, + { 192132, true }, + { 192144, true }, + { 192160, true }, + { 192168, true }, + { 192178, true }, { 192188, true }, - { 192202, true }, - { 192212, true }, - { 192225, true }, - { 192234, true }, - { 192250, true }, - { 192261, false }, - { 192281, true }, - { 192291, true }, - { 192301, true }, - { 192316, true }, - { 192330, true }, - { 192347, true }, - { 192363, true }, - { 192374, true }, - { 192404, true }, - { 192430, true }, - { 192438, true }, - { 192457, true }, - { 192471, true }, - { 192480, true }, - { 192499, true }, - { 192509, true }, - { 192524, true }, - { 192540, true }, - { 192557, true }, - { 192568, true }, - { 192585, true }, + { 192198, true }, + { 192209, true }, + { 192229, true }, + { 192237, false }, + { 192258, true }, + { 192271, true }, + { 192280, true }, + { 192294, true }, + { 192304, true }, + { 192317, true }, + { 192326, true }, + { 192342, true }, + { 192353, false }, + { 192373, true }, + { 192383, true }, + { 192393, true }, + { 192408, true }, + { 192422, true }, + { 192439, true }, + { 192455, true }, + { 192466, true }, + { 192496, true }, + { 192522, true }, + { 192530, true }, + { 192549, true }, + { 192563, true }, + { 192572, true }, + { 192591, true }, { 192601, true }, - { 192621, true }, - { 192643, true }, - { 192656, true }, - { 192666, true }, - { 192688, true }, - { 192709, true }, - { 192730, true }, - { 192743, true }, - { 192767, true }, - { 192778, true }, - { 192790, true }, - { 192802, true }, - { 192812, true }, - { 192830, false }, - { 192847, true }, - { 192879, true }, - { 192890, true }, - { 192900, true }, - { 192913, true }, - { 192922, true }, - { 192935, true }, - { 192946, true }, - { 192957, true }, - { 192967, true }, - { 192974, true }, - { 192987, false }, - { 192999, true }, - { 193019, true }, - { 193029, true }, - { 193050, true }, - { 193067, true }, - { 193084, true }, - { 193102, true }, - { 193120, false }, - { 193138, false }, - { 193156, false }, - { 193173, true }, - { 193195, true }, - { 193208, true }, - { 193221, false }, - { 193236, false }, - { 193246, false }, - { 193260, true }, - { 193275, true }, + { 192616, true }, + { 192632, true }, + { 192649, true }, + { 192660, true }, + { 192677, true }, + { 192693, true }, + { 192713, true }, + { 192735, true }, + { 192748, true }, + { 192758, true }, + { 192780, true }, + { 192801, true }, + { 192822, true }, + { 192835, true }, + { 192859, true }, + { 192870, true }, + { 192882, true }, + { 192894, true }, + { 192904, true }, + { 192922, false }, + { 192939, true }, + { 192971, true }, + { 192982, true }, + { 192992, true }, + { 193005, true }, + { 193014, true }, + { 193027, true }, + { 193038, true }, + { 193049, true }, + { 193059, true }, + { 193066, true }, + { 193079, false }, + { 193091, true }, + { 193111, true }, + { 193121, true }, + { 193142, true }, + { 193159, true }, + { 193176, true }, + { 193194, true }, + { 193212, false }, + { 193230, false }, + { 193248, false }, + { 193265, true }, { 193287, true }, - { 193305, true }, - { 193320, true }, - { 193338, true }, - { 193350, true }, - { 193366, true }, - { 193376, true }, - { 193386, true }, - { 193414, true }, - { 193429, true }, - { 193440, true }, - { 193450, false }, + { 193300, true }, + { 193313, false }, + { 193328, false }, + { 193338, false }, + { 193352, true }, + { 193367, true }, + { 193379, true }, + { 193397, true }, + { 193412, true }, + { 193430, true }, + { 193442, true }, + { 193458, true }, { 193468, true }, - { 193483, true }, - { 193495, true }, - { 193508, true }, - { 193526, true }, - { 193543, true }, - { 193553, true }, - { 193564, false }, - { 193579, true }, - { 193597, true }, - { 193612, true }, - { 193630, true }, - { 193642, true }, - { 193665, true }, - { 193679, true }, - { 193695, true }, - { 193709, true }, - { 193727, true }, - { 193735, true }, - { 193759, true }, - { 193792, false }, - { 193815, true }, - { 193835, true }, - { 193852, true }, - { 193870, true }, - { 193880, true }, - { 193893, true }, - { 193906, true }, - { 193923, true }, - { 193934, true }, - { 193956, true }, - { 193974, false }, - { 193988, true }, + { 193478, true }, + { 193506, true }, + { 193521, true }, + { 193532, true }, + { 193542, false }, + { 193560, true }, + { 193575, true }, + { 193587, true }, + { 193600, true }, + { 193618, true }, + { 193628, true }, + { 193639, false }, + { 193654, true }, + { 193672, true }, + { 193687, true }, + { 193705, true }, + { 193717, true }, + { 193740, true }, + { 193754, true }, + { 193770, true }, + { 193784, true }, + { 193802, true }, + { 193810, true }, + { 193843, false }, + { 193866, true }, + { 193886, true }, + { 193903, true }, + { 193921, true }, + { 193931, true }, + { 193944, true }, + { 193957, true }, + { 193974, true }, + { 193985, true }, { 194007, true }, - { 194021, true }, + { 194025, false }, { 194039, true }, - { 194059, true }, - { 194073, true }, - { 194082, true }, - { 194095, true }, - { 194113, true }, - { 194125, true }, - { 194140, true }, - { 194153, true }, - { 194165, true }, - { 194177, true }, - { 194188, true }, - { 194199, true }, - { 194208, true }, - { 194221, true }, - { 194235, true }, - { 194246, true }, - { 194257, true }, - { 194270, true }, - { 194284, false }, + { 194058, true }, + { 194072, true }, + { 194090, true }, + { 194110, true }, + { 194124, true }, + { 194133, true }, + { 194146, true }, + { 194164, true }, + { 194176, true }, + { 194191, true }, + { 194204, true }, + { 194216, true }, + { 194228, true }, + { 194239, true }, + { 194250, true }, + { 194259, true }, + { 194272, true }, + { 194286, true }, { 194297, true }, - { 194306, true }, - { 194323, true }, - { 194333, true }, - { 194346, true }, - { 194355, true }, - { 194365, true }, - { 194376, true }, - { 194386, true }, - { 194394, true }, - { 194402, false }, - { 194416, false }, - { 194436, true }, - { 194446, true }, - { 194460, true }, - { 194470, true }, - { 194481, true }, - { 194493, true }, - { 194504, true }, - { 194516, true }, - { 194526, true }, - { 194538, true }, - { 194550, true }, - { 194561, true }, - { 194573, true }, + { 194308, true }, + { 194321, true }, + { 194335, false }, + { 194348, true }, + { 194357, true }, + { 194374, true }, + { 194384, true }, + { 194397, true }, + { 194406, true }, + { 194416, true }, + { 194427, true }, + { 194437, true }, + { 194445, true }, + { 194453, false }, + { 194467, false }, + { 194487, true }, + { 194497, true }, + { 194511, true }, + { 194521, true }, + { 194532, true }, + { 194544, true }, + { 194555, true }, + { 194567, true }, + { 194577, true }, { 194589, true }, - { 194604, true }, - { 194616, true }, - { 194626, true }, - { 194641, true }, - { 194656, true }, - { 194668, true }, - { 194675, true }, - { 194686, true }, - { 194696, true }, - { 194711, true }, - { 194722, true }, - { 194735, true }, - { 194749, true }, - { 194763, true }, - { 194774, false }, - { 194789, true }, - { 194798, true }, - { 194808, true }, - { 194815, true }, - { 194826, true }, - { 194838, true }, - { 194860, true }, - { 194874, true }, - { 194897, true }, - { 194932, true }, - { 194975, false }, - { 194986, true }, - { 194996, true }, - { 195006, true }, - { 195033, true }, - { 195042, true }, - { 195051, true }, - { 195068, true }, - { 195080, true }, + { 194601, true }, + { 194612, true }, + { 194624, true }, + { 194640, true }, + { 194655, true }, + { 194667, true }, + { 194677, true }, + { 194692, true }, + { 194707, true }, + { 194719, true }, + { 194726, true }, + { 194737, true }, + { 194747, true }, + { 194762, true }, + { 194773, true }, + { 194786, true }, + { 194800, true }, + { 194814, true }, + { 194825, false }, + { 194840, true }, + { 194849, true }, + { 194859, true }, + { 194866, true }, + { 194877, true }, + { 194889, true }, + { 194911, true }, + { 194925, true }, + { 194948, true }, + { 194983, true }, + { 195026, false }, + { 195037, true }, + { 195047, true }, + { 195057, true }, + { 195084, true }, { 195093, true }, - { 195120, true }, - { 195127, true }, - { 195138, true }, - { 195155, true }, + { 195102, true }, + { 195119, true }, + { 195131, true }, + { 195144, true }, { 195171, true }, - { 195182, true }, - { 195195, true }, - { 195219, true }, - { 195226, true }, - { 195236, true }, - { 195243, true }, - { 195263, true }, - { 195275, true }, - { 195296, true }, - { 195307, true }, - { 195319, true }, - { 195329, true }, - { 195338, true }, + { 195178, true }, + { 195189, true }, + { 195206, true }, + { 195222, true }, + { 195233, true }, + { 195246, true }, + { 195270, true }, + { 195277, true }, + { 195287, true }, + { 195294, true }, + { 195314, true }, + { 195326, true }, { 195347, true }, - { 195366, true }, - { 195386, true }, - { 195400, true }, - { 195421, true }, - { 195434, true }, - { 195446, true }, - { 195470, true }, - { 195488, false }, - { 195502, true }, - { 195517, true }, - { 195532, true }, - { 195541, false }, - { 195558, false }, + { 195358, true }, + { 195370, true }, + { 195380, true }, + { 195389, true }, + { 195398, true }, + { 195417, true }, + { 195437, true }, + { 195451, true }, + { 195472, true }, + { 195485, true }, + { 195497, true }, + { 195521, true }, + { 195539, false }, + { 195553, true }, { 195568, true }, - { 195578, true }, - { 195592, true }, - { 195607, true }, - { 195623, true }, - { 195639, true }, - { 195649, true }, - { 195660, true }, - { 195670, true }, - { 195686, true }, - { 195697, true }, - { 195708, true }, - { 195720, true }, - { 195732, true }, - { 195743, true }, - { 195757, true }, + { 195583, true }, + { 195592, false }, + { 195609, false }, + { 195619, true }, + { 195629, true }, + { 195643, true }, + { 195658, true }, + { 195674, true }, + { 195690, true }, + { 195700, true }, + { 195711, true }, + { 195721, true }, + { 195737, true }, + { 195748, true }, + { 195759, true }, { 195771, true }, - { 195788, true }, - { 195804, true }, - { 195816, false }, - { 195835, true }, - { 195850, true }, - { 195860, true }, - { 195878, true }, + { 195783, true }, + { 195794, true }, + { 195808, true }, + { 195822, true }, + { 195839, true }, + { 195855, true }, + { 195867, false }, + { 195886, true }, { 195901, true }, - { 195912, true }, - { 195932, true }, - { 195949, true }, - { 195959, true }, - { 195975, true }, - { 195994, true }, - { 196009, true }, - { 196025, true }, - { 196042, true }, - { 196062, true }, - { 196074, true }, - { 196089, true }, - { 196108, true }, - { 196117, true }, - { 196134, true }, - { 196146, true }, - { 196158, true }, - { 196170, true }, - { 196179, true }, - { 196189, true }, - { 196206, true }, - { 196224, true }, - { 196235, true }, - { 196245, true }, - { 196260, true }, - { 196270, true }, - { 196280, false }, - { 196287, true }, - { 196297, true }, - { 196318, true }, + { 195911, true }, + { 195929, true }, + { 195952, true }, + { 195963, true }, + { 195983, true }, + { 196000, true }, + { 196010, true }, + { 196026, true }, + { 196045, true }, + { 196060, true }, + { 196076, true }, + { 196093, true }, + { 196113, true }, + { 196125, true }, + { 196140, true }, + { 196159, true }, + { 196168, true }, + { 196185, true }, + { 196197, true }, + { 196209, true }, + { 196221, true }, + { 196230, true }, + { 196240, true }, + { 196257, true }, + { 196275, true }, + { 196286, true }, + { 196296, true }, + { 196311, true }, + { 196321, true }, + { 196331, false }, { 196338, true }, - { 196361, true }, - { 196381, true }, - { 196396, true }, - { 196414, true }, - { 196425, false }, - { 196449, true }, - { 196468, true }, - { 196481, true }, - { 196497, false }, - { 196513, true }, - { 196527, true }, - { 196534, true }, - { 196546, false }, - { 196560, true }, - { 196579, true }, - { 196597, true }, - { 196610, true }, - { 196624, false }, - { 196640, true }, - { 196658, true }, - { 196681, true }, - { 196694, true }, - { 196706, true }, - { 196717, true }, - { 196728, true }, - { 196743, true }, + { 196348, true }, + { 196369, true }, + { 196389, true }, + { 196412, true }, + { 196432, true }, + { 196447, true }, + { 196465, true }, + { 196476, false }, + { 196500, true }, + { 196519, true }, + { 196532, true }, + { 196548, false }, + { 196564, true }, + { 196578, true }, + { 196585, true }, + { 196597, false }, + { 196611, true }, + { 196630, true }, + { 196648, true }, + { 196661, true }, + { 196675, false }, + { 196691, true }, + { 196709, true }, + { 196732, true }, + { 196745, true }, { 196757, true }, - { 196782, true }, - { 196815, true }, - { 196841, true }, - { 196875, true }, - { 196898, true }, - { 196911, true }, - { 196927, true }, - { 196939, true }, - { 196951, true }, - { 196967, false }, - { 196987, true }, - { 197000, false }, + { 196768, true }, + { 196779, true }, + { 196794, true }, + { 196808, true }, + { 196833, true }, + { 196866, true }, + { 196892, true }, + { 196926, true }, + { 196949, true }, + { 196962, true }, + { 196978, true }, + { 196990, true }, + { 197002, true }, { 197018, false }, - { 197041, true }, - { 197061, true }, - { 197077, true }, - { 197091, true }, + { 197038, true }, + { 197051, false }, + { 197069, false }, + { 197092, true }, { 197112, true }, - { 197127, false }, - { 197140, true }, - { 197154, true }, - { 197166, true }, - { 197178, true }, - { 197194, false }, - { 197216, true }, - { 197236, true }, - { 197248, true }, - { 197264, false }, - { 197276, true }, - { 197289, true }, - { 197305, true }, - { 197323, true }, - { 197335, true }, - { 197349, true }, - { 197369, true }, - { 197383, true }, + { 197128, true }, + { 197142, true }, + { 197163, true }, + { 197178, false }, + { 197191, true }, + { 197205, true }, + { 197217, true }, + { 197229, true }, + { 197245, false }, + { 197267, true }, + { 197287, true }, + { 197299, true }, + { 197315, false }, + { 197327, true }, + { 197340, true }, + { 197356, true }, + { 197374, true }, + { 197386, true }, { 197400, true }, - { 197417, true }, - { 197431, true }, - { 197441, false }, - { 197455, true }, - { 197465, true }, - { 197486, true }, - { 197499, true }, - { 197512, true }, - { 197523, true }, - { 197536, true }, - { 197557, true }, - { 197577, true }, - { 197594, true }, + { 197420, true }, + { 197434, true }, + { 197451, true }, + { 197468, true }, + { 197482, true }, + { 197492, false }, + { 197506, true }, + { 197516, true }, + { 197537, true }, + { 197550, true }, + { 197563, true }, + { 197574, true }, + { 197587, true }, { 197608, true }, - { 197618, true }, - { 197635, true }, + { 197628, true }, { 197645, true }, - { 197653, true }, + { 197659, true }, { 197669, true }, - { 197685, true }, - { 197701, true }, - { 197722, true }, - { 197733, true }, - { 197745, true }, - { 197758, true }, - { 197783, true }, - { 197798, true }, - { 197818, true }, - { 197832, true }, - { 197846, true }, - { 197861, true }, + { 197686, true }, + { 197696, true }, + { 197704, true }, + { 197720, true }, + { 197736, true }, + { 197752, true }, + { 197773, true }, + { 197784, true }, + { 197796, true }, + { 197809, true }, + { 197834, true }, + { 197849, true }, + { 197869, true }, { 197883, true }, - { 197903, true }, - { 197918, true }, - { 197928, true }, - { 197946, true }, - { 197961, true }, - { 197977, true }, - { 197998, true }, - { 198014, true }, - { 198023, false }, - { 198033, true }, - { 198045, true }, - { 198062, true }, - { 198074, true }, - { 198090, true }, - { 198106, true }, - { 198127, true }, - { 198139, true }, - { 198158, false }, - { 198170, true }, - { 198180, true }, - { 198195, true }, - { 198207, true }, + { 197897, true }, + { 197912, true }, + { 197934, true }, + { 197954, true }, + { 197969, true }, + { 197979, true }, + { 197997, true }, + { 198012, true }, + { 198028, true }, + { 198049, true }, + { 198065, true }, + { 198074, false }, + { 198084, true }, + { 198096, true }, + { 198113, true }, + { 198125, true }, + { 198141, true }, + { 198157, true }, + { 198178, true }, + { 198190, true }, + { 198209, false }, { 198221, true }, - { 198245, true }, - { 198257, true }, - { 198278, true }, - { 198309, true }, - { 198334, true }, - { 198357, true }, - { 198368, true }, - { 198380, true }, - { 198395, true }, + { 198231, true }, + { 198246, true }, + { 198258, true }, + { 198272, true }, + { 198296, true }, + { 198308, true }, + { 198329, true }, + { 198360, true }, + { 198385, true }, { 198408, true }, - { 198421, true }, - { 198450, true }, - { 198473, true }, - { 198497, true }, + { 198419, true }, + { 198431, true }, + { 198446, true }, + { 198459, true }, + { 198472, true }, + { 198501, true }, { 198524, true }, - { 198538, true }, - { 198561, true }, - { 198587, true }, - { 198615, true }, - { 198646, true }, - { 198671, true }, - { 198679, true }, - { 198686, true }, - { 198698, true }, - { 198706, true }, - { 198718, true }, - { 198731, true }, - { 198752, true }, - { 198765, true }, - { 198786, true }, - { 198805, true }, - { 198824, true }, - { 198835, true }, - { 198848, true }, - { 198864, false }, - { 198880, true }, - { 198888, true }, - { 198903, true }, - { 198920, false }, - { 198935, true }, - { 198951, true }, - { 198961, true }, - { 198973, true }, - { 198992, true }, - { 199006, false }, - { 199015, true }, - { 199027, true }, - { 199040, true }, - { 199052, true }, - { 199067, true }, - { 199089, true }, - { 199106, true }, - { 199128, true }, - { 199142, true }, - { 199149, true }, - { 199162, true }, - { 199175, true }, - { 199201, true }, + { 198548, true }, + { 198575, true }, + { 198589, true }, + { 198612, true }, + { 198638, true }, + { 198666, true }, + { 198697, true }, + { 198722, true }, + { 198730, true }, + { 198737, true }, + { 198749, true }, + { 198757, true }, + { 198769, true }, + { 198782, true }, + { 198803, true }, + { 198816, true }, + { 198837, true }, + { 198856, true }, + { 198875, true }, + { 198886, true }, + { 198899, true }, + { 198915, false }, + { 198931, true }, + { 198939, true }, + { 198954, true }, + { 198971, false }, + { 198986, true }, + { 199002, true }, + { 199012, true }, + { 199024, true }, + { 199043, true }, + { 199057, false }, + { 199066, true }, + { 199078, true }, + { 199091, true }, + { 199103, true }, + { 199118, true }, + { 199140, true }, + { 199157, true }, + { 199179, true }, + { 199193, true }, + { 199200, true }, { 199213, true }, - { 199224, true }, - { 199250, true }, - { 199260, false }, - { 199277, true }, - { 199289, true }, - { 199304, true }, - { 199314, true }, - { 199331, true }, - { 199344, true }, - { 199356, true }, - { 199366, true }, - { 199379, false }, + { 199226, true }, + { 199252, true }, + { 199264, true }, + { 199275, true }, + { 199301, true }, + { 199311, false }, + { 199328, true }, + { 199340, true }, + { 199355, true }, + { 199365, true }, + { 199382, true }, { 199395, true }, - { 199411, true }, - { 199425, false }, - { 199440, true }, - { 199453, false }, - { 199470, true }, - { 199484, true }, - { 199498, true }, - { 199522, true }, + { 199407, true }, + { 199417, true }, + { 199430, false }, + { 199446, true }, + { 199462, true }, + { 199476, false }, + { 199491, true }, + { 199504, false }, + { 199521, true }, { 199535, true }, - { 199548, true }, - { 199562, true }, - { 199576, true }, - { 199591, true }, - { 199605, true }, - { 199621, true }, - { 199636, true }, - { 199651, true }, - { 199669, true }, - { 199681, true }, - { 199693, true }, - { 199709, true }, - { 199726, true }, - { 199750, true }, - { 199767, true }, - { 199785, true }, - { 199804, true }, - { 199824, true }, - { 199839, true }, - { 199851, true }, - { 199865, true }, - { 199882, true }, - { 199893, true }, - { 199902, true }, - { 199915, true }, - { 199929, true }, - { 199944, true }, - { 199956, true }, - { 199966, false }, - { 199979, true }, - { 199990, true }, - { 200004, true }, - { 200017, true }, - { 200029, false }, - { 200048, true }, - { 200070, true }, - { 200085, true }, - { 200104, true }, - { 200118, false }, - { 200129, true }, - { 200144, true }, - { 200158, true }, - { 200170, true }, - { 200187, true }, - { 200205, true }, - { 200216, true }, + { 199549, true }, + { 199563, true }, + { 199587, true }, + { 199600, true }, + { 199613, true }, + { 199627, true }, + { 199641, true }, + { 199656, true }, + { 199670, true }, + { 199686, true }, + { 199701, true }, + { 199716, true }, + { 199734, true }, + { 199746, true }, + { 199758, true }, + { 199774, true }, + { 199791, true }, + { 199815, true }, + { 199832, true }, + { 199850, true }, + { 199869, true }, + { 199889, true }, + { 199904, true }, + { 199916, true }, + { 199930, true }, + { 199947, true }, + { 199958, true }, + { 199967, true }, + { 199980, true }, + { 199994, true }, + { 200009, true }, + { 200021, true }, + { 200031, false }, + { 200044, true }, + { 200055, true }, + { 200069, true }, + { 200082, true }, + { 200094, false }, + { 200113, true }, + { 200135, true }, + { 200150, true }, + { 200169, true }, + { 200183, false }, + { 200194, true }, + { 200209, true }, { 200223, true }, { 200235, true }, - { 200243, true }, - { 200253, true }, - { 200263, true }, - { 200278, true }, - { 200297, true }, - { 200309, true }, - { 200325, true }, - { 200338, true }, - { 200353, false }, - { 200363, false }, - { 200375, true }, - { 200384, true }, - { 200398, true }, - { 200410, true }, - { 200418, true }, - { 200425, true }, - { 200435, true }, - { 200448, true }, - { 200467, true }, - { 200475, false }, - { 200487, true }, + { 200252, true }, + { 200270, true }, + { 200281, true }, + { 200288, true }, + { 200300, true }, + { 200308, true }, + { 200318, true }, + { 200328, true }, + { 200343, true }, + { 200362, true }, + { 200374, true }, + { 200390, true }, + { 200403, true }, + { 200418, false }, + { 200428, false }, + { 200440, true }, + { 200449, true }, + { 200463, true }, + { 200475, true }, + { 200483, true }, + { 200490, true }, { 200500, true }, - { 200515, true }, - { 200537, true }, - { 200551, true }, - { 200563, true }, - { 200581, true }, - { 200597, true }, - { 200606, false }, - { 200623, true }, - { 200644, true }, - { 200665, true }, - { 200677, true }, - { 200702, true }, - { 200728, true }, - { 200754, true }, - { 200765, true }, - { 200777, true }, - { 200790, true }, - { 200803, true }, - { 200813, true }, - { 200822, true }, - { 200836, true }, - { 200856, true }, - { 200871, true }, + { 200513, true }, + { 200532, true }, + { 200540, false }, + { 200552, true }, + { 200565, true }, + { 200580, true }, + { 200602, true }, + { 200616, true }, + { 200628, true }, + { 200646, true }, + { 200662, true }, + { 200671, false }, + { 200688, true }, + { 200709, true }, + { 200730, true }, + { 200742, true }, + { 200767, true }, + { 200793, true }, + { 200819, true }, + { 200830, true }, + { 200842, true }, + { 200855, true }, + { 200868, true }, + { 200878, true }, { 200887, true }, - { 200897, true }, - { 200909, true }, - { 200929, true }, - { 200951, true }, - { 200968, true }, - { 200981, true }, - { 201000, true }, - { 201014, true }, - { 201028, true }, - { 201040, true }, - { 201064, true }, - { 201081, false }, - { 201095, true }, - { 201108, true }, - { 201121, true }, - { 201140, true }, - { 201162, true }, - { 201174, true }, - { 201189, true }, - { 201210, true }, - { 201235, true }, - { 201251, true }, - { 201277, true }, - { 201297, true }, - { 201310, true }, - { 201326, true }, - { 201339, true }, - { 201351, true }, - { 201369, true }, - { 201383, true }, - { 201402, true }, - { 201413, true }, - { 201425, true }, - { 201435, true }, - { 201444, true }, - { 201458, true }, - { 201469, true }, - { 201480, true }, - { 201488, true }, - { 201501, true }, - { 201515, true }, - { 201532, true }, - { 201543, false }, - { 201555, true }, - { 201574, true }, - { 201587, true }, - { 201598, true }, - { 201609, true }, - { 201622, true }, - { 201634, true }, - { 201644, true }, - { 201654, true }, + { 200901, true }, + { 200921, true }, + { 200936, true }, + { 200952, true }, + { 200962, true }, + { 200974, true }, + { 200994, true }, + { 201016, true }, + { 201033, true }, + { 201046, true }, + { 201065, true }, + { 201079, true }, + { 201093, true }, + { 201105, true }, + { 201129, true }, + { 201146, false }, + { 201160, true }, + { 201173, true }, + { 201186, true }, + { 201205, true }, + { 201227, true }, + { 201239, true }, + { 201254, true }, + { 201275, true }, + { 201300, true }, + { 201316, true }, + { 201342, true }, + { 201362, true }, + { 201375, true }, + { 201391, true }, + { 201404, true }, + { 201416, true }, + { 201434, true }, + { 201448, true }, + { 201467, true }, + { 201478, true }, + { 201490, true }, + { 201500, true }, + { 201509, true }, + { 201523, true }, + { 201534, true }, + { 201545, true }, + { 201553, true }, + { 201566, true }, + { 201580, true }, + { 201597, true }, + { 201608, false }, + { 201620, true }, + { 201639, true }, + { 201652, true }, + { 201663, true }, { 201674, true }, - { 201684, true }, - { 201707, true }, + { 201687, true }, + { 201699, true }, + { 201709, true }, { 201719, true }, - { 201738, true }, - { 201746, true }, - { 201760, true }, + { 201739, true }, + { 201749, true }, { 201772, true }, - { 201787, false }, - { 201800, true }, - { 201813, true }, - { 201824, true }, - { 201835, true }, - { 201851, true }, - { 201861, true }, - { 201875, true }, - { 201882, true }, - { 201895, true }, - { 201912, true }, - { 201922, true }, - { 201930, true }, - { 201942, true }, - { 201958, true }, - { 201973, true }, - { 201983, true }, - { 202008, true }, - { 202016, true }, - { 202028, false }, - { 202039, false }, - { 202052, true }, - { 202067, true }, + { 201784, true }, + { 201803, true }, + { 201811, true }, + { 201825, true }, + { 201837, true }, + { 201852, false }, + { 201865, true }, + { 201878, true }, + { 201889, true }, + { 201900, true }, + { 201916, true }, + { 201926, true }, + { 201940, true }, + { 201947, true }, + { 201960, true }, + { 201977, true }, + { 201987, true }, + { 201995, true }, + { 202007, true }, + { 202023, true }, + { 202038, true }, + { 202048, true }, + { 202073, true }, { 202081, true }, - { 202095, true }, - { 202112, true }, - { 202129, true }, - { 202144, true }, - { 202162, true }, - { 202180, true }, - { 202198, true }, - { 202212, true }, - { 202226, true }, - { 202240, true }, - { 202254, true }, - { 202268, false }, - { 202286, false }, - { 202309, false }, - { 202330, false }, - { 202349, true }, - { 202365, false }, - { 202381, false }, - { 202397, true }, - { 202419, true }, - { 202432, false }, - { 202449, false }, - { 202466, true }, - { 202483, false }, - { 202500, false }, + { 202093, false }, + { 202104, false }, + { 202117, true }, + { 202132, true }, + { 202146, true }, + { 202160, true }, + { 202177, true }, + { 202194, true }, + { 202209, true }, + { 202227, true }, + { 202245, true }, + { 202263, true }, + { 202277, true }, + { 202291, true }, + { 202305, true }, + { 202319, true }, + { 202333, false }, + { 202351, false }, + { 202374, false }, + { 202395, false }, + { 202414, true }, + { 202430, false }, + { 202446, false }, + { 202462, true }, + { 202484, true }, + { 202497, false }, { 202514, false }, - { 202533, false }, - { 202544, false }, - { 202556, false }, - { 202568, false }, - { 202587, true }, - { 202605, false }, - { 202619, false }, - { 202636, false }, - { 202653, false }, - { 202668, false }, - { 202684, true }, - { 202705, false }, - { 202724, false }, - { 202742, false }, - { 202762, true }, - { 202778, false }, - { 202793, true }, - { 202808, true }, - { 202832, true }, - { 202839, true }, - { 202858, false }, - { 202876, false }, - { 202891, true }, - { 202912, false }, - { 202936, false }, - { 202955, false }, - { 202971, false }, - { 202986, false }, - { 202999, true }, - { 203015, false }, - { 203030, false }, - { 203044, false }, - { 203062, true }, - { 203073, true }, - { 203084, true }, - { 203092, true }, - { 203107, true }, - { 203117, true }, - { 203130, true }, - { 203147, true }, - { 203159, true }, - { 203167, true }, - { 203178, true }, - { 203188, true }, - { 203204, true }, - { 203209, true }, - { 203214, true }, + { 202531, true }, + { 202548, false }, + { 202565, false }, + { 202579, false }, + { 202598, false }, + { 202609, false }, + { 202621, false }, + { 202633, false }, + { 202652, true }, + { 202670, false }, + { 202684, false }, + { 202701, false }, + { 202718, false }, + { 202733, false }, + { 202749, true }, + { 202770, false }, + { 202789, false }, + { 202807, false }, + { 202827, true }, + { 202843, false }, + { 202858, true }, + { 202873, true }, + { 202897, true }, + { 202904, true }, + { 202923, false }, + { 202941, false }, + { 202956, true }, + { 202977, false }, + { 203001, false }, + { 203020, false }, + { 203036, false }, + { 203051, false }, + { 203064, true }, + { 203080, false }, + { 203095, false }, + { 203109, false }, + { 203127, true }, + { 203138, true }, + { 203149, true }, + { 203157, true }, + { 203172, true }, + { 203182, true }, + { 203195, true }, + { 203212, true }, { 203224, true }, { 203232, true }, - { 203252, true }, - { 203259, true }, - { 203278, true }, - { 203285, true }, - { 203292, true }, - { 203299, true }, - { 203308, true }, - { 203329, true }, - { 203349, true }, + { 203243, true }, + { 203253, true }, + { 203269, true }, + { 203274, true }, + { 203279, true }, + { 203289, true }, + { 203297, true }, + { 203317, true }, + { 203324, true }, + { 203343, true }, + { 203350, true }, + { 203357, true }, + { 203364, true }, { 203373, true }, - { 203380, true }, - { 203390, true }, - { 203407, true }, - { 203427, true }, - { 203433, true }, - { 203440, true }, - { 203452, true }, - { 203465, true }, - { 203480, false }, - { 203491, true }, - { 203502, true }, - { 203510, false }, - { 203529, true }, - { 203540, true }, - { 203551, true }, - { 203558, true }, - { 203569, true }, - { 203581, true }, - { 203600, true }, + { 203394, true }, + { 203414, true }, + { 203438, true }, + { 203445, true }, + { 203455, true }, + { 203472, true }, + { 203492, true }, + { 203498, true }, + { 203505, true }, + { 203517, true }, + { 203530, true }, + { 203545, false }, + { 203556, true }, + { 203567, true }, + { 203575, false }, + { 203594, true }, + { 203605, true }, { 203616, true }, - { 203628, true }, - { 203639, true }, - { 203652, true }, - { 203666, true }, + { 203623, true }, + { 203634, true }, + { 203646, true }, + { 203665, true }, { 203681, true }, - { 203696, true }, - { 203706, true }, - { 203716, true }, - { 203727, false }, - { 203737, true }, - { 203747, true }, - { 203758, true }, - { 203768, true }, - { 203777, true }, - { 203791, true }, - { 203801, true }, - { 203809, true }, - { 203821, true }, - { 203832, true }, - { 203843, true }, - { 203855, true }, - { 203865, true }, - { 203873, true }, - { 203887, true }, - { 203894, true }, - { 203901, true }, - { 203919, true }, - { 203942, true }, - { 203953, true }, - { 203969, true }, - { 203981, true }, - { 204000, true }, - { 204033, true }, - { 204057, true }, - { 204083, true }, - { 204108, true }, - { 204133, true }, - { 204157, true }, - { 204187, true }, + { 203693, true }, + { 203704, true }, + { 203717, true }, + { 203731, true }, + { 203746, true }, + { 203761, true }, + { 203771, true }, + { 203781, true }, + { 203792, false }, + { 203802, true }, + { 203812, true }, + { 203823, true }, + { 203833, true }, + { 203842, true }, + { 203856, true }, + { 203866, true }, + { 203874, true }, + { 203886, true }, + { 203897, true }, + { 203908, true }, + { 203920, true }, + { 203930, true }, + { 203938, true }, + { 203952, true }, + { 203959, true }, + { 203966, true }, + { 203984, true }, + { 204007, true }, + { 204018, true }, + { 204034, true }, + { 204046, true }, + { 204065, true }, + { 204098, true }, + { 204122, true }, + { 204148, true }, + { 204173, true }, { 204198, true }, - { 204217, true }, - { 204248, true }, - { 204259, false }, - { 204280, true }, - { 204317, true }, - { 204340, true }, - { 204368, true }, - { 204383, true }, - { 204397, true }, - { 204419, true }, - { 204461, true }, + { 204222, true }, + { 204252, true }, + { 204263, true }, + { 204282, true }, + { 204313, true }, + { 204324, false }, + { 204345, true }, + { 204382, true }, + { 204405, true }, + { 204433, true }, + { 204448, true }, + { 204462, true }, { 204484, true }, - { 204500, true }, { 204526, true }, - { 204560, true }, - { 204584, true }, - { 204611, false }, - { 204621, true }, - { 204627, true }, - { 204636, false }, - { 204646, true }, - { 204657, true }, - { 204667, true }, - { 204677, true }, - { 204684, true }, - { 204691, true }, - { 204704, true }, + { 204549, true }, + { 204565, true }, + { 204591, true }, + { 204625, true }, + { 204649, true }, + { 204676, false }, + { 204686, true }, + { 204692, true }, + { 204701, false }, { 204711, true }, - { 204725, true }, - { 204734, true }, - { 204748, true }, - { 204758, true }, - { 204768, true }, - { 204781, true }, - { 204788, true }, - { 204795, true }, - { 204806, true }, - { 204815, true }, - { 204824, true }, - { 204837, true }, - { 204844, true }, - { 204854, true }, - { 204862, true }, - { 204873, true }, - { 204882, true }, - { 204892, true }, - { 204907, true }, - { 204917, true }, - { 204929, true }, + { 204722, true }, + { 204732, true }, + { 204742, true }, + { 204749, true }, + { 204756, true }, + { 204769, true }, + { 204776, true }, + { 204790, true }, + { 204799, true }, + { 204813, true }, + { 204823, true }, + { 204833, true }, + { 204846, true }, + { 204853, true }, + { 204860, true }, + { 204871, true }, + { 204880, true }, + { 204889, true }, + { 204902, true }, + { 204909, true }, + { 204919, true }, + { 204927, true }, { 204938, true }, - { 204958, true }, - { 204969, true }, - { 204980, true }, + { 204947, true }, + { 204957, true }, + { 204972, true }, + { 204982, true }, { 204994, true }, - { 205001, true }, - { 205013, true }, + { 205003, true }, { 205023, true }, - { 205030, true }, - { 205042, false }, - { 205054, true }, - { 205068, true }, - { 205081, true }, - { 205097, true }, - { 205107, true }, - { 205122, true }, - { 205134, false }, - { 205144, true }, - { 205157, true }, - { 205169, true }, - { 205177, true }, - { 205186, true }, - { 205198, true }, - { 205208, true }, - { 205216, true }, - { 205226, true }, - { 205233, true }, + { 205034, true }, + { 205045, true }, + { 205059, true }, + { 205066, true }, + { 205078, true }, + { 205088, true }, + { 205095, true }, + { 205107, false }, + { 205119, true }, + { 205133, true }, + { 205146, true }, + { 205162, true }, + { 205172, true }, + { 205187, true }, + { 205199, false }, + { 205209, true }, + { 205222, true }, + { 205234, true }, { 205242, true }, - { 205262, true }, - { 205277, true }, - { 205293, true }, - { 205308, true }, - { 205321, true }, - { 205333, true }, - { 205347, true }, - { 205357, false }, - { 205366, true }, - { 205382, true }, - { 205389, true }, - { 205399, true }, - { 205408, true }, - { 205417, true }, - { 205428, true }, - { 205439, true }, - { 205449, true }, - { 205460, true }, + { 205251, true }, + { 205263, true }, + { 205273, true }, + { 205281, true }, + { 205291, true }, + { 205298, true }, + { 205307, true }, + { 205327, true }, + { 205342, true }, + { 205358, true }, + { 205373, true }, + { 205386, true }, + { 205398, true }, + { 205412, true }, + { 205422, false }, + { 205431, true }, + { 205447, true }, + { 205454, true }, + { 205464, true }, + { 205473, true }, { 205482, true }, - { 205497, true }, + { 205493, true }, { 205504, true }, - { 205515, true }, - { 205523, true }, - { 205533, true }, - { 205546, false }, - { 205555, true }, + { 205514, true }, + { 205525, true }, + { 205547, true }, + { 205562, true }, { 205569, true }, - { 205585, true }, - { 205609, true }, - { 205627, true }, - { 205638, true }, - { 205650, false }, - { 205665, true }, - { 205675, true }, - { 205687, true }, - { 205707, true }, - { 205717, true }, - { 205728, true }, - { 205738, true }, - { 205750, true }, - { 205763, true }, - { 205778, true }, - { 205792, true }, - { 205807, true }, - { 205822, true }, - { 205834, true }, - { 205846, true }, + { 205580, true }, + { 205588, true }, + { 205598, true }, + { 205611, false }, + { 205620, true }, + { 205634, true }, + { 205650, true }, + { 205674, true }, + { 205692, true }, + { 205703, true }, + { 205715, false }, + { 205730, true }, + { 205740, true }, + { 205752, true }, + { 205772, true }, + { 205782, true }, + { 205793, true }, + { 205803, true }, + { 205815, true }, + { 205828, true }, + { 205843, true }, { 205857, true }, - { 205867, true }, - { 205879, true }, - { 205892, true }, - { 205905, true }, - { 205920, true }, - { 205939, true }, - { 205954, true }, - { 205966, true }, - { 205977, true }, - { 205999, true }, - { 206015, true }, - { 206035, true }, - { 206044, true }, - { 206052, true }, - { 206060, false }, - { 206072, true }, - { 206085, true }, - { 206097, true }, + { 205872, true }, + { 205887, true }, + { 205899, true }, + { 205911, true }, + { 205922, true }, + { 205932, true }, + { 205944, true }, + { 205957, true }, + { 205970, true }, + { 205985, true }, + { 206004, true }, + { 206019, true }, + { 206031, true }, + { 206042, true }, + { 206064, true }, + { 206080, true }, + { 206100, true }, { 206109, true }, { 206117, true }, - { 206132, true }, - { 206142, true }, - { 206153, true }, - { 206169, true }, - { 206178, true }, - { 206187, true }, - { 206196, true }, - { 206211, true }, - { 206220, true }, - { 206231, true }, - { 206245, true }, - { 206257, true }, - { 206270, true }, - { 206278, true }, - { 206292, true }, - { 206304, true }, - { 206311, true }, - { 206319, true }, - { 206327, true }, - { 206337, true }, - { 206346, true }, - { 206359, true }, - { 206364, true }, - { 206374, true }, + { 206125, false }, + { 206137, true }, + { 206150, true }, + { 206162, true }, + { 206174, true }, + { 206182, true }, + { 206197, true }, + { 206207, true }, + { 206218, true }, + { 206234, true }, + { 206243, true }, + { 206252, true }, + { 206261, true }, + { 206276, true }, + { 206285, true }, + { 206296, true }, + { 206310, true }, + { 206322, true }, + { 206335, true }, + { 206343, false }, + { 206355, true }, + { 206369, true }, { 206381, true }, { 206388, true }, - { 206400, false }, - { 206419, true }, - { 206435, true }, - { 206450, true }, - { 206466, true }, - { 206481, true }, - { 206494, true }, - { 206507, true }, - { 206515, true }, - { 206525, true }, - { 206535, true }, - { 206548, true }, - { 206561, true }, - { 206578, true }, - { 206586, true }, - { 206595, true }, - { 206608, true }, - { 206620, true }, - { 206650, true }, - { 206661, true }, - { 206679, true }, - { 206703, true }, - { 206713, true }, - { 206725, true }, - { 206736, true }, - { 206748, true }, - { 206766, true }, - { 206775, true }, - { 206786, true }, - { 206798, true }, - { 206806, true }, + { 206396, true }, + { 206404, true }, + { 206414, true }, + { 206423, true }, + { 206436, true }, + { 206441, true }, + { 206451, true }, + { 206458, true }, + { 206465, true }, + { 206477, false }, + { 206496, true }, + { 206512, true }, + { 206527, true }, + { 206543, true }, + { 206558, true }, + { 206571, true }, + { 206584, true }, + { 206592, true }, + { 206602, true }, + { 206612, true }, + { 206625, true }, + { 206638, true }, + { 206655, true }, + { 206663, true }, + { 206672, true }, + { 206685, true }, + { 206697, true }, + { 206727, true }, + { 206738, true }, + { 206756, true }, + { 206780, true }, + { 206790, true }, + { 206802, true }, { 206813, true }, - { 206821, true }, - { 206832, true }, - { 206842, true }, - { 206854, true }, + { 206825, true }, + { 206843, true }, + { 206852, true }, { 206863, true }, - { 206888, true }, - { 206900, true }, - { 206922, true }, - { 206933, true }, - { 206944, true }, - { 206957, true }, - { 206972, true }, - { 206990, true }, - { 207006, true }, - { 207024, true }, - { 207038, true }, - { 207048, true }, - { 207060, true }, - { 207072, true }, - { 207084, true }, - { 207095, true }, - { 207107, true }, - { 207120, true }, - { 207133, true }, - { 207145, true }, - { 207157, true }, - { 207168, false }, - { 207178, true }, - { 207189, true }, - { 207204, true }, - { 207217, true }, - { 207228, true }, - { 207238, true }, - { 207252, true }, - { 207264, true }, - { 207280, true }, - { 207295, true }, - { 207308, true }, - { 207320, true }, - { 207333, true }, - { 207348, true }, - { 207355, true }, - { 207370, true }, - { 207382, true }, - { 207391, true }, - { 207403, true }, - { 207411, true }, - { 207420, false }, - { 207428, true }, - { 207439, true }, + { 206875, true }, + { 206883, true }, + { 206890, true }, + { 206898, true }, + { 206909, true }, + { 206919, true }, + { 206931, true }, + { 206940, true }, + { 206965, true }, + { 206977, true }, + { 206999, true }, + { 207010, true }, + { 207021, true }, + { 207034, true }, + { 207049, true }, + { 207067, true }, + { 207083, true }, + { 207101, true }, + { 207115, true }, + { 207125, true }, + { 207137, true }, + { 207149, true }, + { 207161, true }, + { 207172, true }, + { 207184, true }, + { 207197, true }, + { 207210, true }, + { 207222, true }, + { 207234, true }, + { 207245, false }, + { 207255, true }, + { 207266, true }, + { 207281, true }, + { 207294, true }, + { 207305, true }, + { 207315, true }, + { 207329, true }, + { 207341, true }, + { 207357, true }, + { 207372, true }, + { 207385, true }, + { 207397, true }, + { 207410, true }, + { 207425, true }, + { 207432, true }, { 207447, true }, - { 207458, true }, - { 207469, true }, - { 207484, true }, - { 207501, false }, - { 207513, true }, - { 207532, true }, - { 207550, true }, - { 207570, true }, - { 207582, true }, - { 207596, true }, - { 207606, true }, - { 207613, true }, - { 207624, true }, - { 207634, true }, - { 207640, true }, - { 207655, true }, - { 207665, true }, - { 207680, true }, - { 207692, true }, - { 207704, true }, + { 207459, true }, + { 207468, true }, + { 207480, true }, + { 207488, true }, + { 207497, false }, + { 207505, true }, + { 207516, true }, + { 207524, true }, + { 207535, true }, + { 207546, true }, + { 207561, true }, + { 207578, false }, + { 207590, true }, + { 207609, true }, + { 207627, true }, + { 207647, true }, + { 207659, true }, + { 207673, true }, + { 207683, true }, + { 207690, true }, + { 207701, true }, { 207711, true }, - { 207722, true }, - { 207735, true }, - { 207759, true }, - { 207766, true }, - { 207777, true }, + { 207717, true }, + { 207732, true }, + { 207742, true }, + { 207757, true }, + { 207769, true }, + { 207781, true }, { 207788, true }, - { 207806, true }, - { 207819, true }, - { 207834, true }, - { 207850, true }, - { 207861, true }, - { 207877, true }, - { 207901, true }, - { 207916, true }, - { 207926, true }, - { 207934, true }, - { 207953, true }, - { 207964, true }, - { 207974, true }, - { 207984, true }, - { 207995, true }, + { 207799, true }, + { 207812, true }, + { 207836, true }, + { 207843, true }, + { 207854, true }, + { 207865, true }, + { 207883, true }, + { 207896, true }, + { 207911, true }, + { 207927, true }, + { 207938, true }, + { 207954, true }, + { 207978, true }, + { 207993, true }, { 208003, true }, - { 208017, true }, - { 208029, true }, - { 208043, true }, - { 208052, true }, - { 208066, true }, - { 208074, true }, - { 208087, true }, - { 208101, true }, - { 208122, true }, - { 208132, true }, - { 208139, true }, - { 208150, true }, - { 208160, true }, - { 208173, true }, - { 208181, true }, - { 208190, true }, - { 208203, false }, - { 208210, true }, - { 208223, true }, - { 208234, true }, - { 208244, true }, - { 208253, true }, - { 208263, true }, + { 208011, true }, + { 208030, true }, + { 208041, true }, + { 208051, true }, + { 208061, true }, + { 208072, true }, + { 208080, true }, + { 208094, true }, + { 208106, true }, + { 208120, true }, + { 208129, true }, + { 208143, true }, + { 208151, true }, + { 208164, true }, + { 208178, true }, + { 208199, true }, + { 208209, true }, + { 208216, true }, + { 208227, true }, + { 208237, true }, + { 208250, true }, + { 208258, true }, + { 208267, true }, + { 208280, false }, + { 208287, true }, + { 208300, true }, + { 208311, true }, + { 208321, true }, + { 208330, true }, + { 208340, true }, }; From 782de6c2db14234c933c351c77991f950870fcb6 Mon Sep 17 00:00:00 2001 From: ffxbld Date: Fri, 25 Nov 2016 06:38:00 -0800 Subject: [PATCH 52/53] No bug, Automated HPKP preload list update from host bld-linux64-spot-576 - a=hpkp-update --- security/manager/ssl/StaticHPKPins.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/security/manager/ssl/StaticHPKPins.h b/security/manager/ssl/StaticHPKPins.h index bf0f47374d52..000d1b4962ca 100644 --- a/security/manager/ssl/StaticHPKPins.h +++ b/security/manager/ssl/StaticHPKPins.h @@ -1165,4 +1165,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = { static const int32_t kUnknownId = -1; -static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1488464530999000); +static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1488551716626000); From 1183dc0b9d88e4d5fbbe405b8a8658fe1f52c24a Mon Sep 17 00:00:00 2001 From: ffxbld Date: Fri, 25 Nov 2016 06:38:03 -0800 Subject: [PATCH 53/53] No bug, Automated blocklist update from host bld-linux64-spot-576 - a=blocklist-update --- browser/app/blocklist.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/app/blocklist.xml b/browser/app/blocklist.xml index e2fdbfb037d4..1cdb9ace2dd6 100644 --- a/browser/app/blocklist.xml +++ b/browser/app/blocklist.xml @@ -1,5 +1,5 @@ - +