diff --git a/Makefile.in b/Makefile.in index f1cd311f80b2..af730e544771 100644 --- a/Makefile.in +++ b/Makefile.in @@ -3,7 +3,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/. -ifndef .PYMAKE ifeq (,$(MAKE_VERSION)) $(error GNU Make is required) endif @@ -11,7 +10,6 @@ make_min_ver := 3.81 ifneq ($(make_min_ver),$(firstword $(sort $(make_min_ver) $(MAKE_VERSION)))) $(error GNU Make $(make_min_ver) or higher is required) endif -endif export TOPLEVEL_BUILD := 1 diff --git a/b2g/app/b2g.js b/b2g/app/b2g.js index 19e999bfa261..d25651c10a02 100644 --- a/b2g/app/b2g.js +++ b/b2g/app/b2g.js @@ -388,9 +388,6 @@ pref("content.ime.strict_policy", true); // $ adb shell start pref("browser.dom.window.dump.enabled", false); -// Turn on the CSP 1.0 parser for Content Security Policy headers -pref("security.csp.speccompliant", true); - // Default Content Security Policy to apply to privileged and certified apps pref("security.apps.privileged.CSP.default", "default-src *; script-src 'self'; object-src 'none'; style-src 'self' 'unsafe-inline'"); // If you change this CSP, make sure to update the fast path in nsCSPService.cpp diff --git a/b2g/gaia/Makefile.in b/b2g/gaia/Makefile.in index 368e83e66d71..68ec5709d4f9 100644 --- a/b2g/gaia/Makefile.in +++ b/b2g/gaia/Makefile.in @@ -4,13 +4,6 @@ GAIA_PATH := gaia/profile -ifdef .PYMAKE -# For use of GNU make in pymake builds. -GAIA_MAKE=$(GMAKE) -else -GAIA_MAKE=$(MAKE) -endif - # This is needed to avoid making run-b2g depend on mozglue WRAP_LDFLAGS := @@ -19,6 +12,6 @@ GENERATED_DIRS += $(DIST)/bin/$(GAIA_PATH) include $(topsrcdir)/config/rules.mk libs:: - +$(GAIA_MAKE) -j1 -C $(GAIADIR) clean - +$(GAIA_MAKE) -j1 -C $(GAIADIR) profile + +$(MAKE) -j1 -C $(GAIADIR) clean + +$(MAKE) -j1 -C $(GAIADIR) profile (cd $(GAIADIR)/profile && tar $(TAR_CREATE_FLAGS) - .) | (cd $(abspath $(DIST))/bin/$(GAIA_PATH) && tar -xf -) diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index 0a7d726e8c26..43dd3ef46cbd 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -1524,9 +1524,6 @@ pref("social.sidebar.unload_timeout_ms", 10000); pref("dom.identity.enabled", false); -// Turn on the CSP 1.0 parser for Content Security Policy headers -pref("security.csp.speccompliant", true); - // Block insecure active content on https pages pref("security.mixed_content.block_active_content", true); diff --git a/browser/base/content/browser-social.js b/browser/base/content/browser-social.js index 78e3688e3710..4388a4ef66be 100644 --- a/browser/base/content/browser-social.js +++ b/browser/base/content/browser-social.js @@ -90,6 +90,7 @@ SocialUI = { if (!this._initialized) { return; } + SocialSidebar.saveWindowState(); Services.obs.removeObserver(this, "social:ambient-notification-changed"); Services.obs.removeObserver(this, "social:profile-changed"); @@ -710,6 +711,11 @@ SocialSidebar = { }, restoreWindowState: function() { + // Window state is used to allow different sidebar providers in each window. + // We also store the provider used in a pref as the default sidebar to + // maintain that state for users who do not restore window state. The + // existence of social.sidebar.provider means the sidebar is open with that + // provider. this._initialized = true; if (!this.canShow) return; @@ -737,13 +743,22 @@ SocialSidebar = { let data = SessionStore.getWindowValue(window, "socialSidebar"); // if this window doesn't have it's own state, use the state from the opener if (!data && window.opener && !window.opener.closed) { - data = SessionStore.getWindowValue(window.opener, "socialSidebar"); + try { + data = SessionStore.getWindowValue(window.opener, "socialSidebar"); + } catch(e) { + // Window is not tracked, which happens on osx if the window is opened + // from the hidden window. That happens when you close the last window + // without quiting firefox, then open a new window. + } } if (data) { data = JSON.parse(data); document.getElementById("social-sidebar-browser").setAttribute("origin", data.origin); if (!data.hidden) this.show(data.origin); + } else if (Services.prefs.prefHasUserValue("social.sidebar.provider")) { + // no window state, use the global state if it is available + this.show(Services.prefs.getCharPref("social.sidebar.provider")); } }, @@ -754,7 +769,18 @@ SocialSidebar = { "hidden": broadcaster.hidden, "origin": sidebarOrigin }; - SessionStore.setWindowValue(window, "socialSidebar", JSON.stringify(data)); + + // Save a global state for users who do not restore state. + if (broadcaster.hidden) + Services.prefs.clearUserPref("social.sidebar.provider"); + else + Services.prefs.setCharPref("social.sidebar.provider", sidebarOrigin); + + try { + SessionStore.setWindowValue(window, "socialSidebar", JSON.stringify(data)); + } catch(e) { + // window not tracked during uninit + } }, setSidebarVisibilityState: function(aEnabled) { diff --git a/browser/base/content/content.js b/browser/base/content/content.js index 052f3fec9ed7..cd1856249ed4 100644 --- a/browser/base/content/content.js +++ b/browser/base/content/content.js @@ -34,22 +34,22 @@ addMessageListener("Browser:HideSessionRestoreButton", function (message) { } }); +addEventListener("DOMFormHasPassword", function(event) { + InsecurePasswordUtils.checkForInsecurePasswords(event.target); + LoginManagerContent.onFormPassword(event); +}); +addEventListener("DOMAutoComplete", function(event) { + LoginManagerContent.onUsernameInput(event); +}); +addEventListener("blur", function(event) { + LoginManagerContent.onUsernameInput(event); +}); + if (Services.appinfo.processType == Services.appinfo.PROCESS_TYPE_CONTENT) { addEventListener("contextmenu", function (event) { sendAsyncMessage("contextmenu", {}, { event: event }); }, false); } else { - addEventListener("DOMFormHasPassword", function(event) { - InsecurePasswordUtils.checkForInsecurePasswords(event.target); - LoginManagerContent.onFormPassword(event); - }); - addEventListener("DOMAutoComplete", function(event) { - LoginManagerContent.onUsernameInput(event); - }); - addEventListener("blur", function(event) { - LoginManagerContent.onUsernameInput(event); - }); - addEventListener("mozUITour", function(event) { if (!Services.prefs.getBoolPref("browser.uitour.enabled")) return; diff --git a/browser/base/content/test/general/browser_urlbar_search_healthreport.js b/browser/base/content/test/general/browser_urlbar_search_healthreport.js index 785ecbe24bd2..cc5d2451a8fc 100644 --- a/browser/base/content/test/general/browser_urlbar_search_healthreport.js +++ b/browser/base/content/test/general/browser_urlbar_search_healthreport.js @@ -3,15 +3,13 @@ "use strict"; -function test() { - waitForExplicitFinish(); +add_task(function* test_healthreport_search_recording() { try { let cm = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager); cm.getCategoryEntry("healthreport-js-provider-default", "SearchesProvider"); } catch (ex) { // Health Report disabled, or no SearchesProvider. ok(true, "Firefox Health Report is not enabled."); - finish(); return; } @@ -20,72 +18,63 @@ function test() { .wrappedJSObject .healthReporter; ok(reporter, "Health Reporter available."); - reporter.onInit().then(function onInit() { - let provider = reporter.getProvider("org.mozilla.searches"); - ok(provider, "Searches provider is available."); - let m = provider.getMeasurement("counts", 3); + yield reporter.onInit(); + let provider = reporter.getProvider("org.mozilla.searches"); + ok(provider, "Searches provider is available."); + let m = provider.getMeasurement("counts", 3); - m.getValues().then(function onData(data) { - let now = new Date(); - let oldCount = 0; + let data = yield m.getValues(); + let now = new Date(); + let oldCount = 0; - // This will to be need changed if default search engine is not Google. - let field = "google.urlbar"; + // This will to be need changed if default search engine is not Google. + let field = "google.urlbar"; - if (data.days.hasDay(now)) { - let day = data.days.getDay(now); - if (day.has(field)) { - oldCount = day.get(field); - } - } + if (data.days.hasDay(now)) { + let day = data.days.getDay(now); + if (day.has(field)) { + oldCount = day.get(field); + } + } - let tab = gBrowser.addTab(); - gBrowser.selectedTab = tab; + let tab = gBrowser.addTab(); + gBrowser.selectedTab = tab; - let searchStr = "firefox health report"; - let expectedURL = Services.search.currentEngine. - getSubmission(searchStr, "", "keyword").uri.spec; + let searchStr = "firefox health report"; + let expectedURL = Services.search.currentEngine. + getSubmission(searchStr, "", "keyword").uri.spec; - // Expect the search URL to load but stop it as soon as it starts. - let loadPromise = waitForDocLoadAndStopIt(expectedURL); + // Expect the search URL to load but stop it as soon as it starts. + let docLoadPromise = waitForDocLoadAndStopIt(expectedURL); - // Meanwhile, poll for the new measurement. - let count = 0; - let measurementDeferred = Promise.defer(); - function getNewMeasurement() { - if (count++ >= 10) { - ok(false, "Timed out waiting for new measurement"); - measurementDeferred.resolve(); - return; - } - m.getValues().then(function onData(data) { - if (data.days.hasDay(now)) { - let day = data.days.getDay(now); - if (day.has(field)) { - let newCount = day.get(field); - if (newCount > oldCount) { - is(newCount, oldCount + 1, - "Exactly one search has been recorded."); - measurementDeferred.resolve(); - return; - } - } - } - executeSoon(getNewMeasurement); - }); - } - executeSoon(getNewMeasurement); + // Trigger the search. + gURLBar.value = searchStr; + gURLBar.handleCommand(); - // Trigger the search. - gURLBar.value = searchStr; - gURLBar.handleCommand(); + yield docLoadPromise; - // Wait for the page load and new measurement. - Promise.all([loadPromise, measurementDeferred.promise]).then(() => { - gBrowser.removeTab(tab); - finish(); - }); - }); - }); -} + data = yield m.getValues(); + ok(data.days.hasDay(now), "We have a search measurement for today."); + let day = data.days.getDay(now); + ok(day.has(field), "Have a search count for the urlbar."); + let newCount = day.get(field); + is(newCount, oldCount + 1, "We recorded one new search."); + // We should record the default search engine if Telemetry is enabled. + let oldTelemetry = Services.prefs.getBoolPref("toolkit.telemetry.enabled"); + Services.prefs.setBoolPref("toolkit.telemetry.enabled", true); + + m = provider.getMeasurement("engines", 1); + yield provider.collectDailyData(); + data = yield m.getValues(); + + ok(data.days.hasDay(now), "Have engines data when Telemetry is enabled."); + day = data.days.getDay(now); + ok(day.has("default"), "We have default engine data."); + is(day.get("default"), "google", "The default engine is reported properly."); + + // Restore. + Services.prefs.setBoolPref("toolkit.telemetry.enabled", oldTelemetry); + + gBrowser.removeTab(tab); +}); diff --git a/browser/base/content/test/social/browser_social_window.js b/browser/base/content/test/social/browser_social_window.js index e93069ebc5c6..1978a6a906d0 100644 --- a/browser/base/content/test/social/browser_social_window.js +++ b/browser/base/content/test/social/browser_social_window.js @@ -30,17 +30,20 @@ function openWindowAndWaitForInit(parentWin, callback) { }, topic, false); } +function closeWindow(w, cb) { + waitForNotification("domwindowclosed", cb); + w.close(); +} + function closeOneWindow(cb) { let w = createdWindows.pop(); - if (!w) { + if (!w || w.closed) { cb(); return; } - waitForCondition(function() w.closed, - function() { - info("window closed, " + createdWindows.length + " windows left"); - closeOneWindow(cb); - }, "window did not close"); + closeWindow(w, function() { + closeOneWindow(cb); + }); w.close(); } @@ -126,6 +129,51 @@ let tests = { }, cbnext); }, + testGlobalState: function(cbnext) { + setManifestPref("social.manifest.test", manifest); + ok(!SocialSidebar.opened, "sidebar is closed initially"); + ok(!Services.prefs.prefHasUserValue("social.sidebar.provider"), "global state unset"); + // mimick no session state in opener so we exercise the global state via pref + SessionStore.deleteWindowValue(window, "socialSidebar"); + ok(!SessionStore.getWindowValue(window, "socialSidebar"), "window state unset"); + SocialService.addProvider(manifest, function() { + openWindowAndWaitForInit(window, function(w1) { + w1.SocialSidebar.show(); + waitForCondition(function() w1.SocialSidebar.opened, + function() { + ok(Services.prefs.prefHasUserValue("social.sidebar.provider"), "global state set"); + ok(!SocialSidebar.opened, "1. main sidebar is still closed"); + ok(w1.SocialSidebar.opened, "1. window sidebar is open"); + closeWindow(w1, function() { + // this time, the global state should cause the sidebar to be opened + // in the new window + openWindowAndWaitForInit(window, function(w1) { + ok(!SocialSidebar.opened, "2. main sidebar is still closed"); + ok(w1.SocialSidebar.opened, "2. window sidebar is open"); + w1.SocialSidebar.hide(); + ok(!w1.SocialSidebar.opened, "2. window sidebar is closed"); + ok(!Services.prefs.prefHasUserValue("social.sidebar.provider"), "2. global state unset"); + // global state should now be no sidebar gets opened on new window + closeWindow(w1, function() { + ok(!Services.prefs.prefHasUserValue("social.sidebar.provider"), "3. global state unset"); + ok(!SocialSidebar.opened, "3. main sidebar is still closed"); + openWindowAndWaitForInit(window, function(w1) { + ok(!Services.prefs.prefHasUserValue("social.sidebar.provider"), "4. global state unset"); + ok(!SocialSidebar.opened, "4. main sidebar is still closed"); + ok(!w1.SocialSidebar.opened, "4. window sidebar is closed"); + SocialService.removeProvider(manifest.origin, function() { + Services.prefs.clearUserPref("social.manifest.test"); + cbnext(); + }); + }); + }); + }); + }); + }); + }); + }); + }, + // Check per window sidebar functionality, including migration from using // prefs to using session state, and state inheritance of windows (new windows // inherit state from the opener). diff --git a/browser/components/nsBrowserGlue.js b/browser/components/nsBrowserGlue.js index da9fcad6ab8f..1ee1125b443b 100644 --- a/browser/components/nsBrowserGlue.js +++ b/browser/components/nsBrowserGlue.js @@ -93,6 +93,9 @@ XPCOMUtils.defineLazyModuleGetter(this, "BrowserUITelemetry", XPCOMUtils.defineLazyModuleGetter(this, "AsyncShutdown", "resource://gre/modules/AsyncShutdown.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "LoginManagerParent", + "resource://gre/modules/LoginManagerParent.jsm"); + #ifdef NIGHTLY_BUILD XPCOMUtils.defineLazyModuleGetter(this, "SignInToWebsiteUX", "resource:///modules/SignInToWebsite.jsm"); @@ -507,6 +510,8 @@ BrowserGlue.prototype = { RemotePrompt.init(); } + LoginManagerParent.init(); + Services.obs.notifyObservers(null, "browser-ui-startup-complete", ""); }, diff --git a/browser/devtools/webconsole/test/browser.ini b/browser/devtools/webconsole/test/browser.ini index 6e5aadb5b8aa..b5a4a1c5084a 100644 --- a/browser/devtools/webconsole/test/browser.ini +++ b/browser/devtools/webconsole/test/browser.ini @@ -53,8 +53,6 @@ support-files = test-bug-782653-css-errors-1.css test-bug-782653-css-errors-2.css test-bug-782653-css-errors.html - test-bug-821877-csperrors.html - test-bug-821877-csperrors.html^headers^ test-bug-837351-security-errors.html test-bug-846918-hsts-invalid-headers.html test-bug-846918-hsts-invalid-headers.html^headers^ @@ -100,8 +98,6 @@ support-files = test-repeated-messages.html test-result-format-as-string.html test-webconsole-error-observer.html - test_bug_770099_bad_policy_uri.html - test_bug_770099_bad_policy_uri.html^headers^ test_bug_770099_violation.html test_bug_770099_violation.html^headers^ test-autocomplete-in-stackframe.html @@ -230,13 +226,11 @@ run-if = os == "win" [browser_webconsole_bug_762593_insecure_passwords_web_console_warning.js] [browser_webconsole_bug_764572_output_open_url.js] [browser_webconsole_bug_766001_JS_Console_in_Debugger.js] -[browser_webconsole_bug_770099_bad_policyuri.js] [browser_webconsole_bug_770099_violation.js] [browser_webconsole_bug_782653_CSS_links_in_Style_Editor.js] [browser_webconsole_bug_804845_ctrl_key_nav.js] run-if = os == "mac" [browser_webconsole_bug_817834_add_edited_input_to_history.js] -[browser_webconsole_bug_821877_csp_errors.js] [browser_webconsole_bug_837351_securityerrors.js] [browser_webconsole_bug_846918_hsts_invalid-headers.js] [browser_webconsole_bug_915141_toggle_response_logging_with_keyboard.js] diff --git a/browser/devtools/webconsole/test/browser_webconsole_bug_1010953_cspro.js b/browser/devtools/webconsole/test/browser_webconsole_bug_1010953_cspro.js index 9b23e67ced9f..ddb09510a3de 100644 --- a/browser/devtools/webconsole/test/browser_webconsole_bug_1010953_cspro.js +++ b/browser/devtools/webconsole/test/browser_webconsole_bug_1010953_cspro.js @@ -15,8 +15,8 @@ The expected console messages in the constants CSP_VIOLATION_MSG and CSP_REPORT_ */ const TEST_VIOLATION = "http://example.com/browser/browser/devtools/webconsole/test/test_bug_1010953_cspro.html"; -const CSP_VIOLATION_MSG = 'Content Security Policy: The page\'s settings blocked the loading of a resource at http://some.example.com/test.png ("img-src http://example.com:80").'; -const CSP_REPORT_MSG = 'Content Security Policy: The page\'s settings observed the loading of a resource at http://some.example.com/test_bug_1010953_cspro.js ("script-src http://example.com:80"). A CSP report is being sent.'; +const CSP_VIOLATION_MSG = 'Content Security Policy: The page\'s settings blocked the loading of a resource at http://some.example.com/test.png ("img-src http://example.com").'; +const CSP_REPORT_MSG = 'Content Security Policy: The page\'s settings observed the loading of a resource at http://some.example.com/test_bug_1010953_cspro.js ("script-src http://example.com"). A CSP report is being sent.'; let hud = undefined; diff --git a/browser/devtools/webconsole/test/browser_webconsole_bug_770099_bad_policyuri.js b/browser/devtools/webconsole/test/browser_webconsole_bug_770099_bad_policyuri.js deleted file mode 100644 index de80168df0ab..000000000000 --- a/browser/devtools/webconsole/test/browser_webconsole_bug_770099_bad_policyuri.js +++ /dev/null @@ -1,40 +0,0 @@ -/* vim:set ts=2 sw=2 sts=2 et: */ -/* ***** BEGIN LICENSE BLOCK ***** - * Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ - * - * ***** END LICENSE BLOCK ***** */ - -// Tests that the Web Console CSP messages are displayed - -const TEST_BAD_POLICY_URI = "https://example.com/browser/browser/devtools/webconsole/test/test_bug_770099_bad_policy_uri.html"; - -let hud = undefined; - -function test() { - addTab("data:text/html;charset=utf8,Web Console CSP bad policy URI test"); - browser.addEventListener("load", function _onLoad() { - browser.removeEventListener("load", _onLoad, true); - openConsole(null, loadDocument); - }, true); -} - -function loadDocument(theHud) { - hud = theHud; - hud.jsterm.clearOutput(); - browser.addEventListener("load", onLoad, true); - content.location = TEST_BAD_POLICY_URI; -} - -function onLoad(aEvent) { - browser.removeEventListener("load", onLoad, true); - - waitForMessages({ - webconsole: hud, - messages: [{ - text: "can't fetch policy", - category: CATEGORY_SECURITY, - severity: SEVERITY_ERROR, - }], - }).then(finishTest); -} diff --git a/browser/devtools/webconsole/test/browser_webconsole_bug_770099_violation.js b/browser/devtools/webconsole/test/browser_webconsole_bug_770099_violation.js index a463d1d95897..79dde9c4e402 100644 --- a/browser/devtools/webconsole/test/browser_webconsole_bug_770099_violation.js +++ b/browser/devtools/webconsole/test/browser_webconsole_bug_770099_violation.js @@ -8,7 +8,7 @@ // Tests that the Web Console CSP messages are displayed const TEST_VIOLATION = "https://example.com/browser/browser/devtools/webconsole/test/test_bug_770099_violation.html"; -const CSP_VIOLATION_MSG = 'Content Security Policy: The page\'s settings blocked the loading of a resource at http://some.example.com/test.png ("default-src https://example.com:443").' +const CSP_VIOLATION_MSG = 'Content Security Policy: The page\'s settings blocked the loading of a resource at http://some.example.com/test.png ("default-src https://example.com").' let hud = undefined; diff --git a/browser/devtools/webconsole/test/browser_webconsole_bug_821877_csp_errors.js b/browser/devtools/webconsole/test/browser_webconsole_bug_821877_csp_errors.js deleted file mode 100644 index dae8f4d8b42c..000000000000 --- a/browser/devtools/webconsole/test/browser_webconsole_bug_821877_csp_errors.js +++ /dev/null @@ -1,28 +0,0 @@ -// Tests that CSP errors from nsDocument::InitCSP are logged to the Web Console - -/* Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ */ - -const TEST_URI = "https://example.com/browser/browser/devtools/webconsole/test/test-bug-821877-csperrors.html"; -const CSP_DEPRECATED_HEADER_MSG = "The X-Content-Security-Policy and X-Content-Security-Report-Only headers will be deprecated in the future. Please use the Content-Security-Policy and Content-Security-Report-Only headers with CSP spec compliant syntax instead."; - -function test() -{ - addTab(TEST_URI); - browser.addEventListener("load", function onLoad(aEvent) { - browser.removeEventListener(aEvent.type, onLoad, true); - openConsole(null, function testCSPErrorLogged (hud) { - waitForMessages({ - webconsole: hud, - messages: [ - { - name: "Deprecated CSP header error displayed successfully", - text: CSP_DEPRECATED_HEADER_MSG, - category: CATEGORY_SECURITY, - severity: SEVERITY_WARNING - }, - ], - }).then(finishTest); - }); - }, true); -} diff --git a/browser/devtools/webconsole/test/test-bug-821877-csperrors.html b/browser/devtools/webconsole/test/test-bug-821877-csperrors.html deleted file mode 100644 index 25d9da1c0905..000000000000 --- a/browser/devtools/webconsole/test/test-bug-821877-csperrors.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Bug 821877 - Log CSP Errors to Web Console - - - -

This page is served with a deprecated CSP header.

- - diff --git a/browser/devtools/webconsole/test/test-bug-821877-csperrors.html^headers^ b/browser/devtools/webconsole/test/test-bug-821877-csperrors.html^headers^ deleted file mode 100644 index 426d8738c602..000000000000 --- a/browser/devtools/webconsole/test/test-bug-821877-csperrors.html^headers^ +++ /dev/null @@ -1 +0,0 @@ -X-Content-Security-Policy: default-src *; options inline-script diff --git a/browser/devtools/webconsole/test/test_bug_770099_bad_policy_uri.html b/browser/devtools/webconsole/test/test_bug_770099_bad_policy_uri.html deleted file mode 100644 index eb0c52c3acb2..000000000000 --- a/browser/devtools/webconsole/test/test_bug_770099_bad_policy_uri.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Test for Bug 770099 - bad policy-uri - - - -Mozilla Bug 770099 - - diff --git a/browser/devtools/webconsole/test/test_bug_770099_bad_policy_uri.html^headers^ b/browser/devtools/webconsole/test/test_bug_770099_bad_policy_uri.html^headers^ deleted file mode 100644 index b64692028c62..000000000000 --- a/browser/devtools/webconsole/test/test_bug_770099_bad_policy_uri.html^headers^ +++ /dev/null @@ -1,2 +0,0 @@ -X-Content-Security-Policy: policy-uri http://example.com/some_policy -Content-type: text/html; charset=utf-8 diff --git a/browser/devtools/webconsole/test/test_bug_770099_violation.html^headers^ b/browser/devtools/webconsole/test/test_bug_770099_violation.html^headers^ index 5374efd3e17b..4c6fa3c26a77 100644 --- a/browser/devtools/webconsole/test/test_bug_770099_violation.html^headers^ +++ b/browser/devtools/webconsole/test/test_bug_770099_violation.html^headers^ @@ -1 +1 @@ -X-Content-Security-Policy: default-src 'self' +Content-Security-Policy: default-src 'self' diff --git a/browser/experiments/Experiments.jsm b/browser/experiments/Experiments.jsm index 8a8afac6f410..288814df1ea1 100644 --- a/browser/experiments/Experiments.jsm +++ b/browser/experiments/Experiments.jsm @@ -597,6 +597,7 @@ Experiments.Experiments.prototype = { active: experiment.enabled, endDate: experiment.endDate.getTime(), detailURL: experiment._homepageURL, + branch: experiment.branch, }); } @@ -628,6 +629,54 @@ Experiments.Experiments.prototype = { return info; }, + /** + * Experiment "branch" support. If an experiment has multiple branches, it + * can record the branch with the experiment system and it will + * automatically be included in data reporting (FHR/telemetry payloads). + */ + + /** + * Set the experiment branch for the specified experiment ID. + * @returns Promise<> + */ + setExperimentBranch: Task.async(function*(id, branchstr) { + yield this._loadTask; + let e = this._experiments.get(id); + if (!e) { + throw new Error("Experiment not found"); + } + e.branch = String(branchstr); + this._dirty = true; + Services.obs.notifyObservers(null, EXPERIMENTS_CHANGED_TOPIC, null); + yield this._run(); + }), + /** + * Get the branch of the specified experiment. If the experiment is unknown, + * throws an error. + * + * @param id The ID of the experiment. Pass null for the currently running + * experiment. + * @returns Promise + * @throws Error if the specified experiment ID is unknown, or if there is no + * current experiment. + */ + getExperimentBranch: Task.async(function*(id=null) { + yield this._loadTask; + let e; + if (id) { + e = this._experiments.get(id); + if (!e) { + throw new Error("Experiment not found"); + } + } else { + e = this._getActiveExperiment(); + if (e === null) { + throw new Error("No active experiment"); + } + } + return e.branch; + }), + /** * Determine whether another date has the same UTC day as now(). */ @@ -1013,6 +1062,17 @@ Experiments.Experiments.prototype = { return e.id; }, + getActiveExperimentBranch: function() { + if (!this._experiments) { + return null; + } + let e = this._getActiveExperiment(); + if (!e) { + return null; + } + return e.branch; + }, + _getActiveExperiment: function () { let enabled = [experiment for ([,experiment] of this._experiments) if (experiment._enabled)]; @@ -1258,6 +1318,8 @@ Experiments.ExperimentEntry = function (policy) { this._lastChangedDate = null; // Has this experiment failed to activate before? this._failedStart = false; + // The experiment branch + this._branch = null; // We grab these from the addon after download. this._name = null; @@ -1306,6 +1368,7 @@ Experiments.ExperimentEntry.prototype = { "_addonId", "_startDate", "_endDate", + "_branch", ]), DATE_KEYS: new Set([ @@ -1313,6 +1376,10 @@ Experiments.ExperimentEntry.prototype = { "_endDate", ]), + UPGRADE_KEYS: new Map([ + ["_branch", null], + ]), + ADDON_CHANGE_NONE: 0, ADDON_CHANGE_INSTALL: 1, ADDON_CHANGE_UNINSTALL: 2, @@ -1344,6 +1411,14 @@ Experiments.ExperimentEntry.prototype = { return this._manifestData.id; }, + get branch() { + return this._branch; + }, + + set branch(v) { + this._branch = v; + }, + get startDate() { return this._startDate; }, @@ -1376,6 +1451,12 @@ Experiments.ExperimentEntry.prototype = { * @return boolean Whether initialization succeeded. */ initFromCacheData: function (data) { + for (let [key, dval] of this.UPGRADE_KEYS) { + if (!(key in data)) { + data.set(key, dval); + } + } + for (let key of this.SERIALIZE_KEYS) { if (!(key in data) && !this.DATE_KEYS.has(key)) { this._log.error("initFromCacheData() - missing required key " + key); @@ -1970,6 +2051,9 @@ let stripDateToMidnight = function (d) { function ExperimentsLastActiveMeasurement1() { Metrics.Measurement.call(this); } +function ExperimentsLastActiveMeasurement2() { + Metrics.Measurement.call(this); +} const FIELD_DAILY_LAST_TEXT = {type: Metrics.Storage.FIELD_DAILY_LAST_TEXT}; @@ -1983,6 +2067,17 @@ ExperimentsLastActiveMeasurement1.prototype = Object.freeze({ lastActive: FIELD_DAILY_LAST_TEXT, } }); +ExperimentsLastActiveMeasurement2.prototype = Object.freeze({ + __proto__: Metrics.Measurement.prototype, + + name: "info", + version: 2, + + fields: { + lastActive: FIELD_DAILY_LAST_TEXT, + lastActiveBranch: FIELD_DAILY_LAST_TEXT, + } +}); this.ExperimentsProvider = function () { Metrics.Provider.call(this); @@ -1997,6 +2092,7 @@ ExperimentsProvider.prototype = Object.freeze({ measurementTypes: [ ExperimentsLastActiveMeasurement1, + ExperimentsLastActiveMeasurement2, ], _OBSERVERS: [ @@ -2040,8 +2136,8 @@ ExperimentsProvider.prototype = Object.freeze({ this._experiments = Experiments.instance(); } - let m = this.getMeasurement(ExperimentsLastActiveMeasurement1.prototype.name, - ExperimentsLastActiveMeasurement1.prototype.version); + let m = this.getMeasurement(ExperimentsLastActiveMeasurement2.prototype.name, + ExperimentsLastActiveMeasurement2.prototype.version); return this.enqueueStorageOperation(() => { return Task.spawn(function* recordTask() { @@ -2055,6 +2151,11 @@ ExperimentsProvider.prototype = Object.freeze({ this._log.info("Recording last active experiment: " + todayActive.id); yield m.setDailyLastText("lastActive", todayActive.id, this._experiments._policy.now()); + let branch = todayActive.branch; + if (branch) { + yield m.setDailyLastText("lastActiveBranch", branch, + this._experiments._policy.now()); + } }.bind(this)); }); }, diff --git a/browser/experiments/test/xpcshell/head.js b/browser/experiments/test/xpcshell/head.js index a45020303ee3..86df15e4fdfc 100644 --- a/browser/experiments/test/xpcshell/head.js +++ b/browser/experiments/test/xpcshell/head.js @@ -76,6 +76,7 @@ const FAKE_EXPERIMENTS_1 = [ description: "experiment 1", active: true, detailUrl: "https://dummy/experiment1", + branch: "foo", }, ]; @@ -87,6 +88,7 @@ const FAKE_EXPERIMENTS_2 = [ active: false, endDate: new Date(2014, 2, 11, 2, 4, 35, 42).getTime(), detailUrl: "https://dummy/experiment2", + branch: null, }, { id: "id1", @@ -95,6 +97,7 @@ const FAKE_EXPERIMENTS_2 = [ active: false, endDate: new Date(2014, 2, 10, 0, 0, 0, 0).getTime(), detailURL: "https://dummy/experiment1", + branch: null, }, ]; diff --git a/browser/experiments/test/xpcshell/test_api.js b/browser/experiments/test/xpcshell/test_api.js index 3a5304ce7837..ab0be9d3a400 100644 --- a/browser/experiments/test/xpcshell/test_api.js +++ b/browser/experiments/test/xpcshell/test_api.js @@ -171,6 +171,14 @@ add_task(function* test_getExperiments() { let addons = yield getExperimentAddons(); Assert.equal(addons.length, 0, "Precondition: No experiment add-ons are installed."); + try { + let b = yield experiments.getExperimentBranch(); + Assert.ok(false, "getExperimentBranch should fail with no experiment"); + } + catch (e) { + Assert.ok(true, "getExperimentBranch correctly threw"); + } + // Trigger update, clock set for experiment 1 to start. now = futureDate(startDate1, 5 * MS_IN_ONE_DAY); @@ -196,6 +204,19 @@ add_task(function* test_getExperiments() { "Property " + k + " should match reference data."); } + let b = yield experiments.getExperimentBranch(); + Assert.strictEqual(b, null, "getExperimentBranch should return null by default"); + + b = yield experiments.getExperimentBranch(EXPERIMENT1_ID); + Assert.strictEqual(b, null, "getExperimentsBranch should return null (with id)"); + + yield experiments.setExperimentBranch(EXPERIMENT1_ID, "foo"); + b = yield experiments.getExperimentBranch(); + Assert.strictEqual(b, "foo", "getExperimentsBranch should return the set value"); + + Assert.equal(observerFireCount, ++expectedObserverFireCount, + "Experiments observer should have been called."); + Assert.equal(gTimerScheduleOffset, 10 * MS_IN_ONE_DAY, "Experiment re-evaluation should have been scheduled correctly."); diff --git a/browser/experiments/test/xpcshell/test_cache.js b/browser/experiments/test/xpcshell/test_cache.js index cba484bf1953..2de87ba993b3 100644 --- a/browser/experiments/test/xpcshell/test_cache.js +++ b/browser/experiments/test/xpcshell/test_cache.js @@ -190,6 +190,13 @@ add_task(function* test_cache() { checkExperimentListsEqual(experimentListData.slice(1), list); checkExperimentSerializations(experiments._experiments.values()); + let branch = yield experiments.getExperimentBranch(EXPERIMENT1_ID); + Assert.strictEqual(branch, null); + + yield experiments.setExperimentBranch(EXPERIMENT1_ID, "testbranch"); + branch = yield experiments.getExperimentBranch(EXPERIMENT1_ID); + Assert.strictEqual(branch, "testbranch"); + // Re-init, clock set for experiment 1 to stop. now = futureDate(now, 20 * MS_IN_ONE_DAY); @@ -207,6 +214,9 @@ add_task(function* test_cache() { checkExperimentListsEqual(experimentListData.slice(1), list); checkExperimentSerializations(experiments._experiments.values()); + branch = yield experiments.getExperimentBranch(EXPERIMENT1_ID); + Assert.strictEqual(branch, "testbranch"); + // Re-init, clock set for experiment 2 to start. now = futureDate(startDates[1], 20 * MS_IN_ONE_DAY); diff --git a/browser/experiments/test/xpcshell/test_healthreport.js b/browser/experiments/test/xpcshell/test_healthreport.js index 965348af9b54..f4e9bcbd2f85 100644 --- a/browser/experiments/test/xpcshell/test_healthreport.js +++ b/browser/experiments/test/xpcshell/test_healthreport.js @@ -9,6 +9,8 @@ Cu.import("resource:///modules/experiments/Experiments.jsm"); Cu.import("resource://testing-common/services/healthreport/utils.jsm"); Cu.import("resource://testing-common/services-common/logging.js"); +const kMeasurementVersion = 2; + function getStorageAndProvider(name) { return Task.spawn(function* get() { let storage = yield Metrics.Storage(name); @@ -53,7 +55,7 @@ add_task(function* test_collect() { // Initial state should not report anything. yield provider.collectDailyData(); - let m = provider.getMeasurement("info", 1); + let m = provider.getMeasurement("info", kMeasurementVersion); let values = yield m.getValues(); Assert.equal(values.days.size, 0, "Have no data if no experiments known."); @@ -69,6 +71,8 @@ add_task(function* test_collect() { let day = values.days.getDay(now); Assert.ok(day.has("lastActive"), "Has lastActive field."); Assert.equal(day.get("lastActive"), "id2", "Last active ID is sane."); + Assert.strictEqual(day.get("lastActiveBranch"), undefined, + "no branch should be set yet"); // Making an experiment active replaces the lastActive value. replaceExperiments(provider._experiments, FAKE_EXPERIMENTS_1); @@ -76,6 +80,8 @@ add_task(function* test_collect() { values = yield m.getValues(); day = values.days.getDay(now); Assert.equal(day.get("lastActive"), "id1", "Last active ID is the active experiment."); + Assert.equal(day.get("lastActiveBranch"), "foo", + "Experiment branch should be visible"); // And make sure the observer works. replaceExperiments(provider._experiments, FAKE_EXPERIMENTS_2); diff --git a/browser/locales/en-US/searchplugins/eBay.xml b/browser/locales/en-US/searchplugins/eBay.xml index c6eb7734e2bc..d26245928538 100644 --- a/browser/locales/en-US/searchplugins/eBay.xml +++ b/browser/locales/en-US/searchplugins/eBay.xml @@ -7,6 +7,8 @@ eBay - Online auctions ISO-8859-1 data:image/x-icon;base64,AAABAAIAEBAAAAAAAAB6AQAAJgAAACAgAAAAAAAAQgMAAKABAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAFBSURBVDjLtZPdK0MBGIf3J5Babhx3rinFBWuipaUskX9DYvkopqgV90q5UJpyp0OKrUWM2VrRsS9D0zZKHGaOnW1nj4vtypVtPPe/533r9746QAAOAJXfo5Yzgg44pHrcugon/6Sgo0b+XuAOZ2iZiVQmyPoDpIwmUkYTzqM7GsdDdC7F6Lbf8pzOkfWOouzqeZem2b+2AqAV8zjD8yVBqqcf2b7C66yNiMGMfixIQSvi8Mp0LEbR5ADq1QSKWM+Gx0RC9nOZ2GLzwlIWdPWiuNzk4w/EpThNkyEAXKEP2ud8KGId2sspilhPMrmNwzfCuqePr/xbSfC5I/I0MMSj2YJ3z49gDdO2cEOrLUowJpE9G0QRG1ClKbR0EIdvmOPYcnUtnN+vsnZiQC1k/qnGagQ1n3LNzySUJZVskitnmr8BlQG7T2hvgxsAAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAIAAAACAIBgAAAHN6evQAAAMJSURBVFjD7ZddSFNhGMeHXXQTZFFCWfR1pRhUECQlBdWVToo+6KYu1KigtDASG5qUfZgFZvahEDosECPDktKZS1FL+1DRnEvdUptjug91X2dnZzv/3vO6OZbWnR4v9sADL+fs7P97/s/znu2VAJD4UkpSSdKG+QubTyPBr+sXz8XCR64fIAHihVTis0SsUAoAVhEBrBKIHCGAEMB/ARi3F5LkbpS2WMRzYEEBXC2tsD6T03R9agsCGLNyqPw6CXmrBT06JvhbPHZwmkdwtR0B138PPKOHgzXD5jLAy3tmibo4K9weZwDAazJj/FQKRnfugfHMeRiTz0K3Ixam1HQKcPC+Fisu9NK1P08Uj4DleHgMdXC+WQ7nu3UEOhFMfTQcVUvQ1H4IN2sj8H2k7K+2TqCc3GseyA8AmDOzMBq7D9bS8sAr6nEJdNt3UbHVF1XQGtmZew8bTPT6tWoD3KpsUvlR8NxUoEICMvl6KQo+xqCwcRs4T8Ax5c8bFExjbAgAjO7aS8VsLypgq3g5nWStjztAhWRVhqAqeB6IuKTClkw1eNYEbrCQQBwD8yGGOsAooogLYejQPKBi7UPF9DkH+ezd+o141ZkUPAOC+L9SAMivNc7q46YMNSLTe4n1kaQF4XD3ZIDTPgU3XEYciKcAHrsGJS1xKFBGgyVzouiT4VbdGhjt/cEA5isyKsaz7jl3we7bg7Rqf6j0LoSldON4wWcqJDgQNGTN++l13vELA+MK6kKd6iryFOvxtidt9i5gO7owdjKJQliflNAU1pas6xQgnAzg1ux+lJEdILixNr0Pq9JUUA8NwVG9DM73G0jlcnh+V4BpjIWzJmIGQIjnXw5TiDuKSEwxurm3ITc8DNO51BnrLbIcsrW0dNA6RxgUKU1UdGVqLy5X6qGzTLvlnewiBZyGs3Yz6X8UeaYI3olvZDhzwLumZ+eHvooCCC0Q5VUsb4unwycM4YIDqA01tPqmgbzQr2EIYPECiPm33LYoDiZSsY9moh9O/Znoa4d9HkXtPg2pX/cPKCoRQ+ocZa4AAAAASUVORK5CYII= +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAAAaCAYAAADovjFxAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQ0MDYxRTZDQjUyNTExRTNCNzdEOTU4N0NCMjI3MEFDIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjQ0MDYxRTZEQjUyNTExRTNCNzdEOTU4N0NCMjI3MEFDIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NDQwNjFFNkFCNTI1MTFFM0I3N0Q5NTg3Q0IyMjcwQUMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NDQwNjFFNkJCNTI1MTFFM0I3N0Q5NTg3Q0IyMjcwQUMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7+A48PAAAMr0lEQVR42txYaZBV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 +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAAA0CAYAAABGkOCVAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE4OUIxMDhEQjUyNjExRTNCNzdEOTU4N0NCMjI3MEFDIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE4OUIxMDhFQjUyNjExRTNCNzdEOTU4N0NCMjI3MEFDIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTg5QjEwOEJCNTI2MTFFM0I3N0Q5NTg3Q0IyMjcwQUMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTg5QjEwOENCNTI2MTFFM0I3N0Q5NTg3Q0IyMjcwQUMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7A0O4yAAAeb0lEQVR42uxdCZRdVZU9977pz5WqpJLKHEISCggJWVFApEEN0IigIipCt0MzLFtFUFyyGAKIQoMDLYICIkIrihERZJIpEkRYzBLClEBSCQlJJWSo4Y9vuPf2Ofe9X/XHqkoIAmvVy3r1/3/jHc7ZZ5/hvbCVMA7KiwIOFpTwrwCJvy38K4HhdgE8EQcIBB0ESkjgY1tBFvMAuSwewUFaNtgxB9pzO+DrB58Hvz70+wDbVtLBeCUGQyyT8aDbo4NUxXYD11/i+isY8YI9YAwMzkAohRdkYBrYfilByHCfL1V4q0CGtwsSADyAp444Bg5oXws9xfDGFv6VZgr39+sRACMZ9oL6Iz1QRgw/A/zt6+swFTZecRMYM0Apqe8f9grvjb9jjMMNTMKzOJ5jh+gFU/COLKrJNHDssLk7b+ThIPRZcbjh8UthY2Yy3L/gawCbnw/v1FwYcLThgCb75o7szrUyNLrs7MJ368VQ8rNmDDyTw+8fOgumrHkYYOxs1Bwx1Gn+EPt6hgEArf0GD7VudHmPCAItJkLg+tR4aAtKcNtf/hNhogCQHI8TJXczzqEQIOwT2IyKwHtQEGixEAHW2hk40O2G8x78DkAL0gBu7lYh0CSCs6HZx+jy7gpC+dKbkIJc+urv4LCnrwMYv29IrnaDECDngrjDq4RidHmPCgIx7az2OwBuWHY+xLatAkhP3C0mwkKTYJBJGOUF7wdEIJdEwRpIwCx/B1x2/1khV+D8baJB6B5KOTp57xtBKAcD3sK/Z77xV5j16l3oRczZNRNBQoCEwDJHHYT3pSAQmcuCoz+vXrYYoNQH4KR36UIGG40YvDcEgVQxCNDMu6B8H5SLn4C/wcPfJVAefno+gBB1JmItxOCo3pfh8BW3ICrM2jlUiNCArEolGpBQMNZY+N75he3ivvfmMgKfTuI84IQXmR51HnP2NKz0dJ7JTOKpRFoViwly4rhpFZhh9ECx+CaSuC6ZL2ySUMI9lr6NwE8ff1/07C9g6b6fRdrfCuD2j3zQIgFgLBIKRi2D+UzCdBSODtya0WEMBCBJ1ghgLR73T1zlbpt4urEmuwz9YbkH/kD2y7AjkIo6GuAReTyGAmFv4roO92+sxDAv0ic5jDl9JxbZBEopam42l2iBzS/ip815ZtzHzTFjDmfJ5CIWi+3HbDvsDako44OzhAyO4vqICAHvzz7Cs/0PqZ6+O5XXv4rGaT0k4ZD+1XDi0zfAHw6/EGDzCjzfGJkQlOdBwUeFVJ9EYPp0INWMWiXUoCXC9igGGyiPgS28E3cvY29L++Vh2L+jlAoOxR8HgnCNah+p3Fapxy6McKCYAluGX5Zh4+/G7ytsUituHhdjZkqA9KvvwrgCWZTCv+Mdie8Y9ufxHqgsg64b3dOwwGb1SScXtFDjIbGOiRfx9nEns2RqmvbXaKJxBjRlb8bYIgxntoVfOahSCWRf7z3e+o2XBG7/U1Pxyi/a0+GAU5eFglTqm4knrWnS9svwPudpxOHsWGDqAiHhgwOjzmDEQoQI8hxyjEt8qf4y0qSTsjJo8vpOw6NPx03zYKduXBnk0EIBDmP39eK1fm7aEwvOuMfGoXkU1YKghy9feusjvvD/zneThaHpskz7hGRs/BJKhqmK9hlgAx/X+2deLdVMo4AZT3w0ts/c5ebs2d9jqfQ0zQeKRc0JBuw/CgazcLIRHTRCmOagEcdjVBEFoFBArcRJ7Jh4TGz+fk/GJky+cCPe+oPeG3D8C0sA0pOGcwHWMS1Y8CPsy1142Q9WjGs9a1TNzTXC4kJfwh14vV/jpsSwjFMpm4nirXjs9YNCwBoIwVCNqDxeQUnJj49V6qVTRDGhZP4uytsyxGUVrVIFeg5MM3npbiWC2ATHylxFcRdZcT/KcgrlgXD6v1RDFgtgpNtOis2f97DZNma+zOfDyafJorQuTjaPx/ETdcb3pczlukV/32uyv78LBaVPH+OgYMRiAziuhSKX0+Nhd3ZebE6fvSSLdzr/6V8A39EFEMsM1QHT4Ox/8DLf1cEjVjHWZXMRfstp+8xg2GgjXuZkbNtylOO2sv0AhgyGB7Vz+KgSpc81JoCq4iYc3SDAjsBqPAa5CZdDGRhUjfiUQD14Qikrckz1izrtDcA2kh+2DGuRVLuHF5im8x+GERtPglY1vtwEV+Qv9/tVwYwjAhAkSTQHkBp3nL3f3r+XEicvXxicTNR0nkAlKhSUt2nT1TKbe4AFwQqc/C2BLPpkUEwnkQbbnskSiQ+xdOorxvj2A7UpIUHC65A3IRDXnelTTugTvrngzTWfPXrVXXDPQWdyKK1sSP/x1lcESsVqlY0b7HEUxSVxhz3nBWpjqaj67BhL2CbrKLpyruLsaBScLzQDG7SRs8HkK1ggOxXzc2Qecn5S+1A0Fgbjt+BBB4b8p6GIrgDDuQ55wmOMGWuFCnLUV24YDrLpdqaCTiWDRXjgt/BusVq88HA8FwbecS8HJXc5zsAEnHxZcQShoGWl/tcXPfN3h29jmanv1yIvR24WSC/r+dnz/O266xwbESDrj8+w58z8kx6maPL0yaj9zHEg2LjpjtKLL81x31x3pujr/Ssiwpt4qF8hyllZLL0gtm6/zl298iBv5arTwPNKLOaE16HroSDIYgH4jOnHo4U45ZOv3I/bfNUs2ohnxarJDl9jmOxznKtDTAY/Nzk8gZvX40pa2Y0I8jyuN+P2E3EEDsQBfaCRe0kXxqZMZia/k9nEE9qgu9ihR8MEtg8ynBNVI1gh+8qdy5mZmI+7r8UtL+LGXMURNHDoLRhLkYqfKxmfg/C5tBJqqDnlQfs3P+9YUJ+HFygYJo/PQ1T4yNtBBTrXNmMnm0Z8Zi0aEH/z/P4fKakoAgDcRzHw6Nu0mUtQkw3iAgPaSUiAMB+8sf7K0tqVn1G+t5oj82fcaajBZDJYPIadtcHfsfmG/IpVCxSqLItFXgadEqBtQsLpz551wwF9rzC+5dVNYI8owPS4ZbJOtE63lblq7SApVQHaCp7GTh6FN726uZlgH0PF+DbIGKwrTA5JJcAFzfIhyHd+ibb1XEb1FTVooSpdzMGp2CCYOgJ1fDmrEYYSju0ewhULg2Kph1uVfkeEChxsK/Mr9jbRwDRTlzZBg7wfFK9gbIBMF8ByEgvM8a0HynyFEFB5FWpz8ObmBwobu78NJAC6dA1JI3k9VdGcaADIFHgeHuOiwqNABPmV/so1x4VhQT7gVSjXg572KTDf2HrKoasfKUJy3HAdegUF6BAU3mCnRoEEIxBn4J1vZA1ND5InED8EbplbRBvoSICCT6smF8QrXGBI7J8ohC4i9SWi2DrqSeVpwtX7yC3mSMhM4dP2b6oakhlxA76P3/8PJIw9qiZ6QFzBNGKzTMM6ZFdQgc6xzNhpJnc66tAAxd33sufgdBV55OQiwppgTpz8AzBxFHCCypNLHgFCvSyt2/x50CKAR44ZD7Ex6dBbcGw90KYKfWaGEk4xBF3P2I90sLsbr4x4k99yp9zStoxPnPBR8iTKk6R9/XT8v+fn3rjnEcWRoKCkNSSMjBju8XQzzwt0izmZkhGFiUJ8QJfpFGzgJ/DHhPpDUB2dHacu3bzoOpm9msUdeULeBRvvKyt0ncarhHKzVf9CbWVBUddYaGUjpdGWVOp6RjDMyLSysIYR2GO4byvubK+SU8bZNBG81K4KzxZ55lxHulVeBujJTF2JXOEDu+Ip2Fb6J/WhZAM9Bb9YsorXUhRJlMEf3YBW3pb5BI5yNazhRMtt229nake/jfIb32MaOHM7wZo6CYz2scCTSeCpJBiZFuAZZP70O5MGY2wr2HP2BHPuPiCtmJ4v4g11E0dCN6Zl4TQzfyIUcm80JGYh0FyHo7mS3FMSRg1GagTeuy6PE3oKte8s5dcau/+EfN3nrNjwKfja8u8q1gJ3xQy4DdHidl1Uq4AKa2/D9R59OhXYoOwMcKhaR4VVehgs0n7aK1+qvTNNO47crHY/e3G/DHxWE1wjTbbM5ELbsI/eGVQQpOEcPQXuZBqhQcnIXuDH8LA4HhsLV86TsUOZ7YSBokG/Qk+Ut37jTxiy2ti8uWBN6QBVKoLMoQNUinINtOr8gkfupPYMaB96FcBaWsDefyF6G2NAZLc9qtySjj1URzlsaLf8wyAoiUZBGh3PU/KnikWWn4W66QdSDy6vgXsWIYjA/Uq7hUZ4gv5kFK3b3oQrTId016zrXzsbrn/+OBCmHTaVoTZbKZxzKzQNjJUjhjuRJwkQenWlc7Y+eK8Hu3NGIN0Sy/7QYGa976vdv+QlTS2grF5J9qmCzyI0qOE6xA0E+Ntct3CFidaNcLi8Ijl15mko01Hw6OIoCDKfR7TKPGvNnIFuZRwFID8Y6B9J/wsFHU+w9p0LYm3XZlUo9iBitKrKCCQ2bCwUO9ENS4TFh6J2ENbh8a/V9x7dlSA0LzzE5AGh8NEJUYw1zqcp9SD+PbGBIOCc9x6giq2rv/rktfCJifvA5OQOyPs2bk+H7RJ+Cq+5F07fDKYo18AI5sch+MexLwkdjGQRy0AsHMzjhAKEy4JmQ9WJXU+p4uVFlTobRdBWFfBJGo2sf4Fl5Cja+EhVtJGF2lzlDeFHnMVPs3isQyi/xlMwwPX7LlVumMlVVUkny57BajYSOiAPMJy9Zy0ntRiIKewUZWU6vIwOMZgz9wwQEWKqJiuJN4EWVZwEoogEJF5v9xk8wxVr4MiFbSn6MuQL+jkGBDFB4VOp780ahxn/qRoIQigMxp4QtMAp+y2GyWN2gFtANFBqPAT5Y0EGyFHYQYoSTNoc+FEkVtXnGgbyDSMbrwCtXYfgML4g8hudvgsnWmMvF1VVN4MeRCC2z66cdIVdF051lJWA0ApS59e6VBzRJhDFbb6fv9Lk9dNpors3XokGZNxAyQzE3IEYwC75Lyw0GTRZVFEiZM21FE4gi0PTGlS2QSO7apw3pXQBkVMSbzIXlLLhFmsaakZ3ckPjpzxIilonQGotXLL3VaRWUwLJFzPwvoS8Kg6sNqY93HiMfLwIhxN42amIIS8bxSvGS/9iJHSOrMhCVHgQh9XmIJgcbBoRv4RInGpJZ6po8JSA6/d/s5wrrCORSPhSZOsb1h7sjlKgMqmSTQRKllOWjZqg+qR28RqsSsFA2DkiaAo1Swa4igYrbkcT0N/U0BamJU7a42boaM8f5RbYK0wFX8V2xUMSy5p6JLUx7V1SGTxpOkKDUYDA9frOqh+nQQ9iqMsYFIGT6SsUyDo0EMLtEYG3hFc2vWI1FTTwsJUaJHYE5+wdKrTA62ZEAd0T4TW+B6UvR+AwlyFj+GY2DmH6GWDpNc/9YM41E1BF7wsGIGqoC3KKKHZjA7ahicuh4KBriYKLiodnFytJF0I7tfKLKFizml1tCvY/5VDBb+kaC7zzTGZPrmT8oQeR2N9CU+UL725eb2IgIWMnGWBlatGAeuPJ3OnCqOcGgwDrlkrMSWMbK70GPMN1N4Bt34CEj2tbv5uFQRCTL26BLW17ZSDWdiboQEyNhDMYR/ZMNVWk0Er7IkSbEQBYW8OtxYmwaPZNe84ct/U2P9ds+rUP8yAS3Dvx+9Nog1YjzPQqdFMZuZQ6c6g0VwlL6likU1IjGP6eh1tmNTMPk3CdLRm8gJ1Ii+y5lj3utw1Cm8gVUpf4YsfdtdhkKGbEZObHdWhA0RxWWluIl24ZqszPlP3ZrXzcWNA0fIDDoc+ezfYFXV3ft/bYE9iYjPYCdnpRGs/wenYVDaABG+/3wpPjDoaTO88n9Pk2lPMb1bVRewZSNmy8inxi22QaFQxdscS1pWkmtLh5z4Yl8NJSHxnz7ClgQMaTvO50nSZR6hTsz43aO2HQNPVc69AyboXiqgaDSXWAROU/2OxZCL7PmhRfKN1sQnGxzWJzRA0qGDxGOYhFge//rRyMJDaRVOgpgDMpqPD+QrPAwRP5i5QYui4RjQcSqBqGSSYbSeS+Kt/T4r/0fJ/VuQ/wCRNAFoq6ZnFYdKDBpjoFFADI5yDYtAnRP9ATR0taedCDWvShT92KP2bNhK3PoDDEGungQZIKRBqk/IkYqih4Up4KB4VCota4gWii1vzghqzT7GFz4isz0ECGwsysOgP1+sadK/CMPBdGsVtdLzezWQ6jfEtChZiuEUCU8LKn2Vbs79UkVYXCTx5EsH1m2UvgWpASF0gQddzAV24Xgv7NxjCcn6ti4YWB0RzAbYS7RIKxlgmf8fDihZWvgru6Kwwtp1K6+khzCO26RSsVqpimzlSyVBIYFbZ2rQb14ivgvbkWSt0bcH1Drz2bu8HatAEuegjRwN2MM5hpEiFkY/DjkCpA07SXwqdGFbvRwoJcQT8Pycq+e9Vq4zGH1tsoFMDYZlgw5jXZ6HFcFLcevPjPo9BUE90fnKyQv1LmQISBeaQ/ILzpuGfKcIRxCtL+dhlquM+8R11WeKo2yBTGFWJ7kAehI9p4XlzGT7UgNknW1DvRzLt+7+m6Ein0spuupswVllFkkCZxILpIBSb0IEnHhLN537abaACCjSgIuRxt07EBRkEogw/6Irq6mXINAcjeHKhu5FEip+Ms3EhOsByjg8lQtylUnMdGf2/1rf6qZ/eSSz58XgA7Xjcbwr+UFyKcHFl+z4AuWzPMKIdQz+ek9ia5fj+CKifGQmZ8Dv5x6g10GmaMe+XFWZntDgLVnAai8DgLQ07RfAfRIMvqFFIUHjZ0GkSEXk0kgwYzjhuO9BJDasVjJyCqLUeBpsibG+S+YhvxVwkFVKWHotPLqSu9oGcBlcE4KlPvKSDP80Xh9SDw7jNHQO/QNOTfUju2P8inTDlSu5GRlsmSC+bY1k6VaP2kV+i9y4A0yL63QPRtDSc3mdYpZwo2aU5BTaSXZmibTjji4LYEjoMPyc45z/OWlonS9SoqDVATVz/11JS+LcfiTQNoVEgbOr1HYJOOV774MzeREyN7DNQQj7sxiGxylJMmk2QYE1GyL254ht8C/97+5MXY1HNK/Y1GjM+QICsrkvQ/RsklEg99Kx810w5ZC4W4de1vYQBBcD2rciobkufocwZKxHNk5ki3wF/pxwoP20b6Y6IiIaU9CCu5vxH0TTSKPG3G0FOoiiKGLrvv9f+XGqFLy4uQgsKmvu8oP0SFStUiDTf2mvVHxZPTJOSwY46uNdAhwMAnzwJksQ8kIoXOOdDghFaM6nyASjOtjmk/M9rGTJS+X4HSuBehHfL+/S8mZ2ytCZTWpYpxEn/LuLEXRdgopDzi8AbipskMB6ftvsaCQ5rt/3Nh62t/xka3y8avFJmLE7o3L3upzNRFvtWNYIOZToje1BKxTLTTv+FKTR1Rk/GgTuxfCkfDpReyxCjlmfu6ri+soXqS3sBijbk9brbcImtC84aOIpZe8WXw+EgLYLlD9sPb/pLa8tbfSMMHOhjVDbBkPJbYZ9Y/DNuZJzWAkXYYIUcgXkCTrk2FEXWfQ2irCpBsafuyM2PyGRoJKB5BuE0rmpNMzxZY5yeuemaPAw0o9Q7DPVUCMfcZFIJ/25nHnFBuOsDiT6I8zG8GiGDnTp/irCP1e501yU7i5qt0ZTY3omDy8I3QgMSsS/DsL6kRNprs/VQcnklemJy1aNjcYJXnZ3/DmVlzfc0VDjIMe6Gqy9EoKJn5b1N2JEiObOWhpDlQfKP7eNmXy/FkoloYCPpb0tPseQtfMMZPIjtr6QdeiAz6ga5WG8hC0hNPVANpmBPtabNvcvad83+UDlZ+TSo07kB85cs/+0d83x07pi2cCcWeptnkCtKWRjb9KJqFq7HRE8uTxmpy8JEGOEgWz8CdrwdC7d8IDPT5gXUpGNufmBLbSIJwTbNIN55+OEr97dTyoSNX5TAU3pMZywwZnM/KnCLcJ4fqJ6kZVc51IOHNEiLYYcVjycifF77NildHUXQ1cnVew0Dh9ljhiRJ3HzR4LV9uvpolbY3Q1qtSH6x8/fDkvL2eZIk4qEJpAMYVuo1Usm7O7ryMj+/4huzteRCZyNN4Uhfa4B2ICCY4Tjuo1GyeTh/Mx7Qew5LJmCyXv1cUwRrpJAQbNj4NrvzWHxd+iuYsrmsH6tWRMs13YhuOH7RWFFqG0/HI03B8H8JNz+BvVGdds5j0hJqE58xHJ2gRnjdxaBPCfg++tbg1vh4mxbaRZ3cHWoalqMaH12u8TlQch3/WMGb8EVvyGOiqZSinltN4xDScmLnoKSxCk7qoqnwt/LgJN1BVdKrOcyt7HNGGmTgcj0WmyAij8Js83n9VzGk5QwzzWgHKHLte4VxWGuTJI0LP8gMu5PBw6AHbMT9kd+53D8uk2qj+QL9JrWKS9DMMxNqRhGkvIxptMg362QYSHOIDFcRTs/3o+Qe/e/NDE1a/fOxzzjT34FMfob0fADf3TEPg5oy8qYNRAO6EWtbTiAUNlxMqAx1nv9Mh32w7dLY/DsuPOF43tRRA3AJjFYrb1F3LHKgG0QEdkTwBzdutFGpucNG1aO9nln+QlKzHI36KHjrlz8yyS8rBShsdJa7oIrJJVRJyA+kuz5W2LYCdzBXyqkodiKNNKj7hvrBiL7lu3Y3MjOIGFSRSm4BiISxGiVqoJ5+eXyiV9IMwA0EnsquODTxNxioQ7qurvuWvfvlIFCV38YfPBsjgeBf7Ms2HVc1EBbjL4Oww02SrqhIlrAkyN8sPoV2xLNbnWOzLSqovNsmtFbEj+2GfHhocmp1JvFU/0IJj0IdqfQyanFsZt2Y2ad0kdHdtcnlp9XGdiusshCdKXOggl9J65/t+9jLW5BFBFgXcXa/nJF20OkzcoG6tJ0ZE4OU2f8OaU/wVLx4h3tywRHpevw4U0cMt+Kk1nxCAVUS9KIhDASUijuga0nsZdYFLNrfa7+r6kffC8jn+tu6fUfTsL+P2h4f3+yxA7xuU14jcEBAVa/SbZbmOi6hH0fjsjZc7G2+7ckTzUyE0SDK3ODa/MunwvVAQfgtCVfW4un4YzQx3jsSJ+wb+eqXuYiO5ITO2A7evRvvdiSblXu3jK0GJqFJNX+k7ecPp8tnaSUTWeGAQptkpXEE4Qk/3lkR+sa+KL/I6YVA63xGIwhOBFK9ytvOvDjAbs2RLu38y37tUrt2xVPJ4q9GSOcpobT0a4X1vXKfi6LbpR2XKASVyN32/hJzgLRScLpnPL1c9vbeJQuFxIpdcm54kilk/3DP7SIDWdoBuegTAfBQd7xk1REpLGLpzm0BFET3tl6kfx23+Y1Sfw/tL6guCiCDAHrXJJEJ5hP8N+HWFY8GdOO+3xS2jqFPaI6oZ0XB+Dd71GrDGHAui+BmQ/gKUyBnYkJYGJyBX4OvxtJXAY/fiebdhY7PU78FbyW4I22rWGjHkOf1lUTKjLxtZGEtgtQ6qUvWZWkJl5Fm+m/smk7uWHzSHHg4nBGgpekTP1j+Inp4/6CeBkklHmUYbSyRbg963LGYnlBlPumLb9u2IFttVKafooRkSprB6Kx4BV9j/OFUAk4KE1cgF7Ws2ccFqo8v6mRsTllomWyr0I3XoWjJGj8UnQ79WubbJtiK/2ObiCBN4CXplg1TNH1xqpt30wa27QXh3h5SOp5nyxuO3BE6IiZ6Jz5VCt8rYJrnRHwaUDO3aNckrbB5O/MgteRzbfAf+6FChSwlRTiVhJM61eGKhrClBM/Sjy9l7XTt4jtBAwG4WhMEGGmGqFUki009DCxd82S1dr1sgX2CuQJ/WCYNMFE+gBzakWVHoqWoKKGS0addS2zUPY5MQdTWcStX8nQAj53+VUUVdgJqFpjRFwa6+z0VBaB82oLAuQWOZhshjGEyvMNtIN3j4RqMXlKz8+UEsLE6Bd0oQ6hzwKNEUBpGY5gVh3iFKRLHRF9zslGCDLmvXmnw9Dp3nhmhAoWojqr1xrMSFhmnFawtSKYroyvxS3/VfMN9GyYg5Og3v7qKi1DMp9o0JRASc+UkqJI3laKMljTYHWr4na15lHCbCyFPIncaCt1c7NCoI7/LCo2ji33ASH8V5nip0hGnAqFJc0rbii3Xdoap+EoqjCfaC3ANC+uvMt/m+nVFBeBeRgIQgjl+6kBP8CSeSomc8IogsMhWIBhMclfqWZEEVK9H/NYISVJl8JofaWolRQXjfcIJUJA2rcQavtcOgThwGGX8UA4M4S/0CvQIWNEAD1+u7RQRyVe3b5kYF4X2AAoTg9BwDRZHuxXl9kDwC9HvaK8ghlAkiZx12PH68qEMDA4gv+KJwETNgt7zNb1QQ/oUoQIEOChevwlG/FddVEApAAgbJYWXMJGG03W9wG4T09NNOZWkymAUF3vurYlKs3l2v4hsVhH/RQnF0Ch/ehzO3jIdcYEYNUlQKgcHNBbhO80WxayC4FfnvyA1cV+UWs7dLDCqW/xdgABZnO7MDe2YlAAAAAElFTkSuQmCC diff --git a/browser/locales/en-US/searchplugins/google.xml b/browser/locales/en-US/searchplugins/google.xml index 7af19a82fe70..95588cc4bf6c 100644 --- a/browser/locales/en-US/searchplugins/google.xml +++ b/browser/locales/en-US/searchplugins/google.xml @@ -7,6 +7,8 @@ Google Search UTF-8 data:image/x-icon;base64,AAABAAIAEBAAAAAAAAB9AQAAJgAAACAgAAAAAAAA8gIAAKMBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAFESURBVDjLpZNJSwNBEIXnt4lE4kHxovgT9BDwJHqPy0HEEOJBiAuCRg+KUdC4QS4KrpC4gCBGE3NQ48JsnZ6eZ3UOM6gjaePhQU93v6+qq2q0pqgeJj2S8EdJT1hr0OxBtKCD5iEd8QxDYpvhvOBAuMDKURX9C9aPu4GA1GEVkzvMg10UBfYveWAWgYAP00V01fa+R9M2bA51wJvhIn3qR+ybt3D3JNQBE5sMjCIOLFpoHzOwdsLRO22qA6R6kiZiWwxUvy/PUQZIhYZ1vFM9cvcOOsYNdcBgysISdSJBnZjJMlR0Fw8vAp0xoz5gao/h+NZBy4i/10XGwrPA+hmvDyhVRG2Avu/LwcrkFADZa16L1h330w1RNgc3DiJzCpPYRm1bpveXX11clQR28xwblHpk1vq1iP/5mcoS0CoXDZiL0vsJ+dzfl+3T/VYAAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAIAAAACAIBgAAAHN6evQAAAK5SURBVFjDxVfrSxRRFJ9/Jta/oyWjF5XQm6D6EkHRgygIIgjUTcueVgqVWSRRkppEUQYWWB8ye1iGWilWlo/Ude489s7M6Zw7D9dlt53dmd29cFiWvXvO77x+51xpaaUsoSxBaUWZQ4ECy5xji2xKZDyCMlMEw6lCNiOSgwZKJK1SkcKeSealfP64t0mBjl4Ow39MkDUL0p2RSROOtqhZdeUEYM1pBl39XCg/fEeFtWcY7G9W4csvUxjlBkCsQ4Nt9QyWVfvT6RsAKXw3aoDGATZeYIt+W1kjw7cJG0RctWDTRebbKd8A6h5pwsDb70ba3w/eUr3wt/cmwgfw6Yft4TNMQaY7o1P2ncm4FT4ANQH/jQBJ2xv7kqIXEADDql8eS3+n8bku7oxNm+EDIM/dU92upb3T/NJGeaNbDx/AsbsLRUY5Xn92caWXY5d8RV6gWllxSg4fAEnTC90DQW13BLlgXR2D3dcUeDVkwOthA1bXspxILWcm3HdThcfvufB26LcJpkOEAz9NKI/lzqpSEC7feol5EWnpSeSlIxCALUkApmULdjUqxQVAQnl3D/X/yQda4QBEq2TYc12By091MQ17Bg3R88nHKlQbVmHvj89awNBLYrwT9zXY2aBAxTkGFdiSxP/Jp6FLDw+AS7GfsdJTJ2EqSO5khD43nGfBARy/ZxOQgZHe7GPM1jzUvChUtmnBAXQPcKGMJp3fdFGq6NByEhiAO4b/YptFfQJwNyQ/bZkVQGcf90Ja25ndIyrKBOa/f8wIpwi3X1G8UcxNu7ozUS7tiH0jBswwS3RIaF1w6LYKU/ML2+8sGnjygQswtKrVIy/Qd9qQP6LnO64q4fPAKpxyZIymHo1jWk6p1ag2BsdNwQMHcC+M5kHFJX+YlPxpVlbCx2mZ5DzPI04k4kUwHHdskU3pH76iftG8yWlkAAAAAElFTkSuQmCC +data:image/png;base64,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 +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAAA0CAYAAABGkOCVAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjMwQjQ3MEVGRjQxMTExRTM5RkNCRjhFNDM0QjY3OEQ1IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjMwQjQ3MEYwRjQxMTExRTM5RkNCRjhFNDM0QjY3OEQ1Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MzBCNDcwRURGNDExMTFFMzlGQ0JGOEU0MzRCNjc4RDUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzBCNDcwRUVGNDExMTFFMzlGQ0JGOEU0MzRCNjc4RDUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5U94CwAAArpElEQVR42ux9B5hU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 diff --git a/browser/locales/en-US/searchplugins/yahoo.xml b/browser/locales/en-US/searchplugins/yahoo.xml index 3d9f58821bd8..a21ccc2d20ba 100644 --- a/browser/locales/en-US/searchplugins/yahoo.xml +++ b/browser/locales/en-US/searchplugins/yahoo.xml @@ -7,6 +7,7 @@ Yahoo Search UTF-8 data:image/x-icon;base64,AAABAAIAEBAAAAEACAA8DQAAJgAAACAgAAABAAgAowsAAGINAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAAJcEhZcwAACxMAAAsTAQCanBgAAApPaUNDUFBob3Rvc2hvcCBJQ0MgcHJvZmlsZQAAeNqdU2dUU+kWPffe9EJLiICUS29SFQggUkKLgBSRJiohCRBKiCGh2RVRwRFFRQQbyKCIA46OgIwVUSwMigrYB+Qhoo6Do4iKyvvhe6Nr1rz35s3+tdc+56zznbPPB8AIDJZIM1E1gAypQh4R4IPHxMbh5C5AgQokcAAQCLNkIXP9IwEA+H48PCsiwAe+AAF40wsIAMBNm8AwHIf/D+pCmVwBgIQBwHSROEsIgBQAQHqOQqYAQEYBgJ2YJlMAoAQAYMtjYuMAUC0AYCd/5tMAgJ34mXsBAFuUIRUBoJEAIBNliEQAaDsArM9WikUAWDAAFGZLxDkA2C0AMElXZkgAsLcAwM4QC7IACAwAMFGIhSkABHsAYMgjI3gAhJkAFEbyVzzxK64Q5yoAAHiZsjy5JDlFgVsILXEHV1cuHijOSRcrFDZhAmGaQC7CeZkZMoE0D+DzzAAAoJEVEeCD8/14zg6uzs42jrYOXy3qvwb/ImJi4/7lz6twQAAA4XR+0f4sL7MagDsGgG3+oiXuBGheC6B194tmsg9AtQCg6dpX83D4fjw8RaGQudnZ5eTk2ErEQlthyld9/mfCX8BX/Wz5fjz89/XgvuIkgTJdgUcE+ODCzPRMpRzPkgmEYtzmj0f8twv//B3TIsRJYrlYKhTjURJxjkSajPMypSKJQpIpxSXS/2Ti3yz7Az7fNQCwaj4Be5EtqF1jA/ZLJxBYdMDi9wAA8rtvwdQoCAOAaIPhz3f/7z/9R6AlAIBmSZJxAABeRCQuVMqzP8cIAABEoIEqsEEb9MEYLMAGHMEF3MEL/GA2hEIkxMJCEEIKZIAccmAprIJCKIbNsB0qYC/UQB00wFFohpNwDi7CVbgOPXAP+mEInsEovIEJBEHICBNhIdqIAWKKWCOOCBeZhfghwUgEEoskIMmIFFEiS5E1SDFSilQgVUgd8j1yAjmHXEa6kTvIADKC/Ia8RzGUgbJRPdQMtUO5qDcahEaiC9BkdDGajxagm9BytBo9jDah59CraA/ajz5DxzDA6BgHM8RsMC7Gw0KxOCwJk2PLsSKsDKvGGrBWrAO7ifVjz7F3BBKBRcAJNgR3QiBhHkFIWExYTthIqCAcJDQR2gk3CQOEUcInIpOoS7QmuhH5xBhiMjGHWEgsI9YSjxMvEHuIQ8Q3JBKJQzInuZACSbGkVNIS0kbSblIj6SypmzRIGiOTydpka7IHOZQsICvIheSd5MPkM+Qb5CHyWwqdYkBxpPhT4ihSympKGeUQ5TTlBmWYMkFVo5pS3aihVBE1j1pCraG2Uq9Rh6gTNHWaOc2DFklLpa2ildMaaBdo92mv6HS6Ed2VHk6X0FfSy+lH6JfoA/R3DA2GFYPHiGcoGZsYBxhnGXcYr5hMphnTixnHVDA3MeuY55kPmW9VWCq2KnwVkcoKlUqVJpUbKi9Uqaqmqt6qC1XzVctUj6leU32uRlUzU+OpCdSWq1WqnVDrUxtTZ6k7qIeqZ6hvVD+kfln9iQZZw0zDT0OkUaCxX+O8xiALYxmzeCwhaw2rhnWBNcQmsc3ZfHYqu5j9HbuLPaqpoTlDM0ozV7NS85RmPwfjmHH4nHROCecop5fzforeFO8p4ikbpjRMuTFlXGuqlpeWWKtIq1GrR+u9Nq7tp52mvUW7WfuBDkHHSidcJ0dnj84FnedT2VPdpwqnFk09OvWuLqprpRuhu0R3v26n7pievl6Ankxvp955vef6HH0v/VT9bfqn9UcMWAazDCQG2wzOGDzFNXFvPB0vx9vxUUNdw0BDpWGVYZfhhJG50Tyj1UaNRg+MacZc4yTjbcZtxqMmBiYhJktN6k3umlJNuaYppjtMO0zHzczNos3WmTWbPTHXMueb55vXm9+3YFp4Wiy2qLa4ZUmy5FqmWe62vG6FWjlZpVhVWl2zRq2drSXWu627pxGnuU6TTque1mfDsPG2ybaptxmw5dgG2662bbZ9YWdiF2e3xa7D7pO9k326fY39PQcNh9kOqx1aHX5ztHIUOlY63prOnO4/fcX0lukvZ1jPEM/YM+O2E8spxGmdU5vTR2cXZ7lzg/OIi4lLgssulz4umxvG3ci95Ep09XFd4XrS9Z2bs5vC7ajbr+427mnuh9yfzDSfKZ5ZM3PQw8hD4FHl0T8Ln5Uwa9+sfk9DT4FntecjL2MvkVet17C3pXeq92HvFz72PnKf4z7jPDfeMt5ZX8w3wLfIt8tPw2+eX4XfQ38j/2T/ev/RAKeAJQFnA4mBQYFbAvv4enwhv44/Ottl9rLZ7UGMoLlBFUGPgq2C5cGtIWjI7JCtIffnmM6RzmkOhVB+6NbQB2HmYYvDfgwnhYeFV4Y/jnCIWBrRMZc1d9HcQ3PfRPpElkTem2cxTzmvLUo1Kj6qLmo82je6NLo/xi5mWczVWJ1YSWxLHDkuKq42bmy+3/zt84fineIL43sXmC/IXXB5oc7C9IWnFqkuEiw6lkBMiE44lPBBECqoFowl8hN3JY4KecIdwmciL9E20YjYQ1wqHk7ySCpNepLskbw1eSTFM6Us5bmEJ6mQvEwNTN2bOp4WmnYgbTI9Or0xg5KRkHFCqiFNk7Zn6mfmZnbLrGWFsv7Fbou3Lx6VB8lrs5CsBVktCrZCpuhUWijXKgeyZ2VXZr/Nico5lqueK83tzLPK25A3nO+f/+0SwhLhkralhktXLR1Y5r2sajmyPHF52wrjFQUrhlYGrDy4irYqbdVPq+1Xl65+vSZ6TWuBXsHKgsG1AWvrC1UK5YV969zX7V1PWC9Z37Vh+oadGz4ViYquFNsXlxV/2CjceOUbh2/Kv5nclLSpq8S5ZM9m0mbp5t4tnlsOlqqX5pcObg3Z2rQN31a07fX2Rdsvl80o27uDtkO5o788uLxlp8nOzTs/VKRU9FT6VDbu0t21Ydf4btHuG3u89jTs1dtbvPf9Psm+21UBVU3VZtVl+0n7s/c/romq6fiW+21drU5tce3HA9ID/QcjDrbXudTVHdI9VFKP1ivrRw7HH77+ne93LQ02DVWNnMbiI3BEeeTp9wnf9x4NOtp2jHus4QfTH3YdZx0vakKa8ppGm1Oa+1tiW7pPzD7R1ureevxH2x8PnDQ8WXlK81TJadrpgtOTZ/LPjJ2VnX1+LvncYNuitnvnY87fag9v77oQdOHSRf+L5zu8O85c8rh08rLb5RNXuFearzpfbep06jz+k9NPx7ucu5quuVxrue56vbV7ZvfpG543zt30vXnxFv/W1Z45Pd2983pv98X39d8W3X5yJ/3Oy7vZdyfurbxPvF/0QO1B2UPdh9U/W/7c2O/cf2rAd6Dz0dxH9waFg8/+kfWPD0MFj5mPy4YNhuueOD45OeI/cv3p/KdDz2TPJp4X/qL+y64XFi9++NXr187RmNGhl/KXk79tfKX96sDrGa/bxsLGHr7JeDMxXvRW++3Bd9x3He+j3w9P5Hwgfyj/aPmx9VPQp/uTGZOT/wQDmPP8YzMt2wAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACZ0lEQVR42mzSP4icZRTF4ee+38xOkp2sG5cQxVJIIaaKkICxTkqJjQhpJFYiop2F1YKFQqoUVpEoCBYSS7dfOxVFWGIsokUE/0TEye7OzPe977XYNWk83b0cDoffvXHWGxkKYjt0N1fi+FaJIzNIFSJ0kDXn0z5nF1O9Sp5PzaizamLD2NELo5W4sOwXqqX/04o1R2wg9PYs/GXUmTjqpGNxwvWdFzz19Akvjj+XUkYTggylFLfml93due+tZ7+y577BrkJnbNWke8yHmzvgi/4lq+WU1XjCsThl2p1ya3GZ4KNrt03KuhXH0SkkkbTOL5+u2PnuZ/D8axtGMTaKsbOvrINP3v/W3Y9XhCJjQCrUWRedVpaq3nvn7oHXrz8jD8PfvnEGbL0716LXytIoxqizkups4R/VwhB7hpi7sXkbXNo86bkrazK5sXnbEHND7BvMLcykOotz3vlxvZw+faRb08VEiVC64rPdSw/pZ/Ly9EutNi3TkHOLOvN3u3OnHNx7MFio5qq5Ifdce/WHhwEfXPnekPuq/UPPQhrAKOV0MFdyRFQFRefr7Z9wRrb0zfYd1aCpGmr2BvtSTkcp1wZLnX0tx4oQjeHX+UF97P75QGspM7VMqTfopVwb0aY1F4ZWlFK1SCVDHQKUEvphj0ztkEdrvZoLtOkoNS2XlkHJIlroIky7Jw8atDSJdQ/aPTUdtJBaLqVmlJpqQataCZKhY/L4HwcEI/Qbv1v8tivbIdVG1UtNnPVmFmPEoT9l/Dc9Ujp42Mx4uGl6I5pmgdjGzaLbopsdJqZHWZnqtKkXcZU8D/8OAPAMQ4kD8KK1AAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEJGlDQ1BJQ0MgUHJvZmlsZQAAOBGFVd9v21QUPolvUqQWPyBYR4eKxa9VU1u5GxqtxgZJk6XtShal6dgqJOQ6N4mpGwfb6baqT3uBNwb8AUDZAw9IPCENBmJ72fbAtElThyqqSUh76MQPISbtBVXhu3ZiJ1PEXPX6yznfOec7517bRD1fabWaGVWIlquunc8klZOnFpSeTYrSs9RLA9Sr6U4tkcvNEi7BFffO6+EdigjL7ZHu/k72I796i9zRiSJPwG4VHX0Z+AxRzNRrtksUvwf7+Gm3BtzzHPDTNgQCqwKXfZwSeNHHJz1OIT8JjtAq6xWtCLwGPLzYZi+3YV8DGMiT4VVuG7oiZpGzrZJhcs/hL49xtzH/Dy6bdfTsXYNY+5yluWO4D4neK/ZUvok/17X0HPBLsF+vuUlhfwX4j/rSfAJ4H1H0qZJ9dN7nR19frRTeBt4Fe9FwpwtN+2p1MXscGLHR9SXrmMgjONd1ZxKzpBeA71b4tNhj6JGoyFNp4GHgwUp9qplfmnFW5oTdy7NamcwCI49kv6fN5IAHgD+0rbyoBc3SOjczohbyS1drbq6pQdqumllRC/0ymTtej8gpbbuVwpQfyw66dqEZyxZKxtHpJn+tZnpnEdrYBbueF9qQn93S7HQGGHnYP7w6L+YGHNtd1FJitqPAR+hERCNOFi1i1alKO6RQnjKUxL1GNjwlMsiEhcPLYTEiT9ISbN15OY/jx4SMshe9LaJRpTvHr3C/ybFYP1PZAfwfYrPsMBtnE6SwN9ib7AhLwTrBDgUKcm06FSrTfSj187xPdVQWOk5Q8vxAfSiIUc7Z7xr6zY/+hpqwSyv0I0/QMTRb7RMgBxNodTfSPqdraz/sDjzKBrv4zu2+a2t0/HHzjd2Lbcc2sG7GtsL42K+xLfxtUgI7YHqKlqHK8HbCCXgjHT1cAdMlDetv4FnQ2lLasaOl6vmB0CMmwT/IPszSueHQqv6i/qluqF+oF9TfO2qEGTumJH0qfSv9KH0nfS/9TIp0Wboi/SRdlb6RLgU5u++9nyXYe69fYRPdil1o1WufNSdTTsp75BfllPy8/LI8G7AUuV8ek6fkvfDsCfbNDP0dvRh0CrNqTbV7LfEEGDQPJQadBtfGVMWEq3QWWdufk6ZSNsjG2PQjp3ZcnOWWing6noonSInvi0/Ex+IzAreevPhe+CawpgP1/pMTMDo64G0sTCXIM+KdOnFWRfQKdJvQzV1+Bt8OokmrdtY2yhVX2a+qrykJfMq4Ml3VR4cVzTQVz+UoNne4vcKLoyS+gyKO6EHe+75Fdt0Mbe5bRIf/wjvrVmhbqBN97RD1vxrahvBOfOYzoosH9bq94uejSOQGkVM6sN/7HelL4t10t9F4gPdVzydEOx83Gv+uNxo7XyL/FtFl8z9ZAHF4bBsrEwAAAAlwSFlzAAALEwAACxMBAJqcGAAAByVJREFUWAm1l1uIldcVx9d3ruMZZzRaay+pCjFJH6LSRqxQqA1NH0pBiH3Qp774kEAg4EOkxKdQSCjUFvpm6YsNVNoSaGjFtmga2yZgCIIawdv04g2kM7Uz6lzO+c758v/t/9lzTB/61Oxhn7332muv9V+3vb8pnooDVRkzZ4oY/LmK6mQZa05frX6yFJ9Ae7x4qd2IuV1FFM9WMfhaI9Z+pQBAL+aiEZ0QgNBm2YuZmxHF9VZMXqmivFaLweUyuteWYvHGVPWr2f+F7YvF/ola9DZGVJsHUXs8YvBEK1ZrXt9URDwqxY1BdGMQvWjGqkgA+iLUtazHuADUoowHYugKTilaR7SIpZjWqOMRfY090RbasS4JglpFtzWIcqwZa+pSqnWVcLLXijXpZCFpvbgb/VhMe8huMLPylWkci8/oSD8xJq7hj4WUWvXrlbqVrUyKtBYdpX3Bh9YbzsdErwRgbZKyFP+KdqxPssu4l2hDAOOxIj6bCHigKWRNCcpMCHHHB4TJLc+TXxKHnC51Ct+Qgxl/TZ0qE5Be/EdWTwjqQuJJAPIB8qAZk4kZoXJnvHH+27Hq0+0YX12PH+w7E3/8zbWkitN2M8pS7kCKZ761OV55c2fcm+nG7J1e7N/+e3m2nbyKQcAhnHWZLC86B1rxiFRvSIkIgJHFVWzZ+qk4fG5HEr4wV8buVb+Vuv5QeVZsi/HeW//eHZ1HbNfLT5+Jc2dndBav9KXugfqc+pLsv6Xxvk6kVheumnpDnXlTVMZWfHh+Li6cdOKvmGzEC69+WTskzwr1SfUJ9ZWp7z/0pWXlF9+ejQtnUdCWnAxQ+al5Tdz80lIVEP8x9eZQWCQwOTAhNc34Re+rUW8U0S+r2Ns8nWzBKgONBOeX3V3RaCpPRN7XeFcO7yYl+InML2U3VdBVHszHzbSXYLBJkuTSQzBuphoYZ7X/u8O30gFAHHxzi+Yop8ETcfDXW5JyKMd/fFuO9l3mYuwLAl5gbMg8QuKdYQg4Zjcxo7HikMeIn37vcizes9Ide9bGhs9NLPN9YX0ndnzHpbZ4vx9HXr6kc6Sobo2hIkuzOnIh0xMFRlvc0waWL+p3UePCQ/Myjjx/JSnl59CJbUkJgl75g+ZD/D978Yrc7EuMPe4ESo6OYsaasiiX7tADAyny5cGtyMHsDxzFnP0Tx6Z0SfsW27B1PHZ+c13seGZdbNo2Lo6Iu7e7cfznfxc/8ggNQBhZI9dSs2c5k+rFaHBXmZhd32xTGdlZPvzDvefj9XddlgeObYVpuf1o3zkpyrEnCJwBDjlmr9i7XP3jgrYkDamhEqRA8UOBxZ53tcOtBbgyzr53M65f8DU6sVZ1o067cfFBvP+XGzrDOa5s+JkTShIc+dBtlLOLlRpqAUDc+yqQMnViNq81edDVnPixno/vP/dXjn2svbbnPa1RiqXEHVkYQ06RWygnFEtpbZDLAJws2X1OHgfCv+hiRkZU8Y+pmbjwzjTE1D48PR1TV+5IMErgsjex2A8TJrqCHH9Cw6U0BGBkPUWrKTZnPq4L9WqIOFvEO8ml+vbRvyUB/Jw6OiUa9GydM58qQl6lTrNHyiENrwyTkOvXLziVkMlOOsesVKyIFtZB1zfDAGvdyj4xtkD7yHQ8Ynn4hCrwvYA+DOJCSlXAZl3MjNQobNzVPK7gJm0AiPsQyEg0c6s1cbEB5X08AmDz1TTLucApzHHyJgADvUqVysJMKOSicLRQl+emOIvbnaw+ot2pSTzl5zzJVjPaZ6ix7zCSN4E1shOAWnqbyYH8bOqd1h9AGJ0qtl6LRBubcBKxbo6xh60kWlbLjgG4NJ2ETkwqbl7SeUXVSCq+BF1C2bWEgEO4CxBGvOydGmu3ooXv7AEogLFqn2JtWKO8yc9xAmDxjhGiWMOQXe63zCvHtIjOpGOIwvGJlhRQepyzaiu0MQ4MnFhuT7CiJQC+sUg4jtOYO+1IH9OdCwgBSmOkP2r60CarHeXMjxw3PGyvOBnN670EgOPOc1yEYgDYCxbqTPDXki1srChi4R6lpQ+uDmVFDtkA5GH1qJEvQFgacqCFT37pyP+Y+DMJs0Y54NgbiIVn61jhEUrNARuNIi3vOQf8iUeQuNzILe4b/jFZ7RDYJhTbVRaJTxyWh8PgO93hQJCBsSa2GQyyoLlBzWDxgnm9l0JgADgNgVxElCH22xs4NCsaieSUyzWXaSTLDAPlGQB0Kt6JaqpzYjkJQT9id60aNwqZjVqlz9Kqp+JcfDjOAqhirNoCI6MelpVPAjZ/CbFv45Y9YNcicqDMKm/Xo/FPJdMlqZ9SIK7qSrrci9mbl6q3/DGQ5f7XuK347rgKeuMgiicEfLPmT0rGY1K5SdI/ryritlMbJrr/PZ8+I8qf9PF8qhMrT39QHfHLkhj/fz/bi+eb83F/VxX1b6jWvt6KdTs/AvvCmqXE235jAAAAAElFTkSuQmCC +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAAAaCAYAAADovjFxAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjcwNUUyRjFGQjUyNTExRTNCNzdEOTU4N0NCMjI3MEFDIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjcwNUUyRjIwQjUyNTExRTNCNzdEOTU4N0NCMjI3MEFDIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NzA1RTJGMURCNTI1MTFFM0I3N0Q5NTg3Q0IyMjcwQUMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NzA1RTJGMUVCNTI1MTFFM0I3N0Q5NTg3Q0IyMjcwQUMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4qMBarAAAI8ElEQVR42uxZeVRT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 data:image/png;base64,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 diff --git a/browser/metro/base/content/browser-ui.js b/browser/metro/base/content/browser-ui.js index 96a91526c329..b106824af167 100644 --- a/browser/metro/base/content/browser-ui.js +++ b/browser/metro/base/content/browser-ui.js @@ -7,6 +7,9 @@ Cu.import("resource://gre/modules/devtools/dbg-server.jsm") Cu.import("resource://gre/modules/WindowsPrefSync.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "LoginManagerParent", + "resource://gre/modules/LoginManagerParent.jsm"); + /** * Constants */ @@ -167,6 +170,7 @@ var BrowserUI = { DialogUI.init(); FormHelperUI.init(); FindHelperUI.init(); + LoginManagerParent.init(); #ifdef NIGHTLY_BUILD PdfJs.init(); #endif diff --git a/build/autoconf/compiler-opts.m4 b/build/autoconf/compiler-opts.m4 index 216edeb9a0f7..05e5632d0d60 100644 --- a/build/autoconf/compiler-opts.m4 +++ b/build/autoconf/compiler-opts.m4 @@ -185,9 +185,7 @@ dnl A high level macro for selecting compiler options. AC_DEFUN([MOZ_COMPILER_OPTS], [ if test "${MOZ_PSEUDO_DERECURSE-unset}" = unset; then - dnl Don't enable on pymake, because of bug 918652. Bug 912979 is an annoyance - dnl with pymake, too. - MOZ_PSEUDO_DERECURSE=no-pymake + MOZ_PSEUDO_DERECURSE=1 fi MOZ_DEBUGGING_OPTS @@ -246,6 +244,13 @@ if test "$GNU_CC" -a -n "$MOZ_FORCE_GOLD"; then fi fi fi +if test "$GNU_CC"; then + if $CC $LDFLAGS -Wl,--version 2>&1 | grep -q "GNU ld"; then + LD_IS_BFD=1 + fi +fi + +AC_SUBST([LD_IS_BFD]) if test "$GNU_CC"; then if test -z "$DEVELOPER_OPTIONS"; then diff --git a/build/docs/slow.rst b/build/docs/slow.rst index 018652d9b834..546fe26ce230 100644 --- a/build/docs/slow.rst +++ b/build/docs/slow.rst @@ -88,22 +88,9 @@ GB is likely entering the point of diminishing returns. This cause impacts both clobber and incremental builds. -You are building with pymake -============================ - -Pymake is slower than GNU make. One reason is Python is generally slower -than C. The build system maintainers are consistently looking at -optimizing pymake. However, it is death by a thousand cuts. - -This cause impacts both clobber and incremental builds. - You are building on Windows =========================== -Builds on Windows are slow for a few reasons. First, Windows builds use -pymake, not GNU make (because of compatibility issues with GNU make). -But, there are other sources of slowness. - New processes on Windows are about a magnitude slower to spawn than on UNIX-y systems such as Linux. This is because Windows has optimized new threads while the \*NIX platforms typically optimize new processes. diff --git a/build/win32/autobinscope.py b/build/win32/autobinscope.py index 4899e731ab46..8bb455990bfd 100644 --- a/build/win32/autobinscope.py +++ b/build/win32/autobinscope.py @@ -46,8 +46,7 @@ except KeyError: try: proc = subprocess.Popen([binscope_path, "/target", binary_path, "/output", log_file_path, "/sympath", symbol_path, - "/c", "ATLVersionCheck", "/c", "ATLVulnCheck", "/c", "FunctionPointersCheck", - "/c", "SharedSectionCheck", "/c", "APTCACheck", "/c", "NXCheck", + "/c", "ATLVersionCheck", "/c", "ATLVulnCheck", "/c", "SharedSectionCheck", "/c", "APTCACheck", "/c", "NXCheck", "/c", "GSCheck", "/c", "GSFunctionSafeBuffersCheck", "/c", "GSFriendlyInitCheck", "/c", "CompilerVersionCheck", "/c", "SafeSEHCheck", "/c", "SNCheck", "/c", "DBCheck"], stdout=subprocess.PIPE) diff --git a/client.mk b/client.mk index 8785d07c47e3..7fd04c5d5db9 100644 --- a/client.mk +++ b/client.mk @@ -145,13 +145,6 @@ endif ifndef MOZ_OBJDIR MOZ_OBJDIR = obj-$(CONFIG_GUESS) -else -# On Windows Pymake builds check MOZ_OBJDIR doesn't start with "/" - ifneq (,$(findstring mingw,$(CONFIG_GUESS))) - ifeq (1_a,$(.PYMAKE)_$(firstword a$(subst /, ,$(MOZ_OBJDIR)))) - $(error For Windows Pymake builds, MOZ_OBJDIR must be a Windows [and not MSYS] style path.) - endif - endif endif ifdef MOZ_BUILD_PROJECTS diff --git a/config/config.mk b/config/config.mk index b6df7a93b5ad..c1c41964e86e 100644 --- a/config/config.mk +++ b/config/config.mk @@ -194,16 +194,6 @@ endif CONFIG_TOOLS = $(MOZ_BUILD_ROOT)/config AUTOCONF_TOOLS = $(topsrcdir)/build/autoconf -# Disable MOZ_PSEUDO_DERECURSE when it contains no-pymake and we're running -# pymake. This can be removed when no-pymake is removed from the default in -# build/autoconf/compiler-opts.m4. -ifdef .PYMAKE -comma = , -ifneq (,$(filter no-pymake,$(subst $(comma), ,$(MOZ_PSEUDO_DERECURSE)))) -MOZ_PSEUDO_DERECURSE := -endif -endif - # Disable MOZ_PSEUDO_DERECURSE on PGO builds until it's fixed. ifneq (,$(MOZ_PROFILE_USE)$(MOZ_PROFILE_GENERATE)) MOZ_PSEUDO_DERECURSE := @@ -238,10 +228,6 @@ MKDIR ?= mkdir SLEEP ?= sleep TOUCH ?= touch -ifdef .PYMAKE -PYCOMMANDPATH += $(PYTHON_SITE_PACKAGES) -endif - PYTHON_PATH = $(PYTHON) $(topsrcdir)/config/pythonpath.py # determine debug-related options @@ -720,9 +706,6 @@ endif # NSINSTALL_BIN ifeq (,$(CROSS_COMPILE)$(filter-out WINNT, $(OS_ARCH))) INSTALL = $(NSINSTALL) -t -ifdef .PYMAKE -install_cmd = $(NSINSTALL_NATIVECMD) -t $(1) -endif # .PYMAKE else @@ -839,6 +822,7 @@ endif define CHECK_BINARY $(call CHECK_STDCXX,$(1)) $(call CHECK_TEXTREL,$(1)) +$(call LOCAL_CHECKS,$(1)) endef # autoconf.mk sets OBJ_SUFFIX to an error to avoid use before including diff --git a/config/makefiles/functions.mk b/config/makefiles/functions.mk index d97b604f9944..ac3632b486f9 100644 --- a/config/makefiles/functions.mk +++ b/config/makefiles/functions.mk @@ -27,8 +27,4 @@ core_winabspath = $(error core_winabspath is unsupported) # # libs:: # $(call py_action,purge_manifests,_build_manifests/purge/foo.manifest) -ifdef .PYMAKE -py_action = %mozbuild.action.$(1) main $(2) -else py_action = $(PYTHON) -m mozbuild.action.$(1) $(2) -endif diff --git a/config/rules.mk b/config/rules.mk index b958cccefe71..dff696a68589 100644 --- a/config/rules.mk +++ b/config/rules.mk @@ -35,23 +35,8 @@ endif USE_AUTOTARGETS_MK = 1 include $(topsrcdir)/config/makefiles/makeutils.mk -# Only build with Pymake (not GNU make) on Windows. -ifeq ($(HOST_OS_ARCH),WINNT) -ifndef L10NBASEDIR -ifndef .PYMAKE -$(error Pymake is required to build on Windows. Run |./mach build| to \ -automatically use pymake or invoke pymake directly via \ -|python build/pymake/make.py|.) -endif -endif -endif - ifdef REBUILD_CHECK -ifdef .PYMAKE -REPORT_BUILD = @%rebuild_check rebuild_check $@ $^ -else REPORT_BUILD = $(info $(shell $(PYTHON) $(MOZILLA_DIR)/config/rebuild_check.py $@ $^)) -endif else REPORT_BUILD = $(info $(notdir $@)) endif @@ -66,15 +51,11 @@ endif # ELOG prints out failed command when building silently (gmake -s). Pymake # prints out failed commands anyway, so ELOG just makes things worse by # forcing shell invocations. -ifndef .PYMAKE ifneq (,$(findstring s, $(filter-out --%, $(MAKEFLAGS)))) ELOG := $(EXEC) sh $(BUILD_TOOLS)/print-failed-commands.sh else ELOG := endif # -s -else - ELOG := -endif # ifndef .PYMAKE _VPATH_SRCS = $(abspath $<) @@ -238,7 +219,7 @@ endif COMPILE_CFLAGS += $(COMPILE_PDB_FLAG) COMPILE_CXXFLAGS += $(COMPILE_PDB_FLAG) -LINK_PDBFILE = $(basename $(@F)).pdb +LINK_PDBFILE ?= $(basename $(@F)).pdb ifdef MOZ_DEBUG CODFILE=$(basename $(@F)).cod endif @@ -1142,9 +1123,7 @@ else endif # Cancel GNU make built-in implicit rules -ifndef .PYMAKE MAKEFLAGS += -r -endif ifneq (,$(filter WINNT,$(OS_ARCH))) SEP := ; diff --git a/config/tests/makefiles/autodeps/Makefile.in b/config/tests/makefiles/autodeps/Makefile.in index b588c33be94a..ea21c5a8e404 100644 --- a/config/tests/makefiles/autodeps/Makefile.in +++ b/config/tests/makefiles/autodeps/Makefile.in @@ -22,7 +22,6 @@ tgts =\ $(NULL) export MAKE -export .PYMAKE ##------------------_## ##---] TARGETS [---## diff --git a/content/base/src/CSPUtils.jsm b/content/base/src/CSPUtils.jsm index b21e5db8ff7d..983a7f574ef2 100644 --- a/content/base/src/CSPUtils.jsm +++ b/content/base/src/CSPUtils.jsm @@ -193,7 +193,7 @@ CSPPolicyURIListener.prototype = { // send the policy we received back to the parent document's CSP // for parsing this._csp.appendPolicy(this._policy, this._docURI, - this._reportOnly, this._csp._specCompliant); + this._reportOnly, true); } else { // problem fetching policy so fail closed by appending a "block it all" @@ -202,7 +202,7 @@ CSPPolicyURIListener.prototype = { this._csp.log(WARN_FLAG, CSPLocalizer.getFormatStr("errorFetchingPolicy", [status])); this._csp.appendPolicy("default-src 'none'", this._docURI, - this._reportOnly, this._csp._specCompliant); + this._reportOnly, true); } // resume the parent document request this._docRequest.resume(); @@ -213,49 +213,23 @@ CSPPolicyURIListener.prototype = { /** * Class that represents a parsed policy structure. - * - * @param aSpecCompliant: true: this policy is a CSP 1.0 spec - * compliant policy and should be parsed as such. - * false or undefined: this is a policy using - * our original implementation's CSP syntax. */ -this.CSPRep = function CSPRep(aSpecCompliant) { +this.CSPRep = function CSPRep() { // this gets set to true when the policy is done parsing, or when a // URI-borne policy has finished loading. this._isInitialized = false; this._allowEval = false; this._allowInlineScripts = false; + this._allowInlineStyles = false; this._reportOnlyMode = false; // don't auto-populate _directives, so it is easier to find bugs this._directives = {}; - - // Is this a 1.0 spec compliant CSPRep ? - // Default to false if not specified. - this._specCompliant = (aSpecCompliant !== undefined) ? aSpecCompliant : false; - - // Only CSP 1.0 spec compliant policies block inline styles by default. - this._allowInlineStyles = !aSpecCompliant; } -// Source directives for our original CSP implementation. -// These can be removed when the original implementation is deprecated. -CSPRep.SRC_DIRECTIVES_OLD = { - DEFAULT_SRC: "default-src", - SCRIPT_SRC: "script-src", - STYLE_SRC: "style-src", - MEDIA_SRC: "media-src", - IMG_SRC: "img-src", - OBJECT_SRC: "object-src", - FRAME_SRC: "frame-src", - FRAME_ANCESTORS: "frame-ancestors", - FONT_SRC: "font-src", - XHR_SRC: "xhr-src" -}; - // Source directives for our CSP 1.0 spec compliant implementation. -CSPRep.SRC_DIRECTIVES_NEW = { +CSPRep.SRC_DIRECTIVES = { DEFAULT_SRC: "default-src", SCRIPT_SRC: "script-src", STYLE_SRC: "style-src", @@ -273,268 +247,6 @@ CSPRep.URI_DIRECTIVES = { POLICY_URI: "policy-uri" /* single URI */ }; -// These directives no longer exist in CSP 1.0 and -// later and will eventually be removed when we no longer -// support our original implementation's syntax. -CSPRep.OPTIONS_DIRECTIVE = "options"; -CSPRep.ALLOW_DIRECTIVE = "allow"; - -/** - * Factory to create a new CSPRep, parsed from a string. - * - * @param aStr - * string rep of a CSP - * @param self (optional) - * URI representing the "self" source - * @param reportOnly (optional) - * whether or not this CSP is report-only (defaults to false) - * @param docRequest (optional) - * request for the parent document which may need to be suspended - * while the policy-uri is asynchronously fetched - * @param csp (optional) - * the CSP object to update once the policy has been fetched - * @param enforceSelfChecks (optional) - * if present, and "true", will check to be sure "self" has the - * appropriate values to inherit when they are omitted from the source. - * @returns - * an instance of CSPRep - */ -CSPRep.fromString = function(aStr, self, reportOnly, docRequest, csp, - enforceSelfChecks) { - var SD = CSPRep.SRC_DIRECTIVES_OLD; - var UD = CSPRep.URI_DIRECTIVES; - var aCSPR = new CSPRep(); - aCSPR._originalText = aStr; - aCSPR._innerWindowID = innerWindowFromRequest(docRequest); - if (typeof reportOnly === 'undefined') reportOnly = false; - aCSPR._reportOnlyMode = reportOnly; - - var selfUri = null; - if (self instanceof Ci.nsIURI) { - selfUri = self.cloneIgnoringRef(); - // clean userpass out of the URI (not used for CSP origin checking, but - // shows up in prePath). - try { - // GetUserPass throws for some protocols without userPass - selfUri.userPass = ''; - } catch (ex) {} - } - - var dirs = aStr.split(";"); - - directive: - for each(var dir in dirs) { - dir = dir.trim(); - if (dir.length < 1) continue; - - var dirname = dir.split(/\s+/)[0].toLowerCase(); - var dirvalue = dir.substring(dirname.length).trim(); - - if (aCSPR._directives.hasOwnProperty(dirname)) { - // Check for (most) duplicate directives - cspError(aCSPR, CSPLocalizer.getFormatStr("duplicateDirective", - [dirname])); - CSPdebug("Skipping duplicate directive: \"" + dir + "\""); - continue directive; - } - - // OPTIONS DIRECTIVE //////////////////////////////////////////////// - if (dirname === CSPRep.OPTIONS_DIRECTIVE) { - if (aCSPR._allowInlineScripts || aCSPR._allowEval) { - // Check for duplicate options directives - cspError(aCSPR, CSPLocalizer.getFormatStr("duplicateDirective", - [dirname])); - CSPdebug("Skipping duplicate directive: \"" + dir + "\""); - continue directive; - } - - // grab value tokens and interpret them - var options = dirvalue.split(/\s+/); - for each (var opt in options) { - if (opt === "inline-script") - aCSPR._allowInlineScripts = true; - else if (opt === "eval-script") - aCSPR._allowEval = true; - else - cspWarn(aCSPR, CSPLocalizer.getFormatStr("ignoringUnknownOption", - [opt])); - } - continue directive; - } - - // ALLOW DIRECTIVE ////////////////////////////////////////////////// - // parse "allow" as equivalent to "default-src", at least until the spec - // stabilizes, at which time we can stop parsing "allow" - if (dirname === CSPRep.ALLOW_DIRECTIVE) { - cspWarn(aCSPR, CSPLocalizer.getStr("allowDirectiveIsDeprecated")); - if (aCSPR._directives.hasOwnProperty(SD.DEFAULT_SRC)) { - // Check for duplicate default-src and allow directives - cspError(aCSPR, CSPLocalizer.getFormatStr("duplicateDirective", - [dirname])); - CSPdebug("Skipping duplicate directive: \"" + dir + "\""); - continue directive; - } - var dv = CSPSourceList.fromString(dirvalue, aCSPR, selfUri, - enforceSelfChecks); - if (dv) { - aCSPR._directives[SD.DEFAULT_SRC] = dv; - continue directive; - } - } - - // SOURCE DIRECTIVES //////////////////////////////////////////////// - for each(var sdi in SD) { - if (dirname === sdi) { - // process dirs, and enforce that 'self' is defined. - var dv = CSPSourceList.fromString(dirvalue, aCSPR, selfUri, - enforceSelfChecks); - if (dv) { - aCSPR._directives[sdi] = dv; - continue directive; - } - } - } - - // REPORT URI /////////////////////////////////////////////////////// - if (dirname === UD.REPORT_URI) { - // might be space-separated list of URIs - var uriStrings = dirvalue.split(/\s+/); - var okUriStrings = []; - - for (let i in uriStrings) { - var uri = null; - try { - // Relative URIs are okay, but to ensure we send the reports to the - // right spot, the relative URIs are expanded here during parsing. - // The resulting CSPRep instance will have only absolute URIs. - uri = gIoService.newURI(uriStrings[i],null,selfUri); - - // if there's no host, this will throw NS_ERROR_FAILURE, causing a - // parse failure. - uri.host; - - // warn about, but do not prohibit non-http and non-https schemes for - // reporting URIs. The spec allows unrestricted URIs resolved - // relative to "self", but we should let devs know if the scheme is - // abnormal and may fail a POST. - if (!uri.schemeIs("http") && !uri.schemeIs("https")) { - cspWarn(aCSPR, CSPLocalizer.getFormatStr("reportURInotHttpsOrHttp2", - [uri.asciiSpec])); - } - } catch(e) { - switch (e.result) { - case Components.results.NS_ERROR_INSUFFICIENT_DOMAIN_LEVELS: - case Components.results.NS_ERROR_HOST_IS_IP_ADDRESS: - if (uri.host !== selfUri.host) { - cspWarn(aCSPR, - CSPLocalizer.getFormatStr("pageCannotSendReportsTo", - [selfUri.host, uri.host])); - continue; - } - break; - - default: - cspWarn(aCSPR, CSPLocalizer.getFormatStr("couldNotParseReportURI", - [uriStrings[i]])); - continue; - } - } - // all verification passed - okUriStrings.push(uri.asciiSpec); - } - aCSPR._directives[UD.REPORT_URI] = okUriStrings.join(' '); - continue directive; - } - - // POLICY URI ////////////////////////////////////////////////////////// - if (dirname === UD.POLICY_URI) { - // POLICY_URI can only be alone - if (aCSPR._directives.length > 0 || dirs.length > 1) { - cspError(aCSPR, CSPLocalizer.getStr("policyURINotAlone")); - return CSPRep.fromString("default-src 'none'", null, reportOnly); - } - // if we were called without a reference to the parent document request - // we won't be able to suspend it while we fetch the policy -> fail closed - if (!docRequest || !csp) { - cspError(aCSPR, CSPLocalizer.getStr("noParentRequest")); - return CSPRep.fromString("default-src 'none'", null, reportOnly); - } - - var uri = ''; - try { - uri = gIoService.newURI(dirvalue, null, selfUri); - } catch(e) { - cspError(aCSPR, CSPLocalizer.getFormatStr("policyURIParseError", - [dirvalue])); - return CSPRep.fromString("default-src 'none'", null, reportOnly); - } - - // Verify that policy URI comes from the same origin - if (selfUri) { - if (selfUri.host !== uri.host) { - cspError(aCSPR, CSPLocalizer.getFormatStr("nonMatchingHost", - [uri.host])); - return CSPRep.fromString("default-src 'none'", null, reportOnly); - } - if (selfUri.port !== uri.port) { - cspError(aCSPR, CSPLocalizer.getFormatStr("nonMatchingPort", - [uri.port.toString()])); - return CSPRep.fromString("default-src 'none'", null, reportOnly); - } - if (selfUri.scheme !== uri.scheme) { - cspError(aCSPR, CSPLocalizer.getFormatStr("nonMatchingScheme", - [uri.scheme])); - return CSPRep.fromString("default-src 'none'", null, reportOnly); - } - } - - // suspend the parent document request while we fetch the policy-uri - try { - docRequest.suspend(); - var chan = gIoService.newChannel(uri.asciiSpec, null, null); - // make request anonymous (no cookies, etc.) so the request for the - // policy-uri can't be abused for CSRF - chan.loadFlags |= Ci.nsIChannel.LOAD_ANONYMOUS; - chan.loadGroup = docRequest.loadGroup; - chan.asyncOpen(new CSPPolicyURIListener(uri, docRequest, csp, reportOnly), null); - } - catch (e) { - // resume the document request and apply most restrictive policy - docRequest.resume(); - cspError(aCSPR, CSPLocalizer.getFormatStr("errorFetchingPolicy", - [e.toString()])); - return CSPRep.fromString("default-src 'none'", null, reportOnly); - } - - // return a fully-open policy to be used until the contents of the - // policy-uri come back. - return CSPRep.fromString("default-src *", null, reportOnly); - } - - // UNIDENTIFIED DIRECTIVE ///////////////////////////////////////////// - cspWarn(aCSPR, CSPLocalizer.getFormatStr("couldNotProcessUnknownDirective", - [dirname])); - - } // end directive: loop - - // the X-Content-Security-Policy syntax requires an allow or default-src - // directive to be present. - if (!aCSPR._directives[SD.DEFAULT_SRC]) { - cspWarn(aCSPR, CSPLocalizer.getStr("allowOrDefaultSrcRequired")); - return CSPRep.fromString("default-src 'none'", null, reportOnly); - } - - // If this is a Report-Only header and report-uri is not in the directive - // list, tell developer either specify report-uri directive or use - // a non-Report-Only CSP header. - if (aCSPR._reportOnlyMode && !aCSPR._directives.hasOwnProperty(UD.REPORT_URI)) { - cspWarn(aCSPR, CSPLocalizer.getFormatStr("reportURInotInReportOnlyHeader", - [selfUri ? selfUri.prePath : "undefined"])) - } - - return aCSPR; -}; - /** * Factory to create a new CSPRep, parsed from a string, compliant * with the CSP 1.0 spec. @@ -556,13 +268,11 @@ CSPRep.fromString = function(aStr, self, reportOnly, docRequest, csp, * @returns * an instance of CSPRep */ -// When we deprecate our original CSP implementation, we rename this to -// CSPRep.fromString and remove the existing CSPRep.fromString above. -CSPRep.fromStringSpecCompliant = function(aStr, self, reportOnly, docRequest, csp, - enforceSelfChecks) { - var SD = CSPRep.SRC_DIRECTIVES_NEW; +CSPRep.fromString = function(aStr, self, reportOnly, docRequest, csp, + enforceSelfChecks) { + var SD = CSPRep.SRC_DIRECTIVES; var UD = CSPRep.URI_DIRECTIVES; - var aCSPR = new CSPRep(true); + var aCSPR = new CSPRep(); aCSPR._originalText = aStr; aCSPR._innerWindowID = innerWindowFromRequest(docRequest); if (typeof reportOnly === 'undefined') reportOnly = false; @@ -587,7 +297,10 @@ CSPRep.fromStringSpecCompliant = function(aStr, self, reportOnly, docRequest, cs var dirname = dir.split(/\s+/)[0].toLowerCase(); var dirvalue = dir.substring(dirname.length).trim(); - dirs[dirname] = dirvalue; + // skip duplicates + if (!dirs.hasOwnProperty(dirname)) { + dirs[dirname] = dirvalue; + } } // Spec compliant policies have different default behavior for inline @@ -712,13 +425,13 @@ CSPRep.fromStringSpecCompliant = function(aStr, self, reportOnly, docRequest, cs // POLICY_URI can only be alone if (aCSPR._directives.length > 0 || dirs.length > 1) { cspError(aCSPR, CSPLocalizer.getStr("policyURINotAlone")); - return CSPRep.fromStringSpecCompliant("default-src 'none'", null, reportOnly); + return CSPRep.fromString("default-src 'none'", null, reportOnly); } // if we were called without a reference to the parent document request // we won't be able to suspend it while we fetch the policy -> fail closed if (!docRequest || !csp) { cspError(aCSPR, CSPLocalizer.getStr("noParentRequest")); - return CSPRep.fromStringSpecCompliant("default-src 'none'", null, reportOnly); + return CSPRep.fromString("default-src 'none'", null, reportOnly); } var uri = ''; @@ -726,22 +439,22 @@ CSPRep.fromStringSpecCompliant = function(aStr, self, reportOnly, docRequest, cs uri = gIoService.newURI(dirvalue, null, selfUri); } catch(e) { cspError(aCSPR, CSPLocalizer.getFormatStr("policyURIParseError", [dirvalue])); - return CSPRep.fromStringSpecCompliant("default-src 'none'", null, reportOnly); + return CSPRep.fromString("default-src 'none'", null, reportOnly); } // Verify that policy URI comes from the same origin if (selfUri) { if (selfUri.host !== uri.host){ cspError(aCSPR, CSPLocalizer.getFormatStr("nonMatchingHost", [uri.host])); - return CSPRep.fromStringSpecCompliant("default-src 'none'", null, reportOnly); + return CSPRep.fromString("default-src 'none'", null, reportOnly); } if (selfUri.port !== uri.port){ cspError(aCSPR, CSPLocalizer.getFormatStr("nonMatchingPort", [uri.port.toString()])); - return CSPRep.fromStringSpecCompliant("default-src 'none'", null, reportOnly); + return CSPRep.fromString("default-src 'none'", null, reportOnly); } if (selfUri.scheme !== uri.scheme){ cspError(aCSPR, CSPLocalizer.getFormatStr("nonMatchingScheme", [uri.scheme])); - return CSPRep.fromStringSpecCompliant("default-src 'none'", null, reportOnly); + return CSPRep.fromString("default-src 'none'", null, reportOnly); } } @@ -759,12 +472,12 @@ CSPRep.fromStringSpecCompliant = function(aStr, self, reportOnly, docRequest, cs // resume the document request and apply most restrictive policy docRequest.resume(); cspError(aCSPR, CSPLocalizer.getFormatStr("errorFetchingPolicy", [e.toString()])); - return CSPRep.fromStringSpecCompliant("default-src 'none'", null, reportOnly); + return CSPRep.fromString("default-src 'none'", null, reportOnly); } // return a fully-open policy to be used until the contents of the // policy-uri come back - return CSPRep.fromStringSpecCompliant("default-src *", null, reportOnly); + return CSPRep.fromString("default-src *", null, reportOnly); } // UNIDENTIFIED DIRECTIVE ///////////////////////////////////////////// @@ -819,10 +532,6 @@ CSPRep.prototype = { function csp_toString() { var dirs = []; - if (!this._specCompliant && (this._allowEval || this._allowInlineScripts)) { - dirs.push("options" + (this._allowEval ? " eval-script" : "") - + (this._allowInlineScripts ? " inline-script" : "")); - } for (var i in this._directives) { if (this._directives[i]) { dirs.push(i + " " + this._directives[i].toString()); @@ -867,7 +576,7 @@ CSPRep.prototype = { return true; // make sure the right directive set is used - let DIRS = this._specCompliant ? CSPRep.SRC_DIRECTIVES_NEW : CSPRep.SRC_DIRECTIVES_OLD; + let DIRS = CSPRep.SRC_DIRECTIVES; let directiveInPolicy = false; for (var i in DIRS) { @@ -904,8 +613,8 @@ CSPRep.prototype = { } // no relevant directives present -- this means for CSP 1.0 that the load - // should be permitted (and for the old CSP, to block it). - return this._specCompliant; + // should be permitted. + return true; }, /** @@ -1541,7 +1250,11 @@ CSPSource.prototype = { s = s + this.scheme + "://"; if (this._host) s = s + this._host; - if (this.port) + + // CSP 1.0 4.11 says the report should use URI-reference from RFC 3986, + // 3.2.3 and indicates that the default port should be omitted. + // Non-default ports are included. + if (this.port && gIoService.getProtocolHandler(this.scheme).defaultPort != this.port) s = s + ":" + this.port; return s; }, diff --git a/content/base/src/contentSecurityPolicy.js b/content/base/src/contentSecurityPolicy.js index 21e78a14ce0a..07e204b1dff5 100644 --- a/content/base/src/contentSecurityPolicy.js +++ b/content/base/src/contentSecurityPolicy.js @@ -24,11 +24,6 @@ const Cu = Components.utils; const CSP_VIOLATION_TOPIC = "csp-on-violate-policy"; -// Needed to support CSP 1.0 spec and our original CSP implementation - should -// be removed when our original implementation is deprecated. -const CSP_TYPE_XMLHTTPREQUEST_SPEC_COMPLIANT = "csp_type_xmlhttprequest_spec_compliant"; -const CSP_TYPE_WEBSOCKET_SPEC_COMPLIANT = "csp_type_websocket_spec_compliant"; - const WARN_FLAG = Ci.nsIScriptError.warningFlag; const ERROR_FLAG = Ci.nsIScriptError.ERROR_FLAG; @@ -71,14 +66,13 @@ function ContentSecurityPolicy() { { let cp = Ci.nsIContentPolicy; let csp = ContentSecurityPolicy; - let cspr_sd_old = CSPRep.SRC_DIRECTIVES_OLD; - let cspr_sd_new = CSPRep.SRC_DIRECTIVES_NEW; + let cspr_sd = CSPRep.SRC_DIRECTIVES; csp._MAPPINGS=[]; /* default, catch-all case */ // This is the same in old and new CSP so use the new mapping. - csp._MAPPINGS[cp.TYPE_OTHER] = cspr_sd_new.DEFAULT_SRC; + csp._MAPPINGS[cp.TYPE_OTHER] = cspr_sd.DEFAULT_SRC; /* self */ csp._MAPPINGS[cp.TYPE_DOCUMENT] = null; @@ -87,44 +81,26 @@ function ContentSecurityPolicy() { csp._MAPPINGS[cp.TYPE_REFRESH] = null; /* categorized content types */ - // These are the same in old and new CSP's so just use the new mappings. - csp._MAPPINGS[cp.TYPE_SCRIPT] = cspr_sd_new.SCRIPT_SRC; - csp._MAPPINGS[cp.TYPE_IMAGE] = cspr_sd_new.IMG_SRC; - csp._MAPPINGS[cp.TYPE_STYLESHEET] = cspr_sd_new.STYLE_SRC; - csp._MAPPINGS[cp.TYPE_OBJECT] = cspr_sd_new.OBJECT_SRC; - csp._MAPPINGS[cp.TYPE_OBJECT_SUBREQUEST] = cspr_sd_new.OBJECT_SRC; - csp._MAPPINGS[cp.TYPE_SUBDOCUMENT] = cspr_sd_new.FRAME_SRC; - csp._MAPPINGS[cp.TYPE_MEDIA] = cspr_sd_new.MEDIA_SRC; - csp._MAPPINGS[cp.TYPE_FONT] = cspr_sd_new.FONT_SRC; - csp._MAPPINGS[cp.TYPE_XSLT] = cspr_sd_new.SCRIPT_SRC; - csp._MAPPINGS[cp.TYPE_BEACON] = cspr_sd_new.CONNECT_SRC; - - /* Our original CSP implementation's mappings for XHR and websocket - * These should be changed to be = cspr_sd.CONNECT_SRC when we remove - * the original implementation - NOTE: order in this array is important !!! - */ - csp._MAPPINGS[cp.TYPE_XMLHTTPREQUEST] = cspr_sd_old.XHR_SRC; - csp._MAPPINGS[cp.TYPE_WEBSOCKET] = cspr_sd_old.XHR_SRC; + csp._MAPPINGS[cp.TYPE_SCRIPT] = cspr_sd.SCRIPT_SRC; + csp._MAPPINGS[cp.TYPE_IMAGE] = cspr_sd.IMG_SRC; + csp._MAPPINGS[cp.TYPE_STYLESHEET] = cspr_sd.STYLE_SRC; + csp._MAPPINGS[cp.TYPE_OBJECT] = cspr_sd.OBJECT_SRC; + csp._MAPPINGS[cp.TYPE_OBJECT_SUBREQUEST] = cspr_sd.OBJECT_SRC; + csp._MAPPINGS[cp.TYPE_SUBDOCUMENT] = cspr_sd.FRAME_SRC; + csp._MAPPINGS[cp.TYPE_MEDIA] = cspr_sd.MEDIA_SRC; + csp._MAPPINGS[cp.TYPE_FONT] = cspr_sd.FONT_SRC; + csp._MAPPINGS[cp.TYPE_XSLT] = cspr_sd.SCRIPT_SRC; + csp._MAPPINGS[cp.TYPE_BEACON] = cspr_sd.CONNECT_SRC; + csp._MAPPINGS[cp.TYPE_XMLHTTPREQUEST] = cspr_sd.CONNECT_SRC; + csp._MAPPINGS[cp.TYPE_WEBSOCKET] = cspr_sd.CONNECT_SRC; /* CSP cannot block CSP reports */ csp._MAPPINGS[cp.TYPE_CSP_REPORT] = null; /* These must go through the catch-all */ - csp._MAPPINGS[cp.TYPE_XBL] = cspr_sd_new.DEFAULT_SRC; - csp._MAPPINGS[cp.TYPE_PING] = cspr_sd_new.DEFAULT_SRC; - csp._MAPPINGS[cp.TYPE_DTD] = cspr_sd_new.DEFAULT_SRC; - - /* CSP 1.0 spec compliant mappings for XHR and websocket */ - // The directive name for XHR, websocket, and EventSource is different - // in the 1.0 spec than in our original implementation, these mappings - // address this. These won't be needed when we deprecate our original - // implementation. - csp._MAPPINGS[CSP_TYPE_XMLHTTPREQUEST_SPEC_COMPLIANT] = cspr_sd_new.CONNECT_SRC; - csp._MAPPINGS[CSP_TYPE_WEBSOCKET_SPEC_COMPLIANT] = cspr_sd_new.CONNECT_SRC; - // TODO : EventSource will be here and also will use connect-src - // after we fix Bug 802872 - CSP should restrict EventSource using the connect-src - // directive. For background see Bug 667490 - EventSource should use the same - // nsIContentPolicy type as XHR (which is fixed) + csp._MAPPINGS[cp.TYPE_XBL] = cspr_sd.DEFAULT_SRC; + csp._MAPPINGS[cp.TYPE_PING] = cspr_sd.DEFAULT_SRC; + csp._MAPPINGS[cp.TYPE_DTD] = cspr_sd.DEFAULT_SRC; } ContentSecurityPolicy.prototype = { @@ -157,7 +133,7 @@ ContentSecurityPolicy.prototype = { _buildViolatedDirectiveString: function(aDirectiveName, aPolicy) { - var SD = CSPRep.SRC_DIRECTIVES_NEW; + var SD = CSPRep.SRC_DIRECTIVES; var cspContext = (SD[aDirectiveName] in aPolicy._directives) ? SD[aDirectiveName] : SD.DEFAULT_SRC; var directive = aPolicy._directives[cspContext]; return cspContext + ' ' + directive.toString(); @@ -410,8 +386,7 @@ ContentSecurityPolicy.prototype = { */ appendPolicy: function csp_appendPolicy(aPolicy, selfURI, aReportOnly, aSpecCompliant) { - return this._appendPolicyInternal(aPolicy, selfURI, aReportOnly, - aSpecCompliant, true); + return this._appendPolicyInternal(aPolicy, selfURI, aReportOnly, true); }, /** @@ -420,12 +395,10 @@ ContentSecurityPolicy.prototype = { * @returns the count of policies. */ _appendPolicyInternal: - function csp_appendPolicy(aPolicy, selfURI, aReportOnly, aSpecCompliant, - aEnforceSelfChecks) { + function csp_appendPolicy(aPolicy, selfURI, aReportOnly, aEnforceSelfChecks) { #ifndef MOZ_B2G CSPdebug("APPENDING POLICY: " + aPolicy); CSPdebug(" SELF: " + (selfURI ? selfURI.asciiSpec : " null")); - CSPdebug("CSP 1.0 COMPLIANT : " + aSpecCompliant); #endif // For nested schemes such as view-source: make sure we are taking the @@ -446,26 +419,9 @@ ContentSecurityPolicy.prototype = { // Note that we pass the full URI since when it's parsed as 'self' to construct a // CSPSource only the scheme, host, and port are kept. - // If we want to be CSP 1.0 spec compliant, use the new parser. - // The old one will be deprecated in the future and will be - // removed at that time. - if (aSpecCompliant) { - newpolicy = CSPRep.fromStringSpecCompliant(aPolicy, - selfURI, - aReportOnly, - this._weakDocRequest.get(), - this, - aEnforceSelfChecks); - } else { - newpolicy = CSPRep.fromString(aPolicy, - selfURI, - aReportOnly, - this._weakDocRequest.get(), - this, - aEnforceSelfChecks); - } - - newpolicy._specCompliant = !!aSpecCompliant; + newpolicy = CSPRep.fromString(aPolicy, selfURI, aReportOnly, + this._weakDocRequest.get(), + this, aEnforceSelfChecks); newpolicy._isInitialized = true; this._policies.push(newpolicy); this._cache.clear(); // reset cache since effective policy changes @@ -711,7 +667,7 @@ ContentSecurityPolicy.prototype = { // scan the discovered ancestors // frame-ancestors is the same in both old and new source directives, // so don't need to differentiate here. - let cspContext = CSPRep.SRC_DIRECTIVES_NEW.FRAME_ANCESTORS; + let cspContext = CSPRep.SRC_DIRECTIVES.FRAME_ANCESTORS; for (let i in ancestors) { let ancestor = ancestors[i]; if (!policy.permits(ancestor, cspContext)) { @@ -806,22 +762,11 @@ ContentSecurityPolicy.prototype = { for (let policyIndex=0; policyIndex < this._policies.length; policyIndex++) { let policy = this._policies[policyIndex]; + cspContext = ContentSecurityPolicy._MAPPINGS[aContentType]; + #ifndef MOZ_B2G - CSPdebug("policy is " + (policy._specCompliant ? - "1.0 compliant" : "pre-1.0")); CSPdebug("policy is " + (policy._reportOnlyMode ? "report-only" : "blocking")); -#endif - - if (aContentType == cp.TYPE_XMLHTTPREQUEST && this._policies[policyIndex]._specCompliant) { - cspContext = ContentSecurityPolicy._MAPPINGS[CSP_TYPE_XMLHTTPREQUEST_SPEC_COMPLIANT]; - } else if (aContentType == cp.TYPE_WEBSOCKET && this._policies[policyIndex]._specCompliant) { - cspContext = ContentSecurityPolicy._MAPPINGS[CSP_TYPE_WEBSOCKET_SPEC_COMPLIANT]; - } else { - cspContext = ContentSecurityPolicy._MAPPINGS[aContentType]; - } - -#ifndef MOZ_B2G CSPdebug("shouldLoad cspContext = " + cspContext); #endif @@ -979,11 +924,9 @@ ContentSecurityPolicy.prototype = { for (let pCount = aStream.read32(); pCount > 0; pCount--) { let polStr = aStream.readString(); let reportOnly = aStream.readBoolean(); - let specCompliant = aStream.readBoolean(); // don't need self info because when the policy is turned back into a // string, 'self' is replaced with the explicit source expression. - this._appendPolicyInternal(polStr, null, reportOnly, specCompliant, - false); + this._appendPolicyInternal(polStr, null, reportOnly, false); } // NOTE: the document instance that's deserializing this object (via its @@ -1010,7 +953,6 @@ ContentSecurityPolicy.prototype = { for each (var policy in this._policies) { aStream.writeWStringZ(policy.toString()); aStream.writeBoolean(policy._reportOnlyMode); - aStream.writeBoolean(policy._specCompliant); } }, }; diff --git a/content/base/src/nsCSPContext.cpp b/content/base/src/nsCSPContext.cpp index cef82a50e746..1fe8527b7140 100644 --- a/content/base/src/nsCSPContext.cpp +++ b/content/base/src/nsCSPContext.cpp @@ -821,6 +821,7 @@ class CSPReportSenderRunnable MOZ_FINAL : public nsRunnable CSPReportSenderRunnable(nsISupports* aBlockedContentSource, nsIURI* aOriginalURI, uint32_t aViolatedPolicyIndex, + bool aReportOnlyFlag, const nsAString& aViolatedDirective, const nsAString& aObserverSubject, const nsAString& aSourceFile, @@ -831,6 +832,7 @@ class CSPReportSenderRunnable MOZ_FINAL : public nsRunnable : mBlockedContentSource(aBlockedContentSource) , mOriginalURI(aOriginalURI) , mViolatedPolicyIndex(aViolatedPolicyIndex) + , mReportOnlyFlag(aReportOnlyFlag) , mViolatedDirective(aViolatedDirective) , mSourceFile(aSourceFile) , mScriptSample(aScriptSample) @@ -887,7 +889,9 @@ class CSPReportSenderRunnable MOZ_FINAL : public nsRunnable nsString blockedDataChar16 = NS_ConvertUTF8toUTF16(blockedDataStr); const char16_t* params[] = { mViolatedDirective.get(), blockedDataChar16.get() }; - CSP_LogLocalizedStr(NS_LITERAL_STRING("CSPViolationWithURI").get(), + + CSP_LogLocalizedStr(mReportOnlyFlag ? NS_LITERAL_STRING("CSPROViolationWithURI").get() : + NS_LITERAL_STRING("CSPViolationWithURI").get(), params, ArrayLength(params), mSourceFile, mScriptSample, mLineNum, 0, nsIScriptError::errorFlag, "CSP", mInnerWindowID); @@ -899,6 +903,7 @@ class CSPReportSenderRunnable MOZ_FINAL : public nsRunnable nsCOMPtr mBlockedContentSource; nsCOMPtr mOriginalURI; uint32_t mViolatedPolicyIndex; + bool mReportOnlyFlag; nsString mViolatedDirective; nsCOMPtr mObserverSubject; nsString mSourceFile; @@ -943,9 +948,12 @@ nsCSPContext::AsyncReportViolation(nsISupports* aBlockedContentSource, const nsAString& aScriptSample, uint32_t aLineNum) { + NS_ENSURE_ARG_MAX(aViolatedPolicyIndex, mPolicies.Length() - 1); + NS_DispatchToMainThread(new CSPReportSenderRunnable(aBlockedContentSource, aOriginalURI, aViolatedPolicyIndex, + mPolicies[aViolatedPolicyIndex]->getReportOnlyFlag(), aViolatedDirective, aObserverSubject, aSourceFile, diff --git a/content/base/src/nsContentList.cpp b/content/base/src/nsContentList.cpp index 7c3ed5b7b68e..ed0027825dad 100644 --- a/content/base/src/nsContentList.cpp +++ b/content/base/src/nsContentList.cpp @@ -519,7 +519,7 @@ nsContentList::Item(uint32_t aIndex, bool aDoFlush) } if (mState != LIST_UP_TO_DATE) - PopulateSelf(std::min(aIndex, uint32_t(UINT32_MAX - 1)) + 1); + PopulateSelf(std::min(aIndex, UINT32_MAX - 1) + 1); ASSERT_IN_SYNC; NS_ASSERTION(!mRootNode || mState != LIST_DIRTY, diff --git a/content/base/src/nsDocument.cpp b/content/base/src/nsDocument.cpp index 1076ddd26c81..a6153a1be76b 100644 --- a/content/base/src/nsDocument.cpp +++ b/content/base/src/nsDocument.cpp @@ -2682,18 +2682,9 @@ nsDocument::InitCSP(nsIChannel* aChannel) } nsAutoCString tCspHeaderValue, tCspROHeaderValue; - nsAutoCString tCspOldHeaderValue, tCspOldROHeaderValue; nsCOMPtr httpChannel = do_QueryInterface(aChannel); if (httpChannel) { - httpChannel->GetResponseHeader( - NS_LITERAL_CSTRING("x-content-security-policy"), - tCspOldHeaderValue); - - httpChannel->GetResponseHeader( - NS_LITERAL_CSTRING("x-content-security-policy-report-only"), - tCspOldROHeaderValue); - httpChannel->GetResponseHeader( NS_LITERAL_CSTRING("content-security-policy"), tCspHeaderValue); @@ -2704,35 +2695,6 @@ nsDocument::InitCSP(nsIChannel* aChannel) } NS_ConvertASCIItoUTF16 cspHeaderValue(tCspHeaderValue); NS_ConvertASCIItoUTF16 cspROHeaderValue(tCspROHeaderValue); - NS_ConvertASCIItoUTF16 cspOldHeaderValue(tCspOldHeaderValue); - NS_ConvertASCIItoUTF16 cspOldROHeaderValue(tCspOldROHeaderValue); - - // Only use the CSP 1.0 spec compliant headers if a pref to do so - // is set. This lets us turn on the 1.0 parser per platform. This - // pref is also set by the tests for 1.0 spec compliant CSP. - bool specCompliantEnabled = - Preferences::GetBool("security.csp.speccompliant"); - - // If spec compliant pref isn't set, pretend we never got these headers. - if ((!cspHeaderValue.IsEmpty() || !cspROHeaderValue.IsEmpty()) && - !specCompliantEnabled) { - PR_LOG(gCspPRLog, PR_LOG_DEBUG, - ("Got spec compliant CSP headers but pref was not set")); - cspHeaderValue.Truncate(); - cspROHeaderValue.Truncate(); - } - - // If both the new header AND the old header are present, warn that - // the old header will be ignored. Otherwise, if the old header is - // present, warn that it will be deprecated. - bool oldHeaderIsPresent = !cspOldHeaderValue.IsEmpty() || !cspOldROHeaderValue.IsEmpty(); - bool newHeaderIsPresent = !cspHeaderValue.IsEmpty() || !cspROHeaderValue.IsEmpty(); - - if (oldHeaderIsPresent && newHeaderIsPresent) { - mCSPWebConsoleErrorQueue.Add("BothCSPHeadersPresent"); - } else if (oldHeaderIsPresent) { - mCSPWebConsoleErrorQueue.Add("OldCSPHeaderDeprecated"); - } // Figure out if we need to apply an app default CSP or a CSP from an app manifest nsIPrincipal* principal = NodePrincipal(); @@ -2760,9 +2722,7 @@ nsDocument::InitCSP(nsIChannel* aChannel) if (!applyAppDefaultCSP && !applyAppManifestCSP && cspHeaderValue.IsEmpty() && - cspROHeaderValue.IsEmpty() && - cspOldHeaderValue.IsEmpty() && - cspOldROHeaderValue.IsEmpty()) { + cspROHeaderValue.IsEmpty()) { #ifdef PR_LOGGING nsCOMPtr chanURI; aChannel->GetURI(getter_AddRefs(chanURI)); @@ -2812,7 +2772,7 @@ nsDocument::InitCSP(nsIChannel* aChannel) // * however, we still support XCSP headers during the transition phase // and fall back to the JS implementation if we find an XCSP header. - if (newHeaderIsPresent && CSPService::sNewBackendEnabled) { + if (CSPService::sNewBackendEnabled) { csp = do_CreateInstance("@mozilla.org/cspcontext;1", &rv); } else { @@ -2845,36 +2805,25 @@ nsDocument::InitCSP(nsIChannel* aChannel) } if (appCSP) { - // Use the 1.0 CSP parser for apps if the pref to do so is set. - csp->AppendPolicy(appCSP, selfURI, false, specCompliantEnabled); + csp->AppendPolicy(appCSP, selfURI, false, true); } } // ----- if the doc is an app and specifies a CSP in its manifest, apply it. if (applyAppManifestCSP) { - // Use the 1.0 CSP parser for apps if the pref to do so is set. - csp->AppendPolicy(appManifestCSP, selfURI, false, specCompliantEnabled); + csp->AppendPolicy(appManifestCSP, selfURI, false, true); } - // While we are supporting both CSP 1.0 and the x- headers, the 1.0 headers - // take priority. If both are present, the x-* headers are ignored. - // ----- if there's a full-strength CSP header, apply it. if (!cspHeaderValue.IsEmpty()) { rv = AppendCSPFromHeader(csp, cspHeaderValue, selfURI, false, true); NS_ENSURE_SUCCESS(rv, rv); - } else if (!cspOldHeaderValue.IsEmpty()) { - rv = AppendCSPFromHeader(csp, cspOldHeaderValue, selfURI, false, false); - NS_ENSURE_SUCCESS(rv, rv); } // ----- if there's a report-only CSP header, apply it. if (!cspROHeaderValue.IsEmpty()) { rv = AppendCSPFromHeader(csp, cspROHeaderValue, selfURI, true, true); NS_ENSURE_SUCCESS(rv, rv); - } else if (!cspOldROHeaderValue.IsEmpty()) { - rv = AppendCSPFromHeader(csp, cspOldROHeaderValue, selfURI, true, false); - NS_ENSURE_SUCCESS(rv, rv); } // ----- Enforce frame-ancestor policy on any applied policies diff --git a/content/base/src/nsDocument.h b/content/base/src/nsDocument.h index c6c8864fa191..5e1e505e224f 100644 --- a/content/base/src/nsDocument.h +++ b/content/base/src/nsDocument.h @@ -1715,7 +1715,7 @@ private: nsRefPtr mImportManager; #ifdef DEBUG -protected: +public: bool mWillReparent; #endif }; diff --git a/content/base/test/moz.build b/content/base/test/moz.build index f1a059ae904b..9a8b309ce7eb 100644 --- a/content/base/test/moz.build +++ b/content/base/test/moz.build @@ -6,7 +6,6 @@ TEST_TOOL_DIRS += [ 'csp', - 'xcsp', 'websocket_hybi', ] diff --git a/content/base/test/unit/test_bug558431.js b/content/base/test/unit/test_bug558431.js deleted file mode 100644 index 2842f3cabf4e..000000000000 --- a/content/base/test/unit/test_bug558431.js +++ /dev/null @@ -1,163 +0,0 @@ - -const Cc = Components.classes; -const Ci = Components.interfaces; -const Cu = Components.utils; -const Cr = Components.results; - -Cu.import('resource://gre/modules/CSPUtils.jsm'); - -var httpserv = null; - -const POLICY_FROM_URI = "allow 'self'; img-src *"; -const POLICY_PORT = 9000; -const POLICY_URI = "http://localhost:" + POLICY_PORT + "/policy"; -const POLICY_URI_RELATIVE = "/policy"; -const DOCUMENT_URI = "http://localhost:" + POLICY_PORT + "/document"; -const CSP_DOC_BODY = "CSP doc content"; -const SD = CSPRep.SRC_DIRECTIVES; - -// this will get populated by run_tests() -var TESTS = []; - -// helper to make URIs -function mkuri(foo) { - return Cc["@mozilla.org/network/io-service;1"] - .getService(Ci.nsIIOService) - .newURI(foo, null, null); -} - -// helper to use .equals on stuff -function do_check_equivalent(foo, bar, stack) { - if (!stack) - stack = Components.stack.caller; - - var text = foo + ".equals(" + bar + ")"; - - if (foo.equals && foo.equals(bar)) { - dump("TEST-PASS | " + stack.filename + " | [" + stack.name + " : " + - stack.lineNumber + "] " + text + "\n"); - return; - } - do_throw(text, stack); -} - -function listener(csp, cspr_static) { - this.buffer = ""; - this._csp = csp; - this._cspr_static = cspr_static; -} - -listener.prototype = { - onStartRequest: function (request, ctx) { - }, - - onDataAvailable: function (request, ctx, stream, offset, count) { - var sInputStream = Cc["@mozilla.org/scriptableinputstream;1"] - .createInstance(Ci.nsIScriptableInputStream); - sInputStream.init(stream); - this.buffer = this.buffer.concat(sInputStream.read(count)); - }, - - onStopRequest: function (request, ctx, status) { - // make sure that we have the full document content, guaranteeing that - // the document channel has been resumed, before we do the comparisons - if (this.buffer == CSP_DOC_BODY) { - - // need to re-grab cspr since it may have changed inside the document's - // nsIContentSecurityPolicy instance. The problem is, this cspr_str is a - // string and not a policy due to the way it's exposed from - // nsIContentSecurityPolicy, so we have to re-parse it. - let cspr_str = this._csp.getPolicy(0); - let cspr = CSPRep.fromString(cspr_str, mkuri(DOCUMENT_URI)); - - // and in reparsing it, we lose the 'self' relationships, so need to also - // reparse the static one (or find a way to resolve 'self' in the parsed - // policy when doing comparisons). - let cspr_static_str = this._cspr_static.toString(); - let cspr_static_reparse = CSPRep.fromString(cspr_static_str, mkuri(DOCUMENT_URI)); - - // not null, and one policy .equals the other one - do_check_neq(null, cspr); - do_check_true(cspr.equals(cspr_static_reparse)); - - // final teardown - if (TESTS.length == 0) { - httpserv.stop(do_test_finished); - } else { - do_test_finished(); - (TESTS.shift())(); - } - } - } -}; - -function run_test() { - httpserv = new HttpServer(); - httpserv.registerPathHandler("/document", csp_doc_response); - httpserv.registerPathHandler("/policy", csp_policy_response); - httpserv.start(POLICY_PORT); - TESTS = [ test_CSPRep_fromPolicyURI, test_CSPRep_fromRelativePolicyURI ]; - - // when this triggers the "onStopRequest" callback, it'll - // go to the next test. - (TESTS.shift())(); -} - -function makeChan(url) { - var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); - var chan = ios.newChannel(url, null, null).QueryInterface(Ci.nsIHttpChannel); - return chan; -} - -function csp_doc_response(metadata, response) { - response.setStatusLine(metadata.httpVersion, 200, "OK"); - response.setHeader("Content-Type", "text/html", false); - response.bodyOutputStream.write(CSP_DOC_BODY, CSP_DOC_BODY.length); -} - -function csp_policy_response(metadata, response) { - response.setStatusLine(metadata.httpVersion, 200, "OK"); - response.setHeader("Content-Type", "text/csp", false); - response.bodyOutputStream.write(POLICY_FROM_URI, POLICY_FROM_URI.length); -} - -///////////////////// TEST POLICY_URI ////////////////////// -function test_CSPRep_fromPolicyURI() { - do_test_pending(); - let csp = Cc["@mozilla.org/contentsecuritypolicy;1"] - .createInstance(Ci.nsIContentSecurityPolicy); - // once the policy-uri is returned we will compare our static CSPRep with one - // we generated from the content we got back from the network to make sure - // they are equivalent - let cspr_static = CSPRep.fromString(POLICY_FROM_URI, mkuri(DOCUMENT_URI)); - - // simulates the request for the parent document - var docChan = makeChan(DOCUMENT_URI); - docChan.asyncOpen(new listener(csp, cspr_static), null); - - // the resulting policy here can be discarded, since it's going to be - // "allow *"; when the policy-uri fetching call-back happens, the *real* - // policy will be in csp.policy - CSPRep.fromString("policy-uri " + POLICY_URI, - mkuri(DOCUMENT_URI), false, docChan, csp); -} - -function test_CSPRep_fromRelativePolicyURI() { - do_test_pending(); - let csp = Cc["@mozilla.org/contentsecuritypolicy;1"] - .createInstance(Ci.nsIContentSecurityPolicy); - // once the policy-uri is returned we will compare our static CSPRep with one - // we generated from the content we got back from the network to make sure - // they are equivalent - let cspr_static = CSPRep.fromString(POLICY_FROM_URI, mkuri(DOCUMENT_URI)); - - // simulates the request for the parent document - var docChan = makeChan(DOCUMENT_URI); - docChan.asyncOpen(new listener(csp, cspr_static), null); - - // the resulting policy here can be discarded, since it's going to be - // "allow *"; when the policy-uri fetching call-back happens, the *real* - // policy will be in csp.policy - CSPRep.fromString("policy-uri " + POLICY_URI_RELATIVE, - mkuri(DOCUMENT_URI), false, docChan, csp); -} diff --git a/content/base/test/unit/test_csp_ignores_path.js b/content/base/test/unit/test_csp_ignores_path.js index 7c514f2b39c5..d76e27fcaef4 100644 --- a/content/base/test/unit/test_csp_ignores_path.js +++ b/content/base/test/unit/test_csp_ignores_path.js @@ -27,7 +27,7 @@ function testValidSRCsHostSourceWithSchemeAndPath() { ] var obj; - var expected = "http://test1.example.com:80"; + var expected = "http://test1.example.com"; for (let i in csps) { var src = csps[i]; obj = CSPSourceList.fromString(src, undefined, self); @@ -53,7 +53,7 @@ function testValidSRCsRegularHost() { ] var obj; - var expected = "http://test1.example.com:80"; + var expected = "http://test1.example.com"; for (let i in csps) { var src = csps[i]; obj = CSPSourceList.fromString(src, undefined, self); @@ -77,7 +77,7 @@ function testValidSRCsWildCardHost() { ] var obj; - var expected = "http://*.example.com:80"; + var expected = "http://*.example.com"; for (let i in csps) { var src = csps[i]; obj = CSPSourceList.fromString(src, undefined, self); @@ -99,7 +99,7 @@ function testValidSRCsRegularPort() { ] var obj; - var expected = "http://test1.example.com:80"; + var expected = "http://test1.example.com"; for (let i in csps) { var src = csps[i]; obj = CSPSourceList.fromString(src, undefined, self); diff --git a/content/base/test/unit/test_cspreports.js b/content/base/test/unit/test_cspreports.js index 7be4b9aad27c..20e752a5dbf7 100644 --- a/content/base/test/unit/test_cspreports.js +++ b/content/base/test/unit/test_cspreports.js @@ -63,8 +63,9 @@ function makeTest(id, expectedJSON, useReportOnlyPolicy, callback) { // set up a new CSP instance for each test. var csp = Cc["@mozilla.org/contentsecuritypolicy;1"] + //var csp = Cc["@mozilla.org/cspcontext;1"] .createInstance(Ci.nsIContentSecurityPolicy); - var policy = "allow 'none'; " + + var policy = "default-src 'none'; " + "report-uri " + REPORT_SERVER_URI + ":" + REPORT_SERVER_PORT + "/test" + id; @@ -80,7 +81,7 @@ function makeTest(id, expectedJSON, useReportOnlyPolicy, callback) { // Load up the policy // set as report-only if that's the case - csp.appendPolicy(policy, selfuri, useReportOnlyPolicy, false); + csp.appendPolicy(policy, selfuri, useReportOnlyPolicy, true); // prime the report server var handler = makeReportHandler("/test" + id, "Test " + id, expectedJSON); diff --git a/content/base/test/unit/test_csputils.js b/content/base/test/unit/test_csputils.js index f4731df6833a..0d0002bb6a49 100644 --- a/content/base/test/unit/test_csputils.js +++ b/content/base/test/unit/test_csputils.js @@ -35,7 +35,7 @@ function do_check_in_array(arr, val, stack) { var text = val + " in [" + arr.join(",") + "]"; for(var i in arr) { - dump(".......... " + i + "> " + arr[i] + "\n"); + //dump(".......... " + i + "> " + arr[i] + "\n"); if(arr[i] == val) { //succeed ++_passedChecks; @@ -261,7 +261,7 @@ test( test( function test_CSPSourceList_fromString_twohost() { var str = "foo.bar:21 https://ras.bar"; - var parsed = "http://foo.bar:21 https://ras.bar:443"; + var parsed = "http://foo.bar:21 https://ras.bar"; var sd = CSPSourceList.fromString(str, undefined, URI("http://self.com:80")); //"two-host list should parse" do_check_neq(null,sd); @@ -321,43 +321,26 @@ test( do_check_false(wildcardHostSourceList.permits("http://barbaz.com")); }); -///////////////////// Test the Whole CSP rep object ////////////////////// - +//////////////// TEST CSP REP SPEC COMPLIANT PARSER //////////// test( function test_CSPRep_fromString() { - // check default init - //ASSERT(!(new CSPRep())._isInitialized, "Uninitialized rep thinks it is.") - var cspr; var cspr_allowval; - var SD = CSPRep.SRC_DIRECTIVES_OLD; + var SD = CSPRep.SRC_DIRECTIVES; + var DEFAULTS = [SD.STYLE_SRC, SD.MEDIA_SRC, SD.IMG_SRC, SD.SCRIPT_SRC, SD.FONT_SRC, + SD.OBJECT_SRC, SD.FRAME_SRC, SD.CONNECT_SRC]; - // check default policy "allow *" - cspr = CSPRep.fromString("allow *", URI("http://self.com:80")); - // "DEFAULT_SRC directive is missing when specified in fromString" - do_check_has_key(cspr._directives, SD.DEFAULT_SRC); - - }); - - -test( - function test_CSPRep_defaultSrc() { - var cspr, cspr_default_val, cspr_allow; - var SD = CSPRep.SRC_DIRECTIVES_OLD; - - // apply policy of "default-src *" (e.g. "allow *") + // check default policy "default-src *" cspr = CSPRep.fromString("default-src *", URI("http://self.com:80")); // "DEFAULT_SRC directive is missing when specified in fromString" do_check_has_key(cspr._directives, SD.DEFAULT_SRC); - // check that |allow *| and |default-src *| are parsed equivalently and - // result in the same set of explicit policy directives - cspr = CSPRep.fromString("default-src *", URI("http://self.com:80")); - cspr_allow = CSPRep.fromString("allow *", URI("http://self.com:80")); - - do_check_equivalent(cspr._directives['default-src'], - cspr_allow._directives['default-src']); + for(var x in DEFAULTS) { + // each of these should be equivalent to DEFAULT_SRC + //DEFAULTS[x] + " does not use default rule." + do_check_true(cspr.permits("http://bar.com", DEFAULTS[x])); + } }); @@ -365,11 +348,12 @@ test( function test_CSPRep_fromString_oneDir() { var cspr; - var SD = CSPRep.SRC_DIRECTIVES_OLD; - var DEFAULTS = [SD.STYLE_SRC, SD.MEDIA_SRC, SD.IMG_SRC, SD.FRAME_SRC]; + var SD = CSPRep.SRC_DIRECTIVES; + var DEFAULTS = [SD.STYLE_SRC, SD.MEDIA_SRC, SD.IMG_SRC, + SD.FRAME_SRC, SD.CONNECT_SRC]; // check one-directive policies - cspr = CSPRep.fromString("allow bar.com; script-src https://foo.com", + cspr = CSPRep.fromString("default-src bar.com; script-src https://foo.com", URI("http://self.com")); for(var x in DEFAULTS) { @@ -389,15 +373,18 @@ test( }); test( - function test_CSPRep_fromString_twodir() { + function test_CSPRep_fromString_twoDir() { var cspr; - var SD = CSPRep.SRC_DIRECTIVES_OLD; - var DEFAULTS = [SD.STYLE_SRC, SD.MEDIA_SRC, SD.FRAME_SRC]; + + var SD = CSPRep.SRC_DIRECTIVES; + + var DEFAULTS = [SD.STYLE_SRC, SD.MEDIA_SRC, SD.FRAME_SRC, + SD.CONNECT_SRC]; // check two-directive policies - var polstr = "allow allow.com; " - + "script-src https://foo.com; " - + "img-src bar.com:*"; + var polstr = "default-src allow.com; " + + "script-src https://foo.com; " + + "img-src bar.com:*"; cspr = CSPRep.fromString(polstr, URI("http://self.com")); for(var x in DEFAULTS) { @@ -425,123 +412,12 @@ test( test(function test_CSPRep_fromString_withself() { var cspr; - var SD = CSPRep.SRC_DIRECTIVES_OLD; var self = "https://self.com:34"; + var SD = CSPRep.SRC_DIRECTIVES; // check one-directive policies - cspr = CSPRep.fromString("allow 'self'; script-src 'self' https://*:*", - URI(self)); - //"img-src does not enforce default rule, 'self'. - do_check_false(cspr.permits("https://foo.com:400", SD.IMG_SRC)); - //"img-src does not allow self - do_check_true(cspr.permits(self, SD.IMG_SRC)); - //"script-src is too relaxed - do_check_false(cspr.permits("http://evil.com", SD.SCRIPT_SRC)); - //"script-src should allow self - do_check_true(cspr.permits(self, SD.SCRIPT_SRC)); - //"script-src is too strict on host/port - do_check_true(cspr.permits("https://evil.com:100", SD.SCRIPT_SRC)); - }); - - -//////////////// TEST CSP REP SPEC COMPLIANT PARSER //////////// -test( - function test_CSPRep_fromStringSpecCompliant() { - - var cspr; - var cspr_allowval; - var SD = CSPRep.SRC_DIRECTIVES_NEW; - var DEFAULTS = [SD.STYLE_SRC, SD.MEDIA_SRC, SD.IMG_SRC, SD.SCRIPT_SRC, SD.FONT_SRC, - SD.OBJECT_SRC, SD.FRAME_SRC, SD.CONNECT_SRC]; - - // check default policy "default-src *" - cspr = CSPRep.fromStringSpecCompliant("default-src *", URI("http://self.com:80")); - // "DEFAULT_SRC directive is missing when specified in - // fromStringSpecCompliant" - do_check_has_key(cspr._directives, SD.DEFAULT_SRC); - - for(var x in DEFAULTS) { - // each of these should be equivalent to DEFAULT_SRC - //DEFAULTS[x] + " does not use default rule." - do_check_true(cspr.permits("http://bar.com", DEFAULTS[x])); - } - }); - - -test( - function test_CSPRep_fromStringSpecCompliant_oneDir() { - - var cspr; - var SD = CSPRep.SRC_DIRECTIVES_NEW; - var DEFAULTS = [SD.STYLE_SRC, SD.MEDIA_SRC, SD.IMG_SRC, - SD.FRAME_SRC, SD.CONNECT_SRC]; - - // check one-directive policies - cspr = CSPRep.fromStringSpecCompliant("default-src bar.com; script-src https://foo.com", - URI("http://self.com")); - - for(var x in DEFAULTS) { - //DEFAULTS[x] + " does not use default rule." - do_check_false(cspr.permits("http://bar.com:22", DEFAULTS[x])); - //DEFAULTS[x] + " does not use default rule." - do_check_true(cspr.permits("http://bar.com:80", DEFAULTS[x])); - //DEFAULTS[x] + " does not use default rule." - do_check_false(cspr.permits("https://foo.com:400", DEFAULTS[x])); - //DEFAULTS[x] + " does not use default rule." - do_check_false(cspr.permits("https://foo.com", DEFAULTS[x])); - } - //"script-src false positive in policy. - do_check_false(cspr.permits("http://bar.com:22", SD.SCRIPT_SRC)); - //"script-src false negative in policy. - do_check_true(cspr.permits("https://foo.com:443", SD.SCRIPT_SRC)); - }); - -test( - function test_CSPRep_fromStringSpecCompliant_twodir() { - var cspr; - - var SD = CSPRep.SRC_DIRECTIVES_NEW; - - var DEFAULTS = [SD.STYLE_SRC, SD.MEDIA_SRC, SD.FRAME_SRC, - SD.CONNECT_SRC]; - - // check two-directive policies - var polstr = "default-src allow.com; " + - "script-src https://foo.com; " + - "img-src bar.com:*"; - cspr = CSPRep.fromStringSpecCompliant(polstr, URI("http://self.com")); - - for(var x in DEFAULTS) { - do_check_true(cspr.permits("http://allow.com", DEFAULTS[x])); - //DEFAULTS[x] + " does not use default rule. - do_check_false(cspr.permits("https://foo.com:400", DEFAULTS[x])); - //DEFAULTS[x] + " does not use default rule. - do_check_false(cspr.permits("http://bar.com:400", DEFAULTS[x])); - //DEFAULTS[x] + " does not use default rule. - } - //"img-src does not use default rule. - do_check_false(cspr.permits("http://allow.com:22", SD.IMG_SRC)); - //"img-src does not use default rule. - do_check_false(cspr.permits("https://foo.com:400", SD.IMG_SRC)); - //"img-src does not use default rule. - do_check_true(cspr.permits("http://bar.com:88", SD.IMG_SRC)); - - //"script-src does not use default rule. - do_check_false(cspr.permits("http://allow.com:22", SD.SCRIPT_SRC)); - //"script-src does not use default rule. - do_check_true(cspr.permits("https://foo.com:443", SD.SCRIPT_SRC)); - //"script-src does not use default rule. - do_check_false(cspr.permits("http://bar.com:400", SD.SCRIPT_SRC)); - }); - -test(function test_CSPRep_fromStringSpecCompliant_withself() { - var cspr; - var self = "https://self.com:34"; - var SD = CSPRep.SRC_DIRECTIVES_NEW; - - // check one-directive policies - cspr = CSPRep.fromStringSpecCompliant("default-src 'self'; script-src 'self' https://*:*", - URI(self)); + cspr = CSPRep.fromString("default-src 'self'; script-src 'self' https://*:*", + URI(self)); //"img-src does not enforce default rule, 'self'. do_check_false(cspr.permits("https://foo.com:400", SD.IMG_SRC)); //"img-src does not allow self @@ -559,34 +435,10 @@ test(function test_CSPRep_fromStringSpecCompliant_withself() { // (see bug 555068) test(function test_FrameAncestor_defaults() { var cspr; - var SD = CSPRep.SRC_DIRECTIVES_OLD; var self = "http://self.com:34"; + var SD = CSPRep.SRC_DIRECTIVES; - cspr = CSPRep.fromString("allow 'none'", URI(self)); - - //"frame-ancestors should default to * not 'allow' value" - do_check_true(cspr.permits("https://foo.com:400", SD.FRAME_ANCESTORS)); - do_check_true(cspr.permits("http://self.com:34", SD.FRAME_ANCESTORS)); - do_check_true(cspr.permits("https://self.com:34", SD.FRAME_ANCESTORS)); - do_check_true(cspr.permits("http://self.com", SD.FRAME_ANCESTORS)); - do_check_true(cspr.permits("http://subd.self.com:34", SD.FRAME_ANCESTORS)); - - cspr = CSPRep.fromString("allow 'none'; frame-ancestors 'self'", URI(self)); - - //"frame-ancestors should only allow self" - do_check_true(cspr.permits("http://self.com:34", SD.FRAME_ANCESTORS)); - do_check_false(cspr.permits("https://foo.com:400", SD.FRAME_ANCESTORS)); - do_check_false(cspr.permits("https://self.com:34", SD.FRAME_ANCESTORS)); - do_check_false(cspr.permits("http://self.com", SD.FRAME_ANCESTORS)); - do_check_false(cspr.permits("http://subd.self.com:34", SD.FRAME_ANCESTORS)); - }); - -test(function test_FrameAncestor_defaults_specCompliant() { - var cspr; - var self = "http://self.com:34"; - var SD = CSPRep.SRC_DIRECTIVES_NEW; - - cspr = CSPRep.fromStringSpecCompliant("default-src 'none'", URI(self)); + cspr = CSPRep.fromString("default-src 'none'", URI(self)); //"frame-ancestors should default to * not 'default-src' value" do_check_true(cspr.permits("https://foo.com:400", SD.FRAME_ANCESTORS)); @@ -595,7 +447,7 @@ test(function test_FrameAncestor_defaults_specCompliant() { do_check_true(cspr.permits("http://self.com", SD.FRAME_ANCESTORS)); do_check_true(cspr.permits("http://subd.self.com:34", SD.FRAME_ANCESTORS)); - cspr = CSPRep.fromStringSpecCompliant("default-src 'none'; frame-ancestors 'self'", URI(self)); + cspr = CSPRep.fromString("default-src 'none'; frame-ancestors 'self'", URI(self)); //"frame-ancestors should only allow self" do_check_true(cspr.permits("http://self.com:34", SD.FRAME_ANCESTORS)); @@ -608,10 +460,10 @@ test(function test_FrameAncestor_defaults_specCompliant() { test(function test_FrameAncestor_TLD_defaultPorts() { var cspr; - var SD = CSPRep.SRC_DIRECTIVES_OLD; + var SD = CSPRep.SRC_DIRECTIVES; var self = "http://self"; //TLD only, no .com or anything. - cspr = CSPRep.fromString("allow 'self'; frame-ancestors 'self' http://foo:80 bar:80 http://three", URI(self)); + cspr = CSPRep.fromString("default-src 'self'; frame-ancestors 'self' http://foo:80 bar:80 http://three", URI(self)); //"frame-ancestors should default to * not 'allow' value" do_check_true(cspr.permits("http://self", SD.FRAME_ANCESTORS)); @@ -630,7 +482,7 @@ test(function test_FrameAncestor_TLD_defaultPorts() { test(function test_FrameAncestor_ignores_userpass_bug779918() { var cspr; - var SD = CSPRep.SRC_DIRECTIVES_OLD; + var SD = CSPRep.SRC_DIRECTIVES; var self = "http://self.com/bar"; var testPolicy = "default-src 'self'; frame-ancestors 'self'"; @@ -678,7 +530,7 @@ test(function test_FrameAncestor_ignores_userpass_bug779918() { test(function test_CSP_ReportURI_parsing() { var cspr; - var SD = CSPRep.SRC_DIRECTIVES_NEW; + var SD = CSPRep.SRC_DIRECTIVES; var self = "http://self.com:34"; var parsedURIs = []; @@ -692,48 +544,48 @@ test(function test_CSP_ReportURI_parsing() { var uri_other_scheme_absolute = "https://self.com/report.py"; var uri_other_scheme_and_host_absolute = "https://foo.com/report.py"; - cspr = CSPRep.fromStringSpecCompliant("default-src *; report-uri " + uri_valid_absolute, URI(self)); + cspr = CSPRep.fromString("default-src *; report-uri " + uri_valid_absolute, URI(self)); parsedURIs = cspr.getReportURIs().split(/\s+/); do_check_in_array(parsedURIs, uri_valid_absolute); do_check_eq(parsedURIs.length, 1); - cspr = CSPRep.fromStringSpecCompliant("default-src *; report-uri " + uri_other_host_absolute, URI(self)); + cspr = CSPRep.fromString("default-src *; report-uri " + uri_other_host_absolute, URI(self)); parsedURIs = cspr.getReportURIs().split(/\s+/); do_check_in_array(parsedURIs, uri_other_host_absolute); do_check_eq(parsedURIs.length, 1); // the empty string is in there. - cspr = CSPRep.fromStringSpecCompliant("default-src *; report-uri " + uri_invalid_relative, URI(self)); + cspr = CSPRep.fromString("default-src *; report-uri " + uri_invalid_relative, URI(self)); parsedURIs = cspr.getReportURIs().split(/\s+/); do_check_in_array(parsedURIs, ""); do_check_eq(parsedURIs.length, 1); - cspr = CSPRep.fromStringSpecCompliant("default-src *; report-uri " + uri_valid_relative, URI(self)); + cspr = CSPRep.fromString("default-src *; report-uri " + uri_valid_relative, URI(self)); parsedURIs = cspr.getReportURIs().split(/\s+/); do_check_in_array(parsedURIs, uri_valid_relative_expanded); do_check_eq(parsedURIs.length, 1); - cspr = CSPRep.fromStringSpecCompliant("default-src *; report-uri " + uri_valid_relative2, URI(self)); + cspr = CSPRep.fromString("default-src *; report-uri " + uri_valid_relative2, URI(self)); parsedURIs = cspr.getReportURIs().split(/\s+/); dump(parsedURIs.length); do_check_in_array(parsedURIs, uri_valid_relative2_expanded); do_check_eq(parsedURIs.length, 1); // make sure cross-scheme reporting works - cspr = CSPRep.fromStringSpecCompliant("default-src *; report-uri " + uri_other_scheme_absolute, URI(self)); + cspr = CSPRep.fromString("default-src *; report-uri " + uri_other_scheme_absolute, URI(self)); parsedURIs = cspr.getReportURIs().split(/\s+/); dump(parsedURIs.length); do_check_in_array(parsedURIs, uri_other_scheme_absolute); do_check_eq(parsedURIs.length, 1); // make sure cross-scheme, cross-host reporting works - cspr = CSPRep.fromStringSpecCompliant("default-src *; report-uri " + uri_other_scheme_and_host_absolute, URI(self)); + cspr = CSPRep.fromString("default-src *; report-uri " + uri_other_scheme_and_host_absolute, URI(self)); parsedURIs = cspr.getReportURIs().split(/\s+/); dump(parsedURIs.length); do_check_in_array(parsedURIs, uri_other_scheme_and_host_absolute); do_check_eq(parsedURIs.length, 1); // combination! - cspr = CSPRep.fromStringSpecCompliant("default-src *; report-uri " + + cspr = CSPRep.fromString("default-src *; report-uri " + uri_valid_relative2 + " " + uri_valid_absolute, URI(self)); parsedURIs = cspr.getReportURIs().split(/\s+/); @@ -741,7 +593,7 @@ test(function test_CSP_ReportURI_parsing() { do_check_in_array(parsedURIs, uri_valid_absolute); do_check_eq(parsedURIs.length, 2); - cspr = CSPRep.fromStringSpecCompliant("default-src *; report-uri " + + cspr = CSPRep.fromString("default-src *; report-uri " + uri_valid_relative2 + " " + uri_other_host_absolute + " " + uri_valid_absolute, URI(self)); @@ -755,32 +607,22 @@ test(function test_CSP_ReportURI_parsing() { test( function test_bug634778_duplicateDirective_Detection() { var cspr; - var SD = CSPRep.SRC_DIRECTIVES_OLD; + var SD = CSPRep.SRC_DIRECTIVES; var self = "http://self.com:34"; var firstDomain = "http://first.com"; var secondDomain = "http://second.com"; var thirdDomain = "http://third.com"; // check for duplicate "default-src" directives + // Spec says first directive persists (subsequent re-statement is + // ignored) cspr = CSPRep.fromString("default-src " + self + "; default-src " + firstDomain, URI(self)); do_check_true(cspr.permits(self, SD.DEFAULT_SRC)); do_check_false(cspr.permits(firstDomain, SD.DEFAULT_SRC)); - // check for duplicate "allow" directives - cspr = CSPRep.fromString("allow " + self + "; allow " + firstDomain, - URI(self)); - do_check_true(cspr.permits(self, SD.DEFAULT_SRC)); - do_check_false(cspr.permits(firstDomain, SD.DEFAULT_SRC)); - - // check for duplicate "allow" + "default-src" directives - cspr = CSPRep.fromString("allow " + self + "; default-src " + firstDomain, - URI(self)); - do_check_true(cspr.permits(self, SD.DEFAULT_SRC)); - do_check_false(cspr.permits(firstDomain, SD.DEFAULT_SRC)); - // check for duplicate report-uri directives - cspr = CSPRep.fromString("allow *; report-uri " + self + "/report.py; report-uri " + cspr = CSPRep.fromString("default-src *; report-uri " + self + "/report.py; report-uri " + firstDomain + "/report.py", URI(self)); parsedURIs = cspr.getReportURIs().split(/\s+/); do_check_in_array(parsedURIs, self + "/report.py"); @@ -896,9 +738,7 @@ test( test( function test_bug764937_defaultSrcMissing() { - var cspObjSpecCompliant = Cc["@mozilla.org/contentsecuritypolicy;1"] - .createInstance(Ci.nsIContentSecurityPolicy); - var cspObjOld = Cc["@mozilla.org/contentsecuritypolicy;1"] + var cspObj = Cc["@mozilla.org/contentsecuritypolicy;1"] .createInstance(Ci.nsIContentSecurityPolicy); var selfURI = URI("http://self.com/"); @@ -908,39 +748,21 @@ test( }; const policy = "script-src 'self'"; - cspObjSpecCompliant.appendPolicy(policy, selfURI, false, true); + cspObj.appendPolicy(policy, selfURI, false, true); // Spec-Compliant policy default-src defaults to *. // This means all images are allowed, and only 'self' // script is allowed. - do_check_true(testPermits(cspObjSpecCompliant, + do_check_true(testPermits(cspObj, URI("http://bar.com/foo.png"), Ci.nsIContentPolicy.TYPE_IMAGE)); - do_check_true(testPermits(cspObjSpecCompliant, + do_check_true(testPermits(cspObj, URI("http://self.com/foo.png"), Ci.nsIContentPolicy.TYPE_IMAGE)); - do_check_true(testPermits(cspObjSpecCompliant, + do_check_true(testPermits(cspObj, URI("http://self.com/foo.js"), Ci.nsIContentPolicy.TYPE_SCRIPT)); - do_check_false(testPermits(cspObjSpecCompliant, - URI("http://bar.com/foo.js"), - Ci.nsIContentPolicy.TYPE_SCRIPT)); - - cspObjOld.appendPolicy(policy, selfURI, false, false); - - // non-Spec-Compliant policy default-src defaults to 'none' - // This means all images are blocked, and so are all scripts (because the - // policy is ignored and fails closed). - do_check_false(testPermits(cspObjOld, - URI("http://bar.com/foo.png"), - Ci.nsIContentPolicy.TYPE_IMAGE)); - do_check_false(testPermits(cspObjOld, - URI("http://self.com/foo.png"), - Ci.nsIContentPolicy.TYPE_IMAGE)); - do_check_false(testPermits(cspObjOld, - URI("http://self.com/foo.js"), - Ci.nsIContentPolicy.TYPE_SCRIPT)); - do_check_false(testPermits(cspObjOld, + do_check_false(testPermits(cspObj, URI("http://bar.com/foo.js"), Ci.nsIContentPolicy.TYPE_SCRIPT)); @@ -955,10 +777,10 @@ test(function test_equals_does_case_insensitive_comparison() { // CSPSource equals ignores case var upperCaseHost = "http://FOO.COM"; var lowerCaseHost = "http://foo.com"; - src1 = CSPSource.fromString(lowerCaseHost); - src2 = CSPSource.fromString(lowerCaseHost); + var src1 = CSPSource.fromString(lowerCaseHost); + var src2 = CSPSource.fromString(lowerCaseHost); do_check_true(src1.equals(src2)) - src3 = CSPSource.fromString(upperCaseHost); + var src3 = CSPSource.fromString(upperCaseHost); do_check_true(src1.equals(src3)) // CSPHost equals ignores case @@ -983,7 +805,7 @@ test(function test_equals_does_case_insensitive_comparison() { test(function test_csp_permits_case_insensitive() { var cspr; - var SD = CSPRep.SRC_DIRECTIVES_NEW; + var SD = CSPRep.SRC_DIRECTIVES; // checks directives can be case-insensitive var selfHost = "http://self.com"; @@ -1042,12 +864,15 @@ function run_test() { httpServer.registerPathHandler("/policy", policyresponder); for(let i in tests) { - tests[i](); + add_task(tests[i]); } - //teardown - httpServer.stop(function() { }); - do_test_finished(); + do_register_cleanup(function () { + //teardown + httpServer.stop(function() { }); + }); + + run_next_test(); } diff --git a/content/base/test/unit/xpcshell.ini b/content/base/test/unit/xpcshell.ini index fa8717b221ca..b0951dbb278a 100644 --- a/content/base/test/unit/xpcshell.ini +++ b/content/base/test/unit/xpcshell.ini @@ -21,7 +21,6 @@ support-files = 4_result_6.xml [test_bug553888.js] -[test_bug558431.js] [test_bug737966.js] [test_csputils.js] [test_cspreports.js] diff --git a/content/base/test/xcsp/chrome.ini b/content/base/test/xcsp/chrome.ini deleted file mode 100644 index fb55f3e12726..000000000000 --- a/content/base/test/xcsp/chrome.ini +++ /dev/null @@ -1,4 +0,0 @@ -[DEFAULT] - -[test_csp_bug768029.html] -[test_csp_bug773891.html] diff --git a/content/base/test/xcsp/file_CSP.css b/content/base/test/xcsp/file_CSP.css deleted file mode 100644 index 25e1a5b9dacc..000000000000 --- a/content/base/test/xcsp/file_CSP.css +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Moved this CSS from an inline stylesheet to an external file when we added - * inline-style blocking in bug 763879. - * This test may hang if the load for this .css file is blocked due to a - * malfunction of CSP, but should pass if the style_good test passes. - */ - -/* CSS font embedding tests */ -@font-face { - font-family: "arbitrary_good"; - src: url('file_CSP.sjs?testid=font_good&type=application/octet-stream'); -} -@font-face { - font-family: "arbitrary_bad"; - src: url('http://example.org/tests/content/base/test/xcsp/file_CSP.sjs?testid=font_bad&type=application/octet-stream'); -} - -.div_arbitrary_good { font-family: "arbitrary_good"; } -.div_arbitrary_bad { font-family: "arbitrary_bad"; } - diff --git a/content/base/test/xcsp/file_CSP.sjs b/content/base/test/xcsp/file_CSP.sjs deleted file mode 100644 index 85c2df3ba474..000000000000 --- a/content/base/test/xcsp/file_CSP.sjs +++ /dev/null @@ -1,26 +0,0 @@ -// SJS file for CSP mochitests - -function handleRequest(request, response) -{ - var query = {}; - request.queryString.split('&').forEach(function (val) { - var [name, value] = val.split('='); - query[name] = unescape(value); - }); - - var isPreflight = request.method == "OPTIONS"; - - - //avoid confusing cache behaviors - response.setHeader("Cache-Control", "no-cache", false); - - if ("type" in query) { - response.setHeader("Content-Type", unescape(query['type']), false); - } else { - response.setHeader("Content-Type", "text/html", false); - } - - if ("content" in query) { - response.write(unescape(query['content'])); - } -} diff --git a/content/base/test/xcsp/file_CSP_bug916446.html b/content/base/test/xcsp/file_CSP_bug916446.html deleted file mode 100644 index bc8bdb3ad502..000000000000 --- a/content/base/test/xcsp/file_CSP_bug916446.html +++ /dev/null @@ -1,16 +0,0 @@ - - - -
    -
  1. Inline script (green if allowed, black if blocked)
  2. -
- - - - - - - diff --git a/content/base/test/xcsp/file_CSP_bug916446.html^headers^ b/content/base/test/xcsp/file_CSP_bug916446.html^headers^ deleted file mode 100644 index 888789cb6fec..000000000000 --- a/content/base/test/xcsp/file_CSP_bug916446.html^headers^ +++ /dev/null @@ -1 +0,0 @@ -x-content-security-policy-report-only: options eval-script; script-src 'self' ; report-uri /csp_report diff --git a/content/base/test/xcsp/file_CSP_evalscript_main.html b/content/base/test/xcsp/file_CSP_evalscript_main.html deleted file mode 100644 index 15495296109f..000000000000 --- a/content/base/test/xcsp/file_CSP_evalscript_main.html +++ /dev/null @@ -1,12 +0,0 @@ - - - CSP eval script tests - - - - - Foo. - - - diff --git a/content/base/test/xcsp/file_CSP_evalscript_main.html^headers^ b/content/base/test/xcsp/file_CSP_evalscript_main.html^headers^ deleted file mode 100644 index a9c761cfc144..000000000000 --- a/content/base/test/xcsp/file_CSP_evalscript_main.html^headers^ +++ /dev/null @@ -1,2 +0,0 @@ -Cache-Control: no-cache -X-Content-Security-Policy: default-src 'self' diff --git a/content/base/test/xcsp/file_CSP_evalscript_main.js b/content/base/test/xcsp/file_CSP_evalscript_main.js deleted file mode 100644 index a00fbb8362e5..000000000000 --- a/content/base/test/xcsp/file_CSP_evalscript_main.js +++ /dev/null @@ -1,126 +0,0 @@ -// some javascript for the CSP eval() tests - -function logResult(str, passed) { - var elt = document.createElement('div'); - var color = passed ? "#cfc;" : "#fcc"; - elt.setAttribute('style', 'background-color:' + color + '; width:100%; border:1px solid black; padding:3px; margin:4px;'); - elt.innerHTML = str; - document.body.appendChild(elt); -} - -window._testResults = {}; - -// callback for when stuff is allowed by CSP -var onevalexecuted = (function(window) { - return function(shouldrun, what, data) { - window._testResults[what] = "ran"; - window.parent.scriptRan(shouldrun, what, data); - logResult((shouldrun ? "PASS: " : "FAIL: ") + what + " : " + data, shouldrun); - };})(window); - -// callback for when stuff is blocked -var onevalblocked = (function(window) { - return function(shouldrun, what, data) { - window._testResults[what] = "blocked"; - window.parent.scriptBlocked(shouldrun, what, data); - logResult((shouldrun ? "FAIL: " : "PASS: ") + what + " : " + data, !shouldrun); - };})(window); - - -// Defer until document is loaded so that we can write the pretty result boxes -// out. -addEventListener('load', function() { - // setTimeout(String) test -- mutate something in the window._testResults - // obj, then check it. - { - var str_setTimeoutWithStringRan = 'onevalexecuted(false, "setTimeout(String)", "setTimeout with a string was enabled.");'; - function fcn_setTimeoutWithStringCheck() { - if (this._testResults["setTimeout(String)"] !== "ran") { - onevalblocked(false, "setTimeout(String)", - "setTimeout with a string was blocked"); - } - } - setTimeout(fcn_setTimeoutWithStringCheck.bind(window), 10); - setTimeout(str_setTimeoutWithStringRan, 10); - } - - // setTimeout(function) test -- mutate something in the window._testResults - // obj, then check it. - { - function fcn_setTimeoutWithFunctionRan() { - onevalexecuted(true, "setTimeout(function)", - "setTimeout with a function was enabled.") - } - function fcn_setTimeoutWithFunctionCheck() { - if (this._testResults["setTimeout(function)"] !== "ran") { - onevalblocked(true, "setTimeout(function)", - "setTimeout with a function was blocked"); - } - } - setTimeout(fcn_setTimeoutWithFunctionRan.bind(window), 10); - setTimeout(fcn_setTimeoutWithFunctionCheck.bind(window), 10); - } - - // eval() test -- should throw exception as per spec - try { - eval('onevalexecuted(false, "eval(String)", "eval() was enabled.");'); - } catch (e) { - onevalblocked(false, "eval(String)", - "eval() was blocked"); - } - - // eval(foo,bar) test -- should throw exception as per spec - try { - eval('onevalexecuted(false, "eval(String,scope)", "eval() was enabled.");',1); - } catch (e) { - onevalblocked(false, "eval(String,object)", - "eval() with scope was blocked"); - } - - // [foo,bar].sort(eval) test -- should throw exception as per spec - try { - ['onevalexecuted(false, "[String, obj].sort(eval)", "eval() was enabled.");',1].sort(eval); - } catch (e) { - onevalblocked(false, "[String, obj].sort(eval)", - "eval() with scope via sort was blocked"); - } - - // [].sort.call([foo,bar], eval) test -- should throw exception as per spec - try { - [].sort.call(['onevalexecuted(false, "[String, obj].sort(eval)", "eval() was enabled.");',1], eval); - } catch (e) { - onevalblocked(false, "[].sort.call([String, obj], eval)", - "eval() with scope via sort/call was blocked"); - } - - // new Function() test -- should throw exception as per spec - try { - var fcn = new Function('onevalexecuted(false, "new Function(String)", "new Function(String) was enabled.");'); - fcn(); - } catch (e) { - onevalblocked(false, "new Function(String)", - "new Function(String) was blocked."); - } - - // setTimeout(eval, 0, str) - { - // error is not catchable here, instead, we're going to side-effect - // 'worked'. - var worked = false; - - setTimeout(eval, 0, 'worked = true'); - setTimeout(function(worked) { - if (worked) { - onevalexecuted(false, "setTimeout(eval, 0, str)", - "setTimeout(eval, 0, string) was enabled."); - } else { - onevalblocked(false, "setTimeout(eval, 0, str)", - "setTimeout(eval, 0, str) was blocked."); - } - }, 0, worked); - } - -}, false); - - - diff --git a/content/base/test/xcsp/file_CSP_evalscript_main_getCRMFRequest.html b/content/base/test/xcsp/file_CSP_evalscript_main_getCRMFRequest.html deleted file mode 100644 index 7b122389be54..000000000000 --- a/content/base/test/xcsp/file_CSP_evalscript_main_getCRMFRequest.html +++ /dev/null @@ -1,12 +0,0 @@ - - - CSP eval script tests - - - - - Foo. - - - diff --git a/content/base/test/xcsp/file_CSP_evalscript_main_getCRMFRequest.html^headers^ b/content/base/test/xcsp/file_CSP_evalscript_main_getCRMFRequest.html^headers^ deleted file mode 100644 index a9c761cfc144..000000000000 --- a/content/base/test/xcsp/file_CSP_evalscript_main_getCRMFRequest.html^headers^ +++ /dev/null @@ -1,2 +0,0 @@ -Cache-Control: no-cache -X-Content-Security-Policy: default-src 'self' diff --git a/content/base/test/xcsp/file_CSP_evalscript_main_getCRMFRequest.js b/content/base/test/xcsp/file_CSP_evalscript_main_getCRMFRequest.js deleted file mode 100644 index 90826e3bc9de..000000000000 --- a/content/base/test/xcsp/file_CSP_evalscript_main_getCRMFRequest.js +++ /dev/null @@ -1,48 +0,0 @@ -// some javascript for the CSP eval() tests - -function logResult(str, passed) { - var elt = document.createElement('div'); - var color = passed ? "#cfc;" : "#fcc"; - elt.setAttribute('style', 'background-color:' + color + '; width:100%; border:1px solid black; padding:3px; margin:4px;'); - elt.innerHTML = str; - document.body.appendChild(elt); -} - -window._testResults = {}; - -// callback for when stuff is allowed by CSP -var onevalexecuted = (function(window) { - return function(shouldrun, what, data) { - window._testResults[what] = "ran"; - window.parent.scriptRan(shouldrun, what, data); - logResult((shouldrun ? "PASS: " : "FAIL: ") + what + " : " + data, shouldrun); - };})(window); - -// callback for when stuff is blocked -var onevalblocked = (function(window) { - return function(shouldrun, what, data) { - window._testResults[what] = "blocked"; - window.parent.scriptBlocked(shouldrun, what, data); - logResult((shouldrun ? "FAIL: " : "PASS: ") + what + " : " + data, !shouldrun); - };})(window); - - -// Defer until document is loaded so that we can write the pretty result boxes -// out. -addEventListener('load', function() { - // generateCRMFRequest test -- make sure we cannot eval the callback if CSP is in effect - try { - var script = 'console.log("dynamic script eval\'d in crypto.generateCRMFRequest should be disallowed")'; - crypto.generateCRMFRequest('CN=0', 0, 0, null, script, 384, null, 'rsa-dual-use'); - onevalexecuted(false, "crypto.generateCRMFRequest()", - "crypto.generateCRMFRequest() should not run!"); - } catch (e) { - onevalblocked(false, "eval(script) inside crypto.generateCRMFRequest", - "eval was blocked during crypto.generateCRMFRequest"); - } - - -}, false); - - - diff --git a/content/base/test/xcsp/file_CSP_evalscript_no_CSP_at_all.html b/content/base/test/xcsp/file_CSP_evalscript_no_CSP_at_all.html deleted file mode 100644 index d36aeaaf1064..000000000000 --- a/content/base/test/xcsp/file_CSP_evalscript_no_CSP_at_all.html +++ /dev/null @@ -1,12 +0,0 @@ - - - CSP eval script tests: no CSP specified - - - - - Foo. See bug 824652 - - - diff --git a/content/base/test/xcsp/file_CSP_evalscript_no_CSP_at_all.html^headers^ b/content/base/test/xcsp/file_CSP_evalscript_no_CSP_at_all.html^headers^ deleted file mode 100644 index 9e23c73b7ffb..000000000000 --- a/content/base/test/xcsp/file_CSP_evalscript_no_CSP_at_all.html^headers^ +++ /dev/null @@ -1 +0,0 @@ -Cache-Control: no-cache diff --git a/content/base/test/xcsp/file_CSP_evalscript_no_CSP_at_all.js b/content/base/test/xcsp/file_CSP_evalscript_no_CSP_at_all.js deleted file mode 100644 index 520491fb8ef7..000000000000 --- a/content/base/test/xcsp/file_CSP_evalscript_no_CSP_at_all.js +++ /dev/null @@ -1,42 +0,0 @@ -// some javascript for the CSP eval() tests -// all of these evals should succeed, as the document loading this script -// has script-src 'self' 'unsafe-eval' - -function logResult(str, passed) { - var elt = document.createElement('div'); - var color = passed ? "#cfc;" : "#fcc"; - elt.setAttribute('style', 'background-color:' + color + '; width:100%; border:1px solid black; padding:3px; margin:4px;'); - elt.innerHTML = str; - document.body.appendChild(elt); -} - -// callback for when stuff is allowed by CSP -var onevalexecuted = (function(window) { - return function(shouldrun, what, data) { - window.parent.scriptRan(shouldrun, what, data); - logResult((shouldrun ? "PASS: " : "FAIL: ") + what + " : " + data, shouldrun); - };})(window); - -// callback for when stuff is blocked -var onevalblocked = (function(window) { - return function(shouldrun, what, data) { - window.parent.scriptBlocked(shouldrun, what, data); - logResult((shouldrun ? "FAIL: " : "PASS: ") + what + " : " + data, !shouldrun); - };})(window); - - -// Defer until document is loaded so that we can write the pretty result boxes -// out. -addEventListener('load', function() { - // test that allows crypto.generateCRMFRequest eval to run when there is no CSP at all in place - try { - var script = - 'console.log("dynamic script passed to crypto.generateCRMFRequest should execute")'; - crypto.generateCRMFRequest('CN=0', 0, 0, null, script, 384, null, 'rsa-dual-use'); - onevalexecuted(true, "eval(script) inside crypto.generateCRMFRequest: no CSP at all", - "eval executed during crypto.generateCRMFRequest where no CSP is set at all"); - } catch (e) { - onevalblocked(true, "eval(script) inside crypto.generateCRMFRequest", - "eval was blocked during crypto.generateCRMFRequest"); - } -}, false); diff --git a/content/base/test/xcsp/file_CSP_frameancestors.sjs b/content/base/test/xcsp/file_CSP_frameancestors.sjs deleted file mode 100644 index 20dfef973217..000000000000 --- a/content/base/test/xcsp/file_CSP_frameancestors.sjs +++ /dev/null @@ -1,54 +0,0 @@ -// SJS file for CSP frame ancestor mochitests -function handleRequest(request, response) -{ - var query = {}; - request.queryString.split('&').forEach(function (val) { - var [name, value] = val.split('='); - query[name] = unescape(value); - }); - - var isPreflight = request.method == "OPTIONS"; - - - //avoid confusing cache behaviors - response.setHeader("Cache-Control", "no-cache", false); - - // grab the desired policy from the query, and then serve a page - if (query['csp']) - response.setHeader("X-Content-Security-Policy", - unescape(query['csp']), - false); - if (query['scriptedreport']) { - // spit back a script that records that the page loaded - response.setHeader("Content-Type", "text/javascript", false); - if (query['double']) - response.write('window.parent.parent.parent.postMessage({call: "frameLoaded", testname: "' + query['scriptedreport'] + '", uri: "window.location.toString()"}, "*");'); - else - response.write('window.parent.parent.postMessage({call: "frameLoaded", testname: "' + query['scriptedreport'] + '", uri: "window.location.toString()"}, "*");'); - } else if (query['internalframe']) { - // spit back an internal iframe (one that might be blocked) - response.setHeader("Content-Type", "text/html", false); - response.write(''); - if (query['double']) - response.write(''); - else - response.write(''); - response.write(''); - response.write(unescape(query['internalframe'])); - response.write(''); - } else if (query['externalframe']) { - // spit back an internal iframe (one that won't be blocked, and probably - // has no CSP) - response.setHeader("Content-Type", "text/html", false); - response.write(''); - response.write(''); - response.write(unescape(query['externalframe'])); - response.write(''); - } else { - // default case: error. - response.setHeader("Content-Type", "text/html", false); - response.write(''); - response.write("ERROR: not sure what to serve."); - response.write(''); - } -} diff --git a/content/base/test/xcsp/file_CSP_frameancestors_main.html b/content/base/test/xcsp/file_CSP_frameancestors_main.html deleted file mode 100644 index d35655e5218f..000000000000 --- a/content/base/test/xcsp/file_CSP_frameancestors_main.html +++ /dev/null @@ -1,44 +0,0 @@ - - - CSP frame ancestors tests - - - - - - - - - aa_allow: /* innermost frame allows a */
-
- - aa_block: /* innermost frame denies a */
-
- - ab_allow: /* innermost frame allows a */
-
- - ab_block: /* innermost frame denies a */
-
- - aba_allow: /* innermost frame allows b,a */
-
- - aba_block: /* innermost frame denies b */
-
- - aba2_block: /* innermost frame denies a */
-
- - abb_allow: /* innermost frame allows b,a */
-
- - abb_block: /* innermost frame denies b */
-
- - abb2_block: /* innermost frame denies a */
-
- - - - diff --git a/content/base/test/xcsp/file_CSP_frameancestors_main.js b/content/base/test/xcsp/file_CSP_frameancestors_main.js deleted file mode 100644 index a819580edcbb..000000000000 --- a/content/base/test/xcsp/file_CSP_frameancestors_main.js +++ /dev/null @@ -1,65 +0,0 @@ -// Script to populate the test frames in the frame ancestors mochitest. -// -function setupFrames() { - - var $ = function(v) { return document.getElementById(v); } - var base = { - self: '/tests/content/base/test/xcsp/file_CSP_frameancestors.sjs', - a: 'http://mochi.test:8888/tests/content/base/test/xcsp/file_CSP_frameancestors.sjs', - b: 'http://example.com/tests/content/base/test/xcsp/file_CSP_frameancestors.sjs' - }; - - var host = { a: 'http://mochi.test:8888', b: 'http://example.com:80' }; - - var innerframeuri = null; - var elt = null; - - elt = $('aa_allow'); - elt.src = base.a + "?testid=aa_allow&internalframe=aa_a&csp=" + - escape("allow 'none'; frame-ancestors " + host.a + "; script-src 'self'"); - - elt = $('aa_block'); - elt.src = base.a + "?testid=aa_block&internalframe=aa_b&csp=" + - escape("allow 'none'; frame-ancestors 'none'; script-src 'self'"); - - elt = $('ab_allow'); - elt.src = base.b + "?testid=ab_allow&internalframe=ab_a&csp=" + - escape("allow 'none'; frame-ancestors " + host.a + "; script-src 'self'"); - - elt = $('ab_block'); - elt.src = base.b + "?testid=ab_block&internalframe=ab_b&csp=" + - escape("allow 'none'; frame-ancestors 'none'; script-src 'self'"); - - /* .... two-level framing */ - elt = $('aba_allow'); - innerframeuri = base.a + "?testid=aba_allow&double=1&internalframe=aba_a&csp=" + - escape("allow 'none'; frame-ancestors " + host.a + " " + host.b + "; script-src 'self'"); - elt.src = base.b + "?externalframe=" + escape(''); - - elt = $('aba_block'); - innerframeuri = base.a + "?testid=aba_allow&double=1&internalframe=aba_b&csp=" + - escape("allow 'none'; frame-ancestors " + host.a + "; script-src 'self'"); - elt.src = base.b + "?externalframe=" + escape(''); - - elt = $('aba2_block'); - innerframeuri = base.a + "?testid=aba_allow&double=1&internalframe=aba2_b&csp=" + - escape("allow 'none'; frame-ancestors " + host.b + "; script-src 'self'"); - elt.src = base.b + "?externalframe=" + escape(''); - - elt = $('abb_allow'); - innerframeuri = base.b + "?testid=abb_allow&double=1&internalframe=abb_a&csp=" + - escape("allow 'none'; frame-ancestors " + host.a + " " + host.b + "; script-src 'self'"); - elt.src = base.b + "?externalframe=" + escape(''); - - elt = $('abb_block'); - innerframeuri = base.b + "?testid=abb_allow&double=1&internalframe=abb_b&csp=" + - escape("allow 'none'; frame-ancestors " + host.a + "; script-src 'self'"); - elt.src = base.b + "?externalframe=" + escape(''); - - elt = $('abb2_block'); - innerframeuri = base.b + "?testid=abb_allow&double=1&internalframe=abb2_b&csp=" + - escape("allow 'none'; frame-ancestors " + host.b + "; script-src 'self'"); - elt.src = base.b + "?externalframe=" + escape(''); -} - -window.addEventListener('load', setupFrames, false); diff --git a/content/base/test/xcsp/file_CSP_inlinescript_main.html b/content/base/test/xcsp/file_CSP_inlinescript_main.html deleted file mode 100644 index bc6f2e6e37c3..000000000000 --- a/content/base/test/xcsp/file_CSP_inlinescript_main.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - CSP inline script tests - - - - - - - - stuff - - diff --git a/content/base/test/xcsp/file_CSP_inlinescript_main.html^headers^ b/content/base/test/xcsp/file_CSP_inlinescript_main.html^headers^ deleted file mode 100644 index 0b777e954ebf..000000000000 --- a/content/base/test/xcsp/file_CSP_inlinescript_main.html^headers^ +++ /dev/null @@ -1,2 +0,0 @@ -X-Content-Security-Policy: allow 'self' -Cache-Control: no-cache diff --git a/content/base/test/xcsp/file_CSP_inlinestyle_main.html b/content/base/test/xcsp/file_CSP_inlinestyle_main.html deleted file mode 100644 index 0c7db9e15148..000000000000 --- a/content/base/test/xcsp/file_CSP_inlinestyle_main.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - CSP inline script tests - - - - - - - -
Link tag (external) stylesheet test (should be green)
-
Attribute stylesheet test (should be green)
-
Inline stylesheet test (should be green)
- - - - - - - This should be green since the animation should be allowed by CSP. - - - - - - - This should be green since the animation should be allowed by CSP. - - - - - - - This should be green since the animation should be allowed by CSP. - - - - - - This should be green since the <set> should be allowed by CSP. - - - - - diff --git a/content/base/test/xcsp/file_CSP_inlinestyle_main.html^headers^ b/content/base/test/xcsp/file_CSP_inlinestyle_main.html^headers^ deleted file mode 100644 index 4cabc3251272..000000000000 --- a/content/base/test/xcsp/file_CSP_inlinestyle_main.html^headers^ +++ /dev/null @@ -1,2 +0,0 @@ -X-Content-Security-Policy: default-src 'self' -Cache-Control: no-cache diff --git a/content/base/test/xcsp/file_CSP_main.html b/content/base/test/xcsp/file_CSP_main.html deleted file mode 100644 index e78d0d8d8d02..000000000000 --- a/content/base/test/xcsp/file_CSP_main.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
arbitrary good
-
arbitrary_bad
- - diff --git a/content/base/test/xcsp/file_CSP_main.html^headers^ b/content/base/test/xcsp/file_CSP_main.html^headers^ deleted file mode 100644 index 5374efd3e17b..000000000000 --- a/content/base/test/xcsp/file_CSP_main.html^headers^ +++ /dev/null @@ -1 +0,0 @@ -X-Content-Security-Policy: default-src 'self' diff --git a/content/base/test/xcsp/file_CSP_main.js b/content/base/test/xcsp/file_CSP_main.js deleted file mode 100644 index 96645d6c5b73..000000000000 --- a/content/base/test/xcsp/file_CSP_main.js +++ /dev/null @@ -1,16 +0,0 @@ -// some javascript for the CSP XHR tests -// - -try { - var xhr_good = new XMLHttpRequest(); - var xhr_good_uri ="http://mochi.test:8888/tests/content/base/test/csp/file_CSP.sjs?testid=xhr_good"; - xhr_good.open("GET", xhr_good_uri, true); - xhr_good.send(null); -} catch(e) {} - -try { - var xhr_bad = new XMLHttpRequest(); - var xhr_bad_uri ="http://example.com/tests/content/base/test/csp/file_CSP.sjs?testid=xhr_bad"; - xhr_bad.open("GET", xhr_bad_uri, true); - xhr_bad.send(null); -} catch(e) {} diff --git a/content/base/test/xcsp/file_bothCSPheaders.html b/content/base/test/xcsp/file_bothCSPheaders.html deleted file mode 100644 index 9949c6e27985..000000000000 --- a/content/base/test/xcsp/file_bothCSPheaders.html +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/content/base/test/xcsp/file_bothCSPheaders.html^headers^ b/content/base/test/xcsp/file_bothCSPheaders.html^headers^ deleted file mode 100644 index 945256cba454..000000000000 --- a/content/base/test/xcsp/file_bothCSPheaders.html^headers^ +++ /dev/null @@ -1,2 +0,0 @@ -X-Content-Security-Policy: default-src 'none' ; img-src http://example.org -Content-Security-Policy: default-src 'self' diff --git a/content/base/test/xcsp/file_csp_bug768029.html b/content/base/test/xcsp/file_csp_bug768029.html deleted file mode 100644 index d7f2730e6c79..000000000000 --- a/content/base/test/xcsp/file_csp_bug768029.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - This is an app for testing - - - - - - - - - - - - Test for CSP applied to (simulated) app. - - - diff --git a/content/base/test/xcsp/file_csp_bug768029.sjs b/content/base/test/xcsp/file_csp_bug768029.sjs deleted file mode 100644 index 9ae353055ef9..000000000000 --- a/content/base/test/xcsp/file_csp_bug768029.sjs +++ /dev/null @@ -1,29 +0,0 @@ -function handleRequest(request, response) { - - var query = {}; - - request.queryString.split('&').forEach(function(val) { - var [name, value] = val.split('='); - query[name] = unescape(value); - }); - response.setHeader("Cache-Control", "no-cache", false); - - if ("type" in query) { - switch (query.type) { - case "script": - response.setHeader("Content-Type", "application/javascript"); - response.write("\n\ndocument.write('
script loaded\\n
');\n\n"); - return; - case "style": - response.setHeader("Content-Type", "text/css"); - response.write("\n\n.cspfoo { color:red; }\n\n"); - return; - case "img": - response.setHeader("Content-Type", "image/png"); - return; - } - } - - response.setHeader("Content-Type", "text/plain"); - response.write("ohnoes!"); -} diff --git a/content/base/test/xcsp/file_csp_bug773891.html b/content/base/test/xcsp/file_csp_bug773891.html deleted file mode 100644 index 563e5f1699c8..000000000000 --- a/content/base/test/xcsp/file_csp_bug773891.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - This is an app for csp testing - - - - - - - - - - - - Test for CSP applied to (simulated) app. - - - diff --git a/content/base/test/xcsp/file_csp_bug773891.sjs b/content/base/test/xcsp/file_csp_bug773891.sjs deleted file mode 100644 index 9ae353055ef9..000000000000 --- a/content/base/test/xcsp/file_csp_bug773891.sjs +++ /dev/null @@ -1,29 +0,0 @@ -function handleRequest(request, response) { - - var query = {}; - - request.queryString.split('&').forEach(function(val) { - var [name, value] = val.split('='); - query[name] = unescape(value); - }); - response.setHeader("Cache-Control", "no-cache", false); - - if ("type" in query) { - switch (query.type) { - case "script": - response.setHeader("Content-Type", "application/javascript"); - response.write("\n\ndocument.write('
script loaded\\n
');\n\n"); - return; - case "style": - response.setHeader("Content-Type", "text/css"); - response.write("\n\n.cspfoo { color:red; }\n\n"); - return; - case "img": - response.setHeader("Content-Type", "image/png"); - return; - } - } - - response.setHeader("Content-Type", "text/plain"); - response.write("ohnoes!"); -} diff --git a/content/base/test/xcsp/file_csp_redirects_main.html b/content/base/test/xcsp/file_csp_redirects_main.html deleted file mode 100644 index a6ee0b0aa26c..000000000000 --- a/content/base/test/xcsp/file_csp_redirects_main.html +++ /dev/null @@ -1,35 +0,0 @@ - - -CSP redirect tests - - -
- - - - diff --git a/content/base/test/xcsp/file_csp_redirects_page.sjs b/content/base/test/xcsp/file_csp_redirects_page.sjs deleted file mode 100644 index 7f5d6bad41ee..000000000000 --- a/content/base/test/xcsp/file_csp_redirects_page.sjs +++ /dev/null @@ -1,133 +0,0 @@ -// SJS file for CSP redirect mochitests -// This file serves pages which can optionally specify a Content Security Policy -function handleRequest(request, response) -{ - var query = {}; - request.queryString.split('&').forEach(function (val) { - var [name, value] = val.split('='); - query[name] = unescape(value); - }); - - response.setHeader("Cache-Control", "no-cache", false); - response.setHeader("Content-Type", "text/html", false); - - var resource = "/tests/content/base/test/csp/file_csp_redirects_resource.sjs"; - - // CSP header value - if (query["csp"] == 1) { - if (query["spec"] == 1) { - response.setHeader("Content-Security-Policy", "default-src 'self' ; style-src 'self' 'unsafe-inline'", false); - } else { - response.setHeader("X-Content-Security-Policy", "allow 'self'", false); - } - } - - // downloadable font that redirects to another site - if (query["testid"] == "font-src") { - var resp = '' + - '
test
'; - response.write(resp); - return; - } - - if (query["testid"] == "font-src-spec-compliant") { - var resp = '' + - '
test
'; - response.write(resp); - return; - } - - // iframe that redirects to another site - if (query["testid"] == "frame-src") { - response.write(''); - return; - } - - if (query["testid"] == "frame-src-spec-compliant") { - response.write(''); - return; - } - - // image that redirects to another site - if (query["testid"] == "img-src") { - response.write(''); - return; - } - - if (query["testid"] == "img-src-spec-compliant") { - response.write(''); - return; - } - - // video content that redirects to another site - if (query["testid"] == "media-src") { - response.write(''); - return; - } - - if (query["testid"] == "media-src-spec-compliant") { - response.write(''); - return; - } - - // object content that redirects to another site - if (query["testid"] == "object-src") { - response.write(''); - return; - } - - if (query["testid"] == "object-src-spec-compliant") { - response.write(''); - return; - } - - // external script that redirects to another site - if (query["testid"] == "script-src") { - response.write(''); - return; - } - - if (query["testid"] == "script-src-spec-compliant") { - response.write(''); - return; - } - - // external stylesheet that redirects to another site - if (query["testid"] == "style-src") { - response.write(''); - return; - } - - if (query["testid"] == "style-src-spec-compliant") { - response.write(''); - return; - } - - // worker script resource that redirects to another site - if (query["testid"] == "worker") { - response.write(''); - return; - } - - if (query["testid"] == "worker-spec-compliant") { - response.write(''); - return; - } - - // script that XHR's to a resource that redirects to another site - if (query["testid"] == "xhr-src") { - response.write(''); - return; - } - - if (query["testid"] == "xhr-src-spec-compliant") { - response.write(''); - return; - } -} diff --git a/content/base/test/xcsp/file_csp_redirects_resource.sjs b/content/base/test/xcsp/file_csp_redirects_resource.sjs deleted file mode 100644 index 60924ee09da0..000000000000 --- a/content/base/test/xcsp/file_csp_redirects_resource.sjs +++ /dev/null @@ -1,128 +0,0 @@ -// SJS file to serve resources for CSP redirect tests -// This file mimics serving resources, e.g. fonts, images, etc., which a CSP -// can include. The resource may redirect to a different resource, if specified. -function handleRequest(request, response) -{ - var query = {}; - request.queryString.split('&').forEach(function (val) { - var [name, value] = val.split('='); - query[name] = unescape(value); - }); - - var thisSite = "http://mochi.test:8888"; - var otherSite = "http://example.com"; - var resource = "/tests/content/base/test/csp/file_csp_redirects_resource.sjs"; - - response.setHeader("Cache-Control", "no-cache", false); - - // redirect to a resource on this site - if (query["redir"] == "same") { - var loc = thisSite+resource+"?res="+query["res"]+"&testid="+query["id"]; - response.setStatusLine("1.1", 302, "Found"); - response.setHeader("Location", loc, false); - return; - } - - // redirect to a resource on a different site - else if (query["redir"] == "other") { - var loc = otherSite+resource+"?res="+query["res"]+"&testid="+query["id"]; - response.setStatusLine("1.1", 302, "Found"); - response.setHeader("Location", loc, false); - return; - } - - // not a redirect. serve some content. - // the content doesn't have to be valid, since we're only checking whether - // the request for the content was sent or not. - - // downloadable font - if (query["res"] == "font") { - response.setHeader("Access-Control-Allow-Origin", "*", false); - response.setHeader("Content-Type", "text/plain", false); - response.write("font data..."); - return; - } - - if (query["res"] == "font-spec-compliant") { - response.setHeader("Access-Control-Allow-Origin", "*", false); - response.setHeader("Content-Type", "text/plain", false); - response.write("font data..."); - return; - } - - // iframe with arbitrary content - if (query["res"] == "iframe") { - response.setHeader("Content-Type", "text/html", false); - response.write("iframe content..."); - return; - } - - // image - if (query["res"] == "image") { - response.setHeader("Content-Type", "image/gif", false); - response.write("image data..."); - return; - } - - // media content, e.g. Ogg video - if (query["res"] == "media") { - response.setHeader("Content-Type", "video/ogg", false); - response.write("video data..."); - return; - } - - // plugin content, e.g. - if (query["res"] == "object") { - response.setHeader("Content-Type", "text/html", false); - response.write("object data..."); - return; - } - - // script - if (query["res"] == "script") { - response.setHeader("Content-Type", "application/javascript", false); - response.write("some script..."); - return; - } - - // external stylesheet - if (query["res"] == "style") { - response.setHeader("Content-Type", "text/css", false); - response.write("css data..."); - return; - } - - // web worker resource - if (query["res"] == "worker") { - response.setHeader("Content-Type", "application/javascript", false); - response.write("worker script data..."); - return; - } - - // script that invokes XHR - if (query["res"] == "xhr") { - response.setHeader("Content-Type", "text/html", false); - var resp = 'var x = new XMLHttpRequest(); x.open("GET", "' + otherSite + - resource+'?res=xhr-resp&testid=xhr-src-redir", false); ' + - 'x.send(null);'; - response.write(resp); - return; - } - - if (query["res"] == "xhr-spec-compliant") { - response.setHeader("Content-Type", "text/html", false); - var resp = 'var x = new XMLHttpRequest(); x.open("GET", "' + otherSite + - resource+'?res=xhr-resp-spec-compliant&testid=xhr-src-redir-spec-compliant", false); ' + - 'x.send(null);'; - response.write(resp); - return; - } - - // response to XHR - if (query["res"] == "xhr-resp-spec-compliant") { - response.setHeader("Access-Control-Allow-Origin", "*", false); - response.setHeader("Content-Type", "text/html", false); - response.write('XHR response...'); - return; - } -} diff --git a/content/base/test/xcsp/file_csp_report.sjs b/content/base/test/xcsp/file_csp_report.sjs deleted file mode 100644 index baf88b02d4a6..000000000000 --- a/content/base/test/xcsp/file_csp_report.sjs +++ /dev/null @@ -1,25 +0,0 @@ -// SJS file for CSP violation report test -// https://bugzilla.mozilla.org/show_bug.cgi?id=548193 -function handleRequest(request, response) -{ - var query = {}; - request.queryString.split('&').forEach(function (val) { - var [name, value] = val.split('='); - query[name] = unescape(value); - }); - - response.setHeader("Content-Type", "text/html", false); - - // avoid confusing cache behaviors - response.setHeader("Cache-Control", "no-cache", false); - - // set CSP header - response.setHeader("X-Content-Security-Policy", - "allow 'self'; report-uri http://mochi.test:8888/csp-report.cgi", - false); - - // content which will trigger a violation report - response.write(''); - response.write(' '); - response.write(''); -} diff --git a/content/base/test/xcsp/file_dual_headers_warning.html b/content/base/test/xcsp/file_dual_headers_warning.html deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/content/base/test/xcsp/file_dual_headers_warning.html^headers^ b/content/base/test/xcsp/file_dual_headers_warning.html^headers^ deleted file mode 100644 index cf50395074be..000000000000 --- a/content/base/test/xcsp/file_dual_headers_warning.html^headers^ +++ /dev/null @@ -1,2 +0,0 @@ -Content-Security-Policy: default-src 'self' 'unsafe-inline'; -X-Content-Security-Policy: allow 'self' 'inline-script'; diff --git a/content/base/test/xcsp/file_multi_policy_injection_bypass.html b/content/base/test/xcsp/file_multi_policy_injection_bypass.html deleted file mode 100644 index 82eed84570a3..000000000000 --- a/content/base/test/xcsp/file_multi_policy_injection_bypass.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - diff --git a/content/base/test/xcsp/file_multi_policy_injection_bypass.html^headers^ b/content/base/test/xcsp/file_multi_policy_injection_bypass.html^headers^ deleted file mode 100644 index fc46a167c3df..000000000000 --- a/content/base/test/xcsp/file_multi_policy_injection_bypass.html^headers^ +++ /dev/null @@ -1 +0,0 @@ -X-Content-Security-Policy: default-src 'self', allow * diff --git a/content/base/test/xcsp/file_multi_policy_injection_bypass_2.html b/content/base/test/xcsp/file_multi_policy_injection_bypass_2.html deleted file mode 100644 index 6f27a043fb87..000000000000 --- a/content/base/test/xcsp/file_multi_policy_injection_bypass_2.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - diff --git a/content/base/test/xcsp/file_multi_policy_injection_bypass_2.html^headers^ b/content/base/test/xcsp/file_multi_policy_injection_bypass_2.html^headers^ deleted file mode 100644 index 772246e1247e..000000000000 --- a/content/base/test/xcsp/file_multi_policy_injection_bypass_2.html^headers^ +++ /dev/null @@ -1 +0,0 @@ -X-Content-Security-Policy: default-src 'self' , allow * diff --git a/content/base/test/xcsp/file_policyuri_async_fetch.html b/content/base/test/xcsp/file_policyuri_async_fetch.html deleted file mode 100644 index cf941d15475c..000000000000 --- a/content/base/test/xcsp/file_policyuri_async_fetch.html +++ /dev/null @@ -1,5 +0,0 @@ - - diff --git a/content/base/test/xcsp/file_policyuri_async_fetch.html^headers^ b/content/base/test/xcsp/file_policyuri_async_fetch.html^headers^ deleted file mode 100644 index de4233d20fe9..000000000000 --- a/content/base/test/xcsp/file_policyuri_async_fetch.html^headers^ +++ /dev/null @@ -1 +0,0 @@ -X-Content-Security-Policy: invalid-uri diff --git a/content/base/test/xcsp/file_redirect_content.sjs b/content/base/test/xcsp/file_redirect_content.sjs deleted file mode 100644 index 9a6461d69bbf..000000000000 --- a/content/base/test/xcsp/file_redirect_content.sjs +++ /dev/null @@ -1,38 +0,0 @@ -// https://bugzilla.mozilla.org/show_bug.cgi?id=650386 -// This SJS file serves file_redirect_content.html -// with a CSP that will trigger a violation and that will report it -// to file_redirect_report.sjs -// -// This handles 301, 302, 303 and 307 redirects. The HTTP status code -// returned/type of redirect to do comes from the query string -// parameter passed in from the test_bug650386_* files and then also -// uses that value in the report-uri parameter of the CSP -function handleRequest(request, response) { - response.setHeader("Cache-Control", "no-cache", false); - - // this gets used in the CSP as part of the report URI. - var redirect = request.queryString; - - if (redirect < 301 || (redirect > 303 && redirect <= 306) || redirect > 307) { - // if we somehow got some bogus redirect code here, - // do a 302 redirect to the same URL as the report URI - // redirects to - this will fail the test. - var loc = "http://example.com/some/fake/path"; - response.setStatusLine("1.1", 302, "Found"); - response.setHeader("Location", loc, false); - return; - } - - var csp = "default-src \'self\';report-uri http://mochi.test:8888/tests/content/base/test/csp/file_redirect_report.sjs?" + redirect; - - response.setHeader("X-Content-Security-Policy", csp, false); - - // the actual file content. - // this image load will (intentionally) fail due to the CSP policy of default-src: 'self' - // specified by the CSP string above. - var content = ""; - - response.write(content); - - return; -} diff --git a/content/base/test/xcsp/file_redirect_report.sjs b/content/base/test/xcsp/file_redirect_report.sjs deleted file mode 100644 index 9cc7e6548638..000000000000 --- a/content/base/test/xcsp/file_redirect_report.sjs +++ /dev/null @@ -1,17 +0,0 @@ -// https://bugzilla.mozilla.org/show_bug.cgi?id=650386 -// This SJS file serves as CSP violation report target -// and issues a redirect, to make sure the browser does not post to the target -// of the redirect, per CSP spec. -// This handles 301, 302, 303 and 307 redirects. The HTTP status code -// returned/type of redirect to do comes from the query string -// parameter -function handleRequest(request, response) { - response.setHeader("Cache-Control", "no-cache", false); - - var redirect = request.queryString; - - var loc = "http://example.com/some/fake/path"; - response.setStatusLine("1.1", redirect, "Found"); - response.setHeader("Location", loc, false); - return; -} diff --git a/content/base/test/xcsp/file_subframe_run_js_if_allowed.html b/content/base/test/xcsp/file_subframe_run_js_if_allowed.html deleted file mode 100644 index 3ba970ce8469..000000000000 --- a/content/base/test/xcsp/file_subframe_run_js_if_allowed.html +++ /dev/null @@ -1,13 +0,0 @@ - - - -click - - diff --git a/content/base/test/xcsp/file_subframe_run_js_if_allowed.html^headers^ b/content/base/test/xcsp/file_subframe_run_js_if_allowed.html^headers^ deleted file mode 100644 index 426d8738c602..000000000000 --- a/content/base/test/xcsp/file_subframe_run_js_if_allowed.html^headers^ +++ /dev/null @@ -1 +0,0 @@ -X-Content-Security-Policy: default-src *; options inline-script diff --git a/content/base/test/xcsp/mochitest.ini b/content/base/test/xcsp/mochitest.ini deleted file mode 100644 index eec01cd447c3..000000000000 --- a/content/base/test/xcsp/mochitest.ini +++ /dev/null @@ -1,69 +0,0 @@ -[DEFAULT] -support-files = - file_CSP.css - file_CSP.sjs - file_CSP_bug916446.html - file_CSP_bug916446.html^headers^ - file_CSP_evalscript_main.html - file_CSP_evalscript_main.html^headers^ - file_CSP_evalscript_main.js - file_CSP_evalscript_main_getCRMFRequest.html - file_CSP_evalscript_main_getCRMFRequest.html^headers^ - file_CSP_evalscript_main_getCRMFRequest.js - file_CSP_evalscript_no_CSP_at_all.html - file_CSP_evalscript_no_CSP_at_all.html^headers^ - file_CSP_evalscript_no_CSP_at_all.js - file_CSP_frameancestors.sjs - file_CSP_frameancestors_main.html - file_CSP_frameancestors_main.js - file_CSP_inlinescript_main.html - file_CSP_inlinescript_main.html^headers^ - file_CSP_inlinestyle_main.html - file_CSP_inlinestyle_main.html^headers^ - file_CSP_main.html - file_CSP_main.html^headers^ - file_CSP_main.js - file_bothCSPheaders.html - file_bothCSPheaders.html^headers^ - file_csp_bug768029.html - file_csp_bug768029.sjs - file_csp_bug773891.html - file_csp_bug773891.sjs - file_csp_redirects_main.html - file_csp_redirects_page.sjs - file_csp_redirects_resource.sjs - file_dual_headers_warning.html - file_dual_headers_warning.html^headers^ - file_csp_report.sjs - file_policyuri_async_fetch.html - file_policyuri_async_fetch.html^headers^ - file_redirect_content.sjs - file_redirect_report.sjs - file_subframe_run_js_if_allowed.html - file_subframe_run_js_if_allowed.html^headers^ - file_multi_policy_injection_bypass.html - file_multi_policy_injection_bypass.html^headers^ - file_multi_policy_injection_bypass_2.html - file_multi_policy_injection_bypass_2.html^headers^ - -[test_CSP.html] -[test_CSP_bug916446.html] -[test_CSP_evalscript.html] -[test_CSP_evalscript_getCRMFRequest.html] -skip-if = buildapp == 'b2g' || toolkit == 'android' || e10s # no (deprecated) window.crypto support in multiprocess (bug 824652) -[test_CSP_frameancestors.html] -skip-if = (buildapp == 'b2g' && (toolkit != 'gonk' || debug)) || toolkit == 'android' # Times out, not sure why (bug 1008445) -[test_CSP_inlinescript.html] -[test_CSP_inlinestyle.html] -[test_bothCSPheaders.html] -[test_csp_redirects.html] -[test_dual_headers_warning.html] -[test_csp_report.html] -skip-if = e10s || buildapp == 'b2g' # http-on-opening-request observer not supported in child process (bug 1009632) -[test_policyuri_async_fetch.html] -[test_301_redirect.html] -[test_302_redirect.html] -[test_303_redirect.html] -[test_307_redirect.html] -[test_subframe_run_js_if_allowed.html] -[test_multi_policy_injection_bypass.html] diff --git a/content/base/test/xcsp/test_301_redirect.html b/content/base/test/xcsp/test_301_redirect.html deleted file mode 100644 index ebb903a8e626..000000000000 --- a/content/base/test/xcsp/test_301_redirect.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - Test for Bug 650386 - - - - -Mozilla Bug 650386 -

- -
-
-
- - diff --git a/content/base/test/xcsp/test_302_redirect.html b/content/base/test/xcsp/test_302_redirect.html deleted file mode 100644 index cf2b1f4492fc..000000000000 --- a/content/base/test/xcsp/test_302_redirect.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - Test for Bug 650386 - - - - -Mozilla Bug 650386 -

- -
-
-
- - diff --git a/content/base/test/xcsp/test_303_redirect.html b/content/base/test/xcsp/test_303_redirect.html deleted file mode 100644 index ec191700e1c5..000000000000 --- a/content/base/test/xcsp/test_303_redirect.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - Test for Bug 650386 - - - - -Mozilla Bug 650386 -

- -
-
-
- - diff --git a/content/base/test/xcsp/test_307_redirect.html b/content/base/test/xcsp/test_307_redirect.html deleted file mode 100644 index 48997177ac40..000000000000 --- a/content/base/test/xcsp/test_307_redirect.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - Test for Bug 650386 - - - - -Mozilla Bug 650386 -

- -
-
-
- - diff --git a/content/base/test/xcsp/test_CSP.html b/content/base/test/xcsp/test_CSP.html deleted file mode 100644 index 865bc54150d2..000000000000 --- a/content/base/test/xcsp/test_CSP.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - Test for Content Security Policy Connections - - - - -

- - - - - - diff --git a/content/base/test/xcsp/test_CSP_bug916446.html b/content/base/test/xcsp/test_CSP_bug916446.html deleted file mode 100644 index df7bf61cb218..000000000000 --- a/content/base/test/xcsp/test_CSP_bug916446.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - Test for Bug 916446 - - - - - - - - - - - diff --git a/content/base/test/xcsp/test_CSP_evalscript.html b/content/base/test/xcsp/test_CSP_evalscript.html deleted file mode 100644 index c55bf309ea48..000000000000 --- a/content/base/test/xcsp/test_CSP_evalscript.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - Test for Content Security Policy "no eval" base restriction - - - - -

- - - - - - diff --git a/content/base/test/xcsp/test_CSP_evalscript_getCRMFRequest.html b/content/base/test/xcsp/test_CSP_evalscript_getCRMFRequest.html deleted file mode 100644 index 2c599f973c65..000000000000 --- a/content/base/test/xcsp/test_CSP_evalscript_getCRMFRequest.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - Test for Content Security Policy "no eval" in crypto.getCRMFRequest() - - - - -

- - - - - - - diff --git a/content/base/test/xcsp/test_CSP_frameancestors.html b/content/base/test/xcsp/test_CSP_frameancestors.html deleted file mode 100644 index 34faee5b3cee..000000000000 --- a/content/base/test/xcsp/test_CSP_frameancestors.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - Test for Content Security Policy Frame Ancestors directive - - - - -

- - - - - - diff --git a/content/base/test/xcsp/test_CSP_inlinescript.html b/content/base/test/xcsp/test_CSP_inlinescript.html deleted file mode 100644 index ed0537700ffc..000000000000 --- a/content/base/test/xcsp/test_CSP_inlinescript.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - Test for Content Security Policy Frame Ancestors directive - - - - - -

- - - - - - - diff --git a/content/base/test/xcsp/test_CSP_inlinestyle.html b/content/base/test/xcsp/test_CSP_inlinestyle.html deleted file mode 100644 index 5beef75d77b5..000000000000 --- a/content/base/test/xcsp/test_CSP_inlinestyle.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - Test for Content Security Policy inline stylesheets stuff - - - - -

- - - - - - - diff --git a/content/base/test/xcsp/test_bothCSPheaders.html b/content/base/test/xcsp/test_bothCSPheaders.html deleted file mode 100644 index e7195d2ea1ae..000000000000 --- a/content/base/test/xcsp/test_bothCSPheaders.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - Test for Correctly Handling Both Pre-1.0 and 1.0 Content Security Policy Headers - - - - - -

- - - - - - - diff --git a/content/base/test/xcsp/test_csp_bug768029.html b/content/base/test/xcsp/test_csp_bug768029.html deleted file mode 100644 index d455326c4cb7..000000000000 --- a/content/base/test/xcsp/test_csp_bug768029.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - Test for CSP on trusted/certified apps -- bug 768029 - - - - -Mozilla Bug 768029 -

-
- -
-
-
-
- - diff --git a/content/base/test/xcsp/test_csp_bug773891.html b/content/base/test/xcsp/test_csp_bug773891.html deleted file mode 100644 index 8d0736fb7904..000000000000 --- a/content/base/test/xcsp/test_csp_bug773891.html +++ /dev/null @@ -1,228 +0,0 @@ - - - - - - Test for CSP on trusted/certified and installed apps -- bug 773891 - - - - -Mozilla Bug 773891 -

-
- -
-
-
-
- - diff --git a/content/base/test/xcsp/test_csp_redirects.html b/content/base/test/xcsp/test_csp_redirects.html deleted file mode 100644 index 40140edb1e8c..000000000000 --- a/content/base/test/xcsp/test_csp_redirects.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - Tests for Content Security Policy during redirects - - - - -

- - - -

-
-
-
-
-
diff --git a/content/base/test/xcsp/test_csp_report.html b/content/base/test/xcsp/test_csp_report.html
deleted file mode 100644
index b6ca7f433fac..000000000000
--- a/content/base/test/xcsp/test_csp_report.html
+++ /dev/null
@@ -1,108 +0,0 @@
-
-
-
-
-  Test for Bug 548193
-  
-  
-
-
-

- - - - - - - diff --git a/content/base/test/xcsp/test_dual_headers_warning.html b/content/base/test/xcsp/test_dual_headers_warning.html deleted file mode 100644 index 4d423b93ab90..000000000000 --- a/content/base/test/xcsp/test_dual_headers_warning.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Test for Bug 918397 - - - - -Mozilla Bug 918397 -

- - - -
-
-
-
diff --git a/content/base/test/xcsp/test_multi_policy_injection_bypass.html b/content/base/test/xcsp/test_multi_policy_injection_bypass.html
deleted file mode 100644
index 5a1315b5be6e..000000000000
--- a/content/base/test/xcsp/test_multi_policy_injection_bypass.html
+++ /dev/null
@@ -1,121 +0,0 @@
-
-
-
-
-  Test for Bug 717511
-  
-  
-
-
-

- - - - - -
- - diff --git a/content/base/test/xcsp/test_policyuri_async_fetch.html b/content/base/test/xcsp/test_policyuri_async_fetch.html deleted file mode 100644 index c782d1a4997a..000000000000 --- a/content/base/test/xcsp/test_policyuri_async_fetch.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Test for Bug 558431 - - - - - - - - diff --git a/content/base/test/xcsp/test_subframe_run_js_if_allowed.html b/content/base/test/xcsp/test_subframe_run_js_if_allowed.html deleted file mode 100644 index 96a70b366a94..000000000000 --- a/content/base/test/xcsp/test_subframe_run_js_if_allowed.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Test for Bug 702439 - - - - - - - - diff --git a/content/html/document/src/nsHTMLDocument.cpp b/content/html/document/src/nsHTMLDocument.cpp index 607c0c81452a..3003350a8648 100644 --- a/content/html/document/src/nsHTMLDocument.cpp +++ b/content/html/document/src/nsHTMLDocument.cpp @@ -1576,6 +1576,13 @@ nsHTMLDocument::Open(JSContext* cx, #ifdef DEBUG bool willReparent = mWillReparent; mWillReparent = true; + + nsDocument* templateContentsOwner = + static_cast(mTemplateContentsOwner.get()); + + if (templateContentsOwner) { + templateContentsOwner->mWillReparent = true; + } #endif // Should this pass true for aForceReuseInnerWindow? @@ -1585,6 +1592,10 @@ nsHTMLDocument::Open(JSContext* cx, } #ifdef DEBUG + if (templateContentsOwner) { + templateContentsOwner->mWillReparent = willReparent; + } + mWillReparent = willReparent; #endif @@ -1601,6 +1612,20 @@ nsHTMLDocument::Open(JSContext* cx, if (rv.Failed()) { return nullptr; } + + // Also reparent the template contents owner document + // because its global is set to the same as this document. + if (mTemplateContentsOwner) { + JS::Rooted contentsOwnerWrapper(cx, + mTemplateContentsOwner->GetWrapper()); + if (contentsOwnerWrapper) { + rv = mozilla::dom::ReparentWrapper(cx, contentsOwnerWrapper); + if (rv.Failed()) { + return nullptr; + } + } + } + nsIXPConnect *xpc = nsContentUtils::XPConnect(); rv = xpc->RescueOrphansInScope(cx, oldScope->GetGlobalJSObject()); if (rv.Failed()) { diff --git a/content/media/AudioSink.cpp b/content/media/AudioSink.cpp new file mode 100644 index 000000000000..7066dc80fa33 --- /dev/null +++ b/content/media/AudioSink.cpp @@ -0,0 +1,407 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:set ts=2 sw=2 sts=2 et cindent: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "AudioSink.h" +#include "MediaDecoderStateMachine.h" +#include "AudioStream.h" +#include "prenv.h" + +namespace mozilla { + +#ifdef PR_LOGGING +extern PRLogModuleInfo* gMediaDecoderLog; +#define SINK_LOG(msg, ...) \ + PR_LOG(gMediaDecoderLog, PR_LOG_DEBUG, ("AudioSink=%p " msg, this, ##__VA_ARGS__)) +#define SINK_LOG_V(msg, ...) \ + PR_BEGIN_MACRO \ + if (!PR_GetEnv("MOZ_QUIET")) { \ + SINK_LOG(msg, ##__VA_ARGS__); \ + } \ + PR_END_MACRO +#else +#define SINK_LOG(msg, ...) +#define SINK_LOG_V(msg, ...) +#endif + +AudioSink::AudioSink(MediaDecoderStateMachine* aStateMachine, + int64_t aStartTime, AudioInfo aInfo, dom::AudioChannel aChannel) + : mStateMachine(aStateMachine) + , mStartTime(aStartTime) + , mWritten(0) + , mInfo(aInfo) + , mChannel(aChannel) + , mVolume(1.0) + , mPlaybackRate(1.0) + , mPreservesPitch(false) + , mStopAudioThread(false) + , mSetVolume(false) + , mSetPlaybackRate(false) + , mSetPreservesPitch(false) + , mPlaying(true) +{ + NS_ASSERTION(mStartTime != -1, "Should have audio start time by now"); +} + +nsresult +AudioSink::Init() +{ + nsresult rv = NS_NewNamedThread("Media Audio", + getter_AddRefs(mThread), + nullptr, + MEDIA_THREAD_STACK_SIZE); + if (NS_FAILED(rv)) { + return rv; + } + nsCOMPtr event = NS_NewRunnableMethod(this, &AudioSink::AudioLoop); + return mThread->Dispatch(event, NS_DISPATCH_NORMAL); +} + +int64_t +AudioSink::GetPosition() +{ + if (!mAudioStream) { + return 0; + } + return mAudioStream->GetPosition(); +} + +void +AudioSink::PrepareToShutdown() +{ + AssertCurrentThreadInMonitor(); + mStopAudioThread = true; + if (mAudioStream) { + mAudioStream->Cancel(); + } + GetReentrantMonitor().NotifyAll(); +} + +void +AudioSink::Shutdown() +{ + mThread->Shutdown(); + mThread = nullptr; + MOZ_ASSERT(!mAudioStream); +} + +void +AudioSink::SetVolume(double aVolume) +{ + AssertCurrentThreadInMonitor(); + mVolume = aVolume; + mSetVolume = true; +} + +void +AudioSink::SetPlaybackRate(double aPlaybackRate) +{ + AssertCurrentThreadInMonitor(); + NS_ASSERTION(mPlaybackRate != 0, "Don't set the playbackRate to 0 on AudioStream"); + mPlaybackRate = aPlaybackRate; + mSetPlaybackRate = true; +} + +void +AudioSink::SetPreservesPitch(bool aPreservesPitch) +{ + AssertCurrentThreadInMonitor(); + mPreservesPitch = aPreservesPitch; + mSetPreservesPitch = true; +} + +void +AudioSink::StartPlayback() +{ + AssertCurrentThreadInMonitor(); + mPlaying = true; + GetReentrantMonitor().NotifyAll(); +} + +void +AudioSink::StopPlayback() +{ + AssertCurrentThreadInMonitor(); + mPlaying = false; + GetReentrantMonitor().NotifyAll(); +} + +void +AudioSink::AudioLoop() +{ + AssertOnAudioThread(); + SINK_LOG("AudioLoop started"); + + if (NS_FAILED(InitializeAudioStream())) { + NS_WARNING("Initializing AudioStream failed."); + return; + } + + while (1) { + WaitForAudioToPlay(); + if (!IsPlaybackContinuing()) { + break; + } + + // See if there's a gap in the audio. If there is, push silence into the + // audio hardware, so we can play across the gap. + // Calculate the timestamp of the next chunk of audio in numbers of + // samples. + NS_ASSERTION(AudioQueue().GetSize() > 0, "Should have data to play"); + CheckedInt64 sampleTime = UsecsToFrames(AudioQueue().PeekFront()->mTime, mInfo.mRate); + + // Calculate the number of frames that have been pushed onto the audio hardware. + CheckedInt64 playedFrames = UsecsToFrames(mStartTime, mInfo.mRate) + mWritten; + + CheckedInt64 missingFrames = sampleTime - playedFrames; + if (!missingFrames.isValid() || !sampleTime.isValid()) { + NS_WARNING("Int overflow adding in AudioLoop"); + break; + } + + if (missingFrames.value() > 0) { + // The next audio chunk begins some time after the end of the last chunk + // we pushed to the audio hardware. We must push silence into the audio + // hardware so that the next audio chunk begins playback at the correct + // time. + missingFrames = std::min(UINT32_MAX, missingFrames.value()); + mWritten += PlaySilence(static_cast(missingFrames.value())); + } else { + mWritten += PlayFromAudioQueue(); + } + int64_t endTime = GetEndTime(); + if (endTime != -1) { + mStateMachine->OnAudioEndTimeUpdate(endTime); + } + } + ReentrantMonitorAutoEnter mon(GetReentrantMonitor()); + if (!mStopAudioThread && AudioQueue().AtEndOfStream()) { + Drain(); + } + SINK_LOG("AudioLoop complete"); + Cleanup(); + SINK_LOG("AudioLoop exit"); +} + +nsresult +AudioSink::InitializeAudioStream() +{ + // AudioStream initialization can block for extended periods in unusual + // circumstances, so we take care to drop the decoder monitor while + // initializing. + RefPtr audioStream(new AudioStream()); + audioStream->Init(mInfo.mChannels, mInfo.mRate, + mChannel, AudioStream::HighLatency); + // TODO: Check Init's return value and bail on error. Unfortunately this + // causes some tests to fail due to playback failing. + ReentrantMonitorAutoEnter mon(GetReentrantMonitor()); + mAudioStream = audioStream; + UpdateStreamSettings(); + + return NS_OK; +} + +void +AudioSink::Drain() +{ + MOZ_ASSERT(mPlaying && !mAudioStream->IsPaused()); + AssertCurrentThreadInMonitor(); + // If the media was too short to trigger the start of the audio stream, + // start it now. + mAudioStream->Start(); + { + ReentrantMonitorAutoExit exit(GetReentrantMonitor()); + mAudioStream->Drain(); + } +} + +void +AudioSink::Cleanup() +{ + // Must hold lock while shutting down and anulling the audio stream to prevent + // state machine thread trying to use it while we're destroying it. + AssertCurrentThreadInMonitor(); + mAudioStream->Shutdown(); + mAudioStream = nullptr; + mStateMachine->OnAudioSinkComplete(); +} + +bool +AudioSink::ExpectMoreAudioData() +{ + return AudioQueue().GetSize() == 0 && !AudioQueue().IsFinished(); +} + +void +AudioSink::WaitForAudioToPlay() +{ + // Wait while we're not playing, and we're not shutting down, or we're + // playing and we've got no audio to play. + ReentrantMonitorAutoEnter mon(GetReentrantMonitor()); + while (!mStopAudioThread && (!mPlaying || ExpectMoreAudioData())) { + if (!mPlaying && !mAudioStream->IsPaused()) { + mAudioStream->Pause(); + } + mon.Wait(); + } +} + +bool +AudioSink::IsPlaybackContinuing() +{ + ReentrantMonitorAutoEnter mon(GetReentrantMonitor()); + if (mPlaying && mAudioStream->IsPaused()) { + mAudioStream->Resume(); + } + + // If we're shutting down, captured, or at EOS, break out and exit the audio + // thread. + if (mStopAudioThread || AudioQueue().AtEndOfStream()) { + return false; + } + + UpdateStreamSettings(); + + return true; +} + +uint32_t +AudioSink::PlaySilence(uint32_t aFrames) +{ + // Maximum number of bytes we'll allocate and write at once to the audio + // hardware when the audio stream contains missing frames and we're + // writing silence in order to fill the gap. We limit our silence-writes + // to 32KB in order to avoid allocating an impossibly large chunk of + // memory if we encounter a large chunk of silence. + const uint32_t SILENCE_BYTES_CHUNK = 32 * 1024; + + AssertOnAudioThread(); + NS_ASSERTION(!mAudioStream->IsPaused(), "Don't play when paused"); + uint32_t maxFrames = SILENCE_BYTES_CHUNK / mInfo.mChannels / sizeof(AudioDataValue); + uint32_t frames = std::min(aFrames, maxFrames); + SINK_LOG_V("playing %u frames of silence", aFrames); + WriteSilence(frames); + return frames; +} + +uint32_t +AudioSink::PlayFromAudioQueue() +{ + AssertOnAudioThread(); + NS_ASSERTION(!mAudioStream->IsPaused(), "Don't play when paused"); + nsAutoPtr audio(AudioQueue().PopFront()); + { + ReentrantMonitorAutoEnter mon(GetReentrantMonitor()); + NS_WARN_IF_FALSE(mPlaying, "Should be playing"); + // Awaken the decode loop if it's waiting for space to free up in the + // audio queue. + GetReentrantMonitor().NotifyAll(); + } + SINK_LOG_V("playing %u frames of audio at time %lld", + this, audio->mFrames, audio->mTime); + mAudioStream->Write(audio->mAudioData, audio->mFrames); + + StartAudioStreamPlaybackIfNeeded(); + + if (audio->mOffset != -1) { + mStateMachine->OnPlaybackOffsetUpdate(audio->mOffset); + } + return audio->mFrames; +} + +void +AudioSink::UpdateStreamSettings() +{ + AssertCurrentThreadInMonitor(); + + bool setVolume = mSetVolume; + bool setPlaybackRate = mSetPlaybackRate; + bool setPreservesPitch = mSetPreservesPitch; + double volume = mVolume; + double playbackRate = mPlaybackRate; + bool preservesPitch = mPreservesPitch; + + mSetVolume = false; + mSetPlaybackRate = false; + mSetPreservesPitch = false; + + { + ReentrantMonitorAutoExit exit(GetReentrantMonitor()); + if (setVolume) { + mAudioStream->SetVolume(volume); + } + + if (setPlaybackRate && + NS_FAILED(mAudioStream->SetPlaybackRate(playbackRate))) { + NS_WARNING("Setting the playback rate failed in AudioSink."); + } + + if (setPreservesPitch && + NS_FAILED(mAudioStream->SetPreservesPitch(preservesPitch))) { + NS_WARNING("Setting the pitch preservation failed in AudioSink."); + } + } +} + +void +AudioSink::StartAudioStreamPlaybackIfNeeded() +{ + // This value has been chosen empirically. + const uint32_t MIN_WRITE_BEFORE_START_USECS = 200000; + + // We want to have enough data in the buffer to start the stream. + if (static_cast(mAudioStream->GetWritten()) / mAudioStream->GetRate() >= + static_cast(MIN_WRITE_BEFORE_START_USECS) / USECS_PER_S) { + mAudioStream->Start(); + } +} + +void +AudioSink::WriteSilence(uint32_t aFrames) +{ + uint32_t numSamples = aFrames * mInfo.mChannels; + nsAutoTArray buf; + buf.SetLength(numSamples); + memset(buf.Elements(), 0, numSamples * sizeof(AudioDataValue)); + mAudioStream->Write(buf.Elements(), aFrames); + + StartAudioStreamPlaybackIfNeeded(); +} + +int64_t +AudioSink::GetEndTime() +{ + CheckedInt64 playedUsecs = FramesToUsecs(mWritten, mInfo.mRate) + mStartTime; + if (!playedUsecs.isValid()) { + NS_WARNING("Int overflow calculating audio end time"); + return -1; + } + return playedUsecs.value(); +} + +MediaQueue& +AudioSink::AudioQueue() +{ + return mStateMachine->AudioQueue(); +} + +ReentrantMonitor& +AudioSink::GetReentrantMonitor() +{ + return mStateMachine->mDecoder->GetReentrantMonitor(); +} + +void +AudioSink::AssertCurrentThreadInMonitor() +{ + return mStateMachine->AssertCurrentThreadInMonitor(); +} + +void +AudioSink::AssertOnAudioThread() +{ + MOZ_ASSERT(IsCurrentThread(mThread)); +} + +} // namespace mozilla diff --git a/content/media/AudioSink.h b/content/media/AudioSink.h new file mode 100644 index 000000000000..a4af55aeb337 --- /dev/null +++ b/content/media/AudioSink.h @@ -0,0 +1,138 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:set ts=2 sw=2 sts=2 et cindent: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#if !defined(AudioSink_h__) +#define AudioSink_h__ + +#include "nsISupportsImpl.h" +#include "MediaDecoderReader.h" +#include "mozilla/dom/AudioChannelBinding.h" + +namespace mozilla { + +class AudioAvailableEventManager; +class AudioStream; +class MediaDecoderStateMachine; + +class AudioSink { +public: + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(AudioSink) + + AudioSink(MediaDecoderStateMachine* aStateMachine, + int64_t aStartTime, AudioInfo aInfo, dom::AudioChannel aChannel); + + nsresult Init(); + + int64_t GetPosition(); + + // Tell the AudioSink to stop processing and initiate shutdown. Must be + // called with the decoder monitor held. + void PrepareToShutdown(); + + // Shut down the AudioSink's resources. The decoder monitor must not be + // held during this call, as it may block processing thread event queues. + void Shutdown(); + + void SetVolume(double aVolume); + void SetPlaybackRate(double aPlaybackRate); + void SetPreservesPitch(bool aPreservesPitch); + + void StartPlayback(); + void StopPlayback(); + +private: + ~AudioSink() {} + + // The main loop for the audio thread. Sent to the thread as + // an nsRunnableMethod. This continually does blocking writes to + // to audio stream to play audio data. + void AudioLoop(); + + // Allocate and initialize mAudioStream. Returns NS_OK on success. + nsresult InitializeAudioStream(); + + void Drain(); + + void Cleanup(); + + bool ExpectMoreAudioData(); + + // Wait on the decoder monitor until playback is ready or the sink is told to shut down. + void WaitForAudioToPlay(); + + // Check if the sink has been told to shut down, resuming mAudioStream if + // not. Returns true if processing should continue, false if AudioLoop + // should shutdown. + bool IsPlaybackContinuing(); + + // Write aFrames of audio frames of silence to the audio hardware. Returns + // the number of frames actually written. The write size is capped at + // SILENCE_BYTES_CHUNK (32kB), so must be called in a loop to write the + // desired number of frames. This ensures that the playback position + // advances smoothly, and guarantees that we don't try to allocate an + // impossibly large chunk of memory in order to play back silence. Called + // on the audio thread. + uint32_t PlaySilence(uint32_t aFrames); + + // Pops an audio chunk from the front of the audio queue, and pushes its + // audio data to the audio hardware. Called on the audio thread. + uint32_t PlayFromAudioQueue(); + + void UpdateStreamSettings(); + + // If we have already written enough frames to the AudioStream, start the + // playback. + void StartAudioStreamPlaybackIfNeeded(); + void WriteSilence(uint32_t aFrames); + + int64_t GetEndTime(); + + MediaQueue& AudioQueue(); + + ReentrantMonitor& GetReentrantMonitor(); + void AssertCurrentThreadInMonitor(); + void AssertOnAudioThread(); + + nsRefPtr mStateMachine; + + // Thread for pushing audio onto the audio hardware. + // The "audio push thread". + nsCOMPtr mThread; + + // The audio stream resource. Used on the state machine, and audio threads. + // This is created and destroyed on the audio thread, while holding the + // decoder monitor, so if this is used off the audio thread, you must + // first acquire the decoder monitor and check that it is non-null. + RefPtr mAudioStream; + + // The presentation time of the first audio frame that was played in + // microseconds. We can add this to the audio stream position to determine + // the current audio time. Accessed on audio and state machine thread. + // Synchronized by decoder monitor. + int64_t mStartTime; + + // PCM frames written to the stream so far. + int64_t mWritten; + + AudioInfo mInfo; + + dom::AudioChannel mChannel; + + double mVolume; + double mPlaybackRate; + bool mPreservesPitch; + + bool mStopAudioThread; + + bool mSetVolume; + bool mSetPlaybackRate; + bool mSetPreservesPitch; + + bool mPlaying; +}; + +} // namespace mozilla + +#endif diff --git a/content/media/AudioStream.cpp b/content/media/AudioStream.cpp index d36e3abca6de..3f9f804af2ed 100644 --- a/content/media/AudioStream.cpp +++ b/content/media/AudioStream.cpp @@ -51,6 +51,88 @@ double AudioStream::sVolumeScale; uint32_t AudioStream::sCubebLatency; bool AudioStream::sCubebLatencyPrefSet; + +/** + * Keep a list of frames sent to the audio engine in each DataCallback along + * with the playback rate at the moment. Since the playback rate and number of + * underrun frames can vary in each callback. We need to keep the whole history + * in order to calculate the playback position of the audio engine correctly. + */ +class FrameHistory { + struct Chunk { + uint32_t servicedFrames; + uint32_t totalFrames; + int rate; + }; + + template + static T FramesToUs(uint32_t frames, int rate) { + return static_cast(frames) * USECS_PER_S / rate; + } +public: + FrameHistory() + : mBaseOffset(0), mBasePosition(0) {} + + void Append(uint32_t aServiced, uint32_t aUnderrun, int aRate) { + /* In most case where playback rate stays the same and we don't underrun + * frames, we are able to merge chunks to avoid lose of precision to add up + * in compressing chunks into |mBaseOffset| and |mBasePosition|. + */ + if (!mChunks.IsEmpty()) { + Chunk& c = mChunks.LastElement(); + // 2 chunks (c1 and c2) can be merged when rate is the same and + // adjacent frames are zero. That is, underrun frames in c1 are zero + // or serviced frames in c2 are zero. + if (c.rate == aRate && + (c.servicedFrames == c.totalFrames || + aServiced == 0)) { + c.servicedFrames += aServiced; + c.totalFrames += aServiced + aUnderrun; + return; + } + } + Chunk* p = mChunks.AppendElement(); + p->servicedFrames = aServiced; + p->totalFrames = aServiced + aUnderrun; + p->rate = aRate; + } + + /** + * @param frames The playback position in frames of the audio engine. + * @return The playback position in microseconds of the audio engine, + * adjusted by playback rate changes and underrun frames. + */ + int64_t GetPosition(int64_t frames) { + // playback position should not go backward. + MOZ_ASSERT(frames >= mBaseOffset); + while (true) { + if (mChunks.IsEmpty()) { + return mBasePosition; + } + const Chunk& c = mChunks[0]; + if (frames <= mBaseOffset + c.totalFrames) { + uint32_t delta = frames - mBaseOffset; + delta = std::min(delta, c.servicedFrames); + return static_cast(mBasePosition) + + FramesToUs(delta, c.rate); + } + // Since the playback position of the audio engine will not go backward, + // we are able to compress chunks so that |mChunks| won't grow unlimitedly. + // Note that we lose precision in converting integers into floats and + // inaccuracy will accumulate over time. However, for a 24hr long, + // sample rate = 44.1k file, the error will be less than 1 microsecond + // after playing 24 hours. So we are fine with that. + mBaseOffset += c.totalFrames; + mBasePosition += FramesToUs(c.servicedFrames, c.rate); + mChunks.RemoveElementAt(0); + } + } +private: + nsAutoTArray mChunks; + int64_t mBaseOffset; + double mBasePosition; +}; + /*static*/ void AudioStream::PrefChanged(const char* aPref, void* aClosure) { if (strcmp(aPref, PREF_VOLUME_SCALE) == 0) { @@ -163,10 +245,6 @@ AudioStream::AudioStream() , mAudioClock(MOZ_THIS_IN_INITIALIZER_LIST()) , mLatencyRequest(HighLatency) , mReadPoint(0) - , mWrittenFramesPast(0) - , mLostFramesPast(0) - , mWrittenFramesLast(0) - , mLostFramesLast(0) , mDumpFile(nullptr) , mVolume(1.0) , mBytesPerFrame(0) @@ -663,6 +741,14 @@ AudioStream::SetVolume(double aVolume) mVolume = aVolume; } +void +AudioStream::Cancel() +{ + MonitorAutoLock mon(mMonitor); + mState = ERRORED; + mon.NotifyAll(); +} + void AudioStream::Drain() { @@ -773,19 +859,13 @@ AudioStream::GetPosition() int64_t AudioStream::GetPositionInFrames() { + MonitorAutoLock mon(mMonitor); return mAudioClock.GetPositionInFrames(); } #ifdef _MSC_VER #pragma optimize("", on) #endif -int64_t -AudioStream::GetPositionInFramesInternal() -{ - MonitorAutoLock mon(mMonitor); - return GetPositionInFramesUnlocked(); -} - int64_t AudioStream::GetPositionInFramesUnlocked() { @@ -803,32 +883,7 @@ AudioStream::GetPositionInFramesUnlocked() } } - // Adjust the reported position by the number of silent frames written - // during stream underruns. - // Since frames sent to DataCallback is not consumed by the backend immediately, - // it will be an over adjustment if we return |position - mLostFramesPast - mLostFramesLast|. - // On the other hand, we need to keep the whole history of frames sent to DataCallback - // in order to adjust position correctly which will require more storage. - // We choose a simple way to store the history where |mWrittenFramesPast| and - // |mLostFramesPast| are the sum of frames from 1th to |N-1|th callbacks, and - // |mWrittenFramesLast| and |mLostFramesLast| represent the frames sent in last callback. - // When |position| lies in - // [mWrittenFramesPast+mLostFramesPast, mWrittenFramesPast+mLostFramesPast+mWrittenFramesLast+mLostFramesLast], - // we will be able to adjust position precisely which should be the major case. - // If |position| falls in [0, mWrittenFramesPast+mLostFramesPast), there will be an - // error in the adjustment. However that is fine as long as we can ensure the - // adjusted position is mono-increasing to avoid audio clock going backward. - uint64_t adjustedPosition = 0; - if (position <= mWrittenFramesPast) { - adjustedPosition = position; - } else if (position <= mWrittenFramesPast + mLostFramesPast) { - adjustedPosition = mWrittenFramesPast; - } else if (position <= mWrittenFramesPast + mLostFramesPast + mWrittenFramesLast) { - adjustedPosition = position - mLostFramesPast; - } else { - adjustedPosition = mWrittenFramesPast + mWrittenFramesLast; - } - return std::min(adjustedPosition, INT64_MAX); + return std::min(position, INT64_MAX); } int64_t @@ -933,7 +988,7 @@ AudioStream::GetTimeStretched(void* aBuffer, long aFrames, int64_t &aTimeMs) uint8_t* wpos = reinterpret_cast(aBuffer); double playbackRate = static_cast(mInRate) / mOutRate; - uint32_t toPopBytes = FramesToBytes(ceil(aFrames / playbackRate)); + uint32_t toPopBytes = FramesToBytes(ceil(aFrames * playbackRate)); uint32_t available = 0; bool lowOnBufferedData = false; do { @@ -973,9 +1028,6 @@ AudioStream::DataCallback(void* aBuffer, long aFrames) uint32_t servicedFrames = 0; int64_t insertTime; - mWrittenFramesPast += mWrittenFramesLast; - mLostFramesPast += mLostFramesLast; - // NOTE: wasapi (others?) can call us back *after* stop()/Shutdown() (mState == SHUTDOWN) // Bug 996162 @@ -1039,10 +1091,11 @@ AudioStream::DataCallback(void* aBuffer, long aFrames) } underrunFrames = aFrames - servicedFrames; - mWrittenFramesLast = servicedFrames; - mLostFramesLast = underrunFrames; + // Always send audible frames first, and silent frames later. + // Otherwise it will break the assumption of FrameHistory. if (mState != DRAINING) { + mAudioClock.UpdateFrameHistory(servicedFrames, underrunFrames); uint8_t* rpos = static_cast(aBuffer) + FramesToBytes(aFrames - underrunFrames); memset(rpos, 0, FramesToBytes(underrunFrames)); if (underrunFrames) { @@ -1050,6 +1103,8 @@ AudioStream::DataCallback(void* aBuffer, long aFrames) ("AudioStream %p lost %d frames", this, underrunFrames)); } servicedFrames += underrunFrames; + } else { + mAudioClock.UpdateFrameHistory(servicedFrames, 0); } WriteDumpFile(mDumpFile, this, aFrames, aBuffer); @@ -1069,7 +1124,6 @@ AudioStream::DataCallback(void* aBuffer, long aFrames) (latency * 1000) / mOutRate, now); } - mAudioClock.UpdateWritePosition(servicedFrames); return servicedFrames; } @@ -1088,94 +1142,42 @@ AudioStream::StateCallback(cubeb_state aState) AudioClock::AudioClock(AudioStream* aStream) :mAudioStream(aStream), - mOldOutRate(0), - mBasePosition(0), - mBaseOffset(0), - mOldBaseOffset(0), - mOldBasePosition(0), - mPlaybackRateChangeOffset(0), - mPreviousPosition(0), - mWritten(0), mOutRate(0), mInRate(0), mPreservesPitch(true), - mCompensatingLatency(false) + mFrameHistory(new FrameHistory()) {} void AudioClock::Init() { mOutRate = mAudioStream->GetRate(); mInRate = mAudioStream->GetRate(); - mOldOutRate = mOutRate; } -void AudioClock::UpdateWritePosition(uint32_t aCount) +void AudioClock::UpdateFrameHistory(uint32_t aServiced, uint32_t aUnderrun) { - mWritten += aCount; + mFrameHistory->Append(aServiced, aUnderrun, mOutRate); } -uint64_t AudioClock::GetPositionUnlocked() +int64_t AudioClock::GetPositionUnlocked() const { // GetPositionInFramesUnlocked() asserts it owns the monitor - int64_t position = mAudioStream->GetPositionInFramesUnlocked(); - int64_t diffOffset; - NS_ASSERTION(position < 0 || (mInRate != 0 && mOutRate != 0), "AudioClock not initialized."); - if (position >= 0) { - if (position < mPlaybackRateChangeOffset) { - // See if we are still playing frames pushed with the old playback rate in - // the backend. If we are, use the old output rate to compute the - // position. - mCompensatingLatency = true; - diffOffset = position - mOldBaseOffset; - position = static_cast(mOldBasePosition + - static_cast(USECS_PER_S * diffOffset) / mOldOutRate); - mPreviousPosition = position; - return position; - } - - if (mCompensatingLatency) { - diffOffset = position - mPlaybackRateChangeOffset; - mCompensatingLatency = false; - mBasePosition = mPreviousPosition; - } else { - diffOffset = position - mPlaybackRateChangeOffset; - } - position = static_cast(mBasePosition + - (static_cast(USECS_PER_S * diffOffset) / mOutRate)); - return position; - } - return UINT64_MAX; + int64_t frames = mAudioStream->GetPositionInFramesUnlocked(); + NS_ASSERTION(frames < 0 || (mInRate != 0 && mOutRate != 0), "AudioClock not initialized."); + return frames >= 0 ? mFrameHistory->GetPosition(frames) : -1; } -uint64_t AudioClock::GetPositionInFrames() +int64_t AudioClock::GetPositionInFrames() const { - return (GetPositionUnlocked() * mOutRate) / USECS_PER_S; + return (GetPositionUnlocked() * mInRate) / USECS_PER_S; } void AudioClock::SetPlaybackRateUnlocked(double aPlaybackRate) { - // GetPositionInFramesUnlocked() asserts it owns the monitor - int64_t position = mAudioStream->GetPositionInFramesUnlocked(); - if (position > mPlaybackRateChangeOffset) { - mOldBasePosition = mBasePosition; - mBasePosition = GetPositionUnlocked(); - mOldBaseOffset = mPlaybackRateChangeOffset; - mBaseOffset = position; - mPlaybackRateChangeOffset = mWritten; - mOldOutRate = mOutRate; - mOutRate = static_cast(mInRate / aPlaybackRate); - } else { - // The playbackRate has been changed before the end of the latency - // compensation phase. We don't update the mOld* variable. That way, the - // last playbackRate set is taken into account. - mBasePosition = GetPositionUnlocked(); - mBaseOffset = position; - mPlaybackRateChangeOffset = mWritten; - mOutRate = static_cast(mInRate / aPlaybackRate); - } + mOutRate = static_cast(mInRate / aPlaybackRate); } -double AudioClock::GetPlaybackRate() +double AudioClock::GetPlaybackRate() const { return static_cast(mInRate) / mOutRate; } @@ -1185,7 +1187,7 @@ void AudioClock::SetPreservesPitch(bool aPreservesPitch) mPreservesPitch = aPreservesPitch; } -bool AudioClock::GetPreservesPitch() +bool AudioClock::GetPreservesPitch() const { return mPreservesPitch; } diff --git a/content/media/AudioStream.h b/content/media/AudioStream.h index cf79b0626d62..6c155a67cb7b 100644 --- a/content/media/AudioStream.h +++ b/content/media/AudioStream.h @@ -32,6 +32,7 @@ class SoundTouch; namespace mozilla { class AudioStream; +class FrameHistory; class AudioClock { @@ -42,15 +43,15 @@ public: void Init(); // Update the number of samples that has been written in the audio backend. // Called on the state machine thread. - void UpdateWritePosition(uint32_t aCount); + void UpdateFrameHistory(uint32_t aServiced, uint32_t aUnderrun); // Get the read position of the stream, in microseconds. // Called on the state machine thead. // Assumes the AudioStream lock is held and thus calls Unlocked versions // of AudioStream funcs. - uint64_t GetPositionUnlocked(); + int64_t GetPositionUnlocked() const; // Get the read position of the stream, in frames. // Called on the state machine thead. - uint64_t GetPositionInFrames(); + int64_t GetPositionInFrames() const; // Set the playback rate. // Called on the audio thread. // Assumes the AudioStream lock is held and thus calls Unlocked versions @@ -58,46 +59,25 @@ public: void SetPlaybackRateUnlocked(double aPlaybackRate); // Get the current playback rate. // Called on the audio thread. - double GetPlaybackRate(); + double GetPlaybackRate() const; // Set if we are preserving the pitch. // Called on the audio thread. void SetPreservesPitch(bool aPreservesPitch); // Get the current pitch preservation state. // Called on the audio thread. - bool GetPreservesPitch(); + bool GetPreservesPitch() const; private: // This AudioStream holds a strong reference to this AudioClock. This // pointer is garanteed to always be valid. - AudioStream* mAudioStream; - // The old output rate, to compensate audio latency for the period inbetween - // the moment resampled buffers are pushed to the hardware and the moment the - // clock should take the new rate into account for A/V sync. - int mOldOutRate; - // Position at which the last playback rate change occured - int64_t mBasePosition; - // Offset, in frames, at which the last playback rate change occured - int64_t mBaseOffset; - // Old base offset (number of samples), used when changing rate to compute the - // position in the stream. - int64_t mOldBaseOffset; - // Old base position (number of microseconds), when changing rate. This is the - // time in the media, not wall clock position. - int64_t mOldBasePosition; - // Write position at which the playbackRate change occured. - int64_t mPlaybackRateChangeOffset; - // The previous position reached in the media, used when compensating - // latency, to have the position at which the playbackRate change occured. - int64_t mPreviousPosition; - // Number of samples effectivelly written in backend, i.e. write position. - int64_t mWritten; + AudioStream* const mAudioStream; // Output rate in Hz (characteristic of the playback rate) int mOutRate; // Input rate in Hz (characteristic of the media being played) int mInRate; // True if the we are timestretching, false if we are resampling. bool mPreservesPitch; - // True if we are playing at the old playbackRate after it has been changed. - bool mCompensatingLatency; + // The history of frames sent to the audio engine in each Datacallback. + const nsAutoPtr mFrameHistory; }; class CircularByteBuffer @@ -249,6 +229,9 @@ public: // Block until buffered audio data has been consumed. void Drain(); + // Break any blocking operation and set the stream to shutdown. + void Cancel(); + // Start the stream. void Start(); @@ -270,11 +253,6 @@ public: // was opened, of the audio hardware. Thread-safe. int64_t GetPositionInFrames(); - // Return the position, measured in audio framed played since the stream was - // opened, of the audio hardware, not adjusted for the changes of playback - // rate. - int64_t GetPositionInFramesInternal(); - // Returns true when the audio stream is paused. bool IsPaused(); @@ -293,7 +271,9 @@ public: protected: friend class AudioClock; - // Shared implementation of underflow adjusted position calculation. + // Return the position, measured in audio frames played since the stream was + // opened, of the audio hardware, not adjusted for the changes of playback + // rate or underrun frames. // Caller must own the monitor. int64_t GetPositionInFramesUnlocked(); @@ -372,15 +352,6 @@ private: }; nsAutoTArray mInserts; - // Suppose we have received DataCallback for N times, |mWrittenFramesPast| - // and |mLostFramesPast| are the sum of frames written to the backend from - // 1st to |N-1|th DataCallbacks. - uint64_t mWrittenFramesPast; // non-silent frames - uint64_t mLostFramesPast; // silent frames - // Frames written to the backend in Nth DataCallback. - uint64_t mWrittenFramesLast; // non-silent frames - uint64_t mLostFramesLast; // silent frames - // Output file for dumping audio FILE* mDumpFile; diff --git a/content/media/MediaDecoderStateMachine.cpp b/content/media/MediaDecoderStateMachine.cpp index e56c7a742302..e4df2d859543 100644 --- a/content/media/MediaDecoderStateMachine.cpp +++ b/content/media/MediaDecoderStateMachine.cpp @@ -13,7 +13,7 @@ #include #include "MediaDecoderStateMachine.h" -#include "AudioStream.h" +#include "AudioSink.h" #include "nsTArray.h" #include "MediaDecoder.h" #include "MediaDecoderReader.h" @@ -100,13 +100,6 @@ const int64_t AMPLE_AUDIO_USECS = 1000000; // as otherwise a long video decode could cause an audio underrun. const int64_t NO_VIDEO_AMPLE_AUDIO_DIVISOR = 8; -// Maximum number of bytes we'll allocate and write at once to the audio -// hardware when the audio stream contains missing frames and we're -// writing silence in order to fill the gap. We limit our silence-writes -// to 32KB in order to avoid allocating an impossibly large chunk of -// memory if we encounter a large chunk of silence. -const uint32_t SILENCE_BYTES_CHUNK = 32 * 1024; - // If we have fewer than LOW_VIDEO_FRAMES decoded frames, and // we're not "prerolling video", we'll skip the video up to the next keyframe // which is at or after the current playback position. @@ -157,9 +150,6 @@ static const uint32_t QUICK_BUFFERING_LOW_DATA_USECS = 1000000; static_assert(QUICK_BUFFERING_LOW_DATA_USECS <= AMPLE_AUDIO_USECS, "QUICK_BUFFERING_LOW_DATA_USECS is too large"); -// This value has been chosen empirically. -static const uint32_t AUDIOSTREAM_MIN_WRITE_BEFORE_START_USECS = 200000; - // The amount of instability we tollerate in calls to // MediaDecoderStateMachine::UpdateEstimatedDuration(); changes of duration // less than this are ignored, as they're assumed to be the result of @@ -182,7 +172,6 @@ MediaDecoderStateMachine::MediaDecoderStateMachine(MediaDecoder* aDecoder, mInRunningStateMachine(false), mSyncPointInMediaStream(-1), mSyncPointInDecodedStream(-1), - mResetPlayStartTime(false), mPlayDuration(0), mStartTime(-1), mEndTime(-1), @@ -195,7 +184,6 @@ MediaDecoderStateMachine::MediaDecoderStateMachine(MediaDecoder* aDecoder, mVolume(1.0), mPlaybackRate(1.0), mPreservesPitch(true), - mBasePosition(0), mAmpleVideoFrames(2), mLowAudioThresholdUsecs(LOW_AUDIO_USECS), mAmpleAudioThresholdUsecs(AMPLE_AUDIO_USECS), @@ -306,7 +294,7 @@ void MediaDecoderStateMachine::SendStreamAudio(AudioData* aAudio, aStream->mLastAudioPacketTime = aAudio->mTime; aStream->mLastAudioPacketEndTime = aAudio->GetEndTime(); - // This logic has to mimic AudioLoop closely to make sure we write + // This logic has to mimic AudioSink closely to make sure we write // the exact same silences CheckedInt64 audioWrittenOffset = UsecsToFrames(mInfo.mAudio.mRate, aStream->mInitialTime + mStartTime) + aStream->mAudioFramesWritten; @@ -376,11 +364,10 @@ void MediaDecoderStateMachine::SendStreamData() if (mState == DECODER_STATE_DECODING_METADATA) return; - // If there's still an audio thread alive, then we can't send any stream - // data yet since both SendStreamData and the audio thread want to be in - // charge of popping the audio queue. We're waiting for the audio thread - // to die before sending anything to our stream. - if (mAudioThread) + // If there's still an audio sink alive, then we can't send any stream + // data yet since both SendStreamData and the audio sink want to be in + // charge of popping the audio queue. We're waiting for the audio sink + if (mAudioSink) return; int64_t minLastAudioPacketTime = INT64_MAX; @@ -494,7 +481,7 @@ void MediaDecoderStateMachine::SendStreamData() // badly muxed resources. if (!a || a->GetEndTime() >= minLastAudioPacketTime) break; - mAudioEndTime = std::max(mAudioEndTime, a->GetEndTime()); + OnAudioEndTimeUpdate(std::max(mAudioEndTime, a->GetEndTime())); delete AudioQueue().PopFront(); } @@ -564,8 +551,6 @@ bool MediaDecoderStateMachine::NeedToDecodeVideo() { AssertCurrentThreadInMonitor(); - NS_ASSERTION(OnStateMachineThread() || OnDecodeThread(), - "Should be on state machine or decode thread."); return IsVideoDecoding() && ((mState == DECODER_STATE_SEEKING && mDecodeToSeekTarget) || (!mMinimizePreroll && !HaveEnoughDecodedVideo())); @@ -634,8 +619,6 @@ bool MediaDecoderStateMachine::NeedToDecodeAudio() { AssertCurrentThreadInMonitor(); - NS_ASSERTION(OnStateMachineThread() || OnDecodeThread(), - "Should be on state machine or decode thread."); return IsAudioDecoding() && ((mState == DECODER_STATE_SEEKING && mDecodeToSeekTarget) || (!mMinimizePreroll && @@ -1073,287 +1056,6 @@ bool MediaDecoderStateMachine::IsPlaying() return !mPlayStartTime.IsNull(); } -// If we have already written enough frames to the AudioStream, start the -// playback. -static void -StartAudioStreamPlaybackIfNeeded(AudioStream* aStream) -{ - // We want to have enough data in the buffer to start the stream. - if (static_cast(aStream->GetWritten()) / aStream->GetRate() >= - static_cast(AUDIOSTREAM_MIN_WRITE_BEFORE_START_USECS) / USECS_PER_S) { - aStream->Start(); - } -} - -static void WriteSilence(AudioStream* aStream, uint32_t aFrames) -{ - uint32_t numSamples = aFrames * aStream->GetChannels(); - nsAutoTArray buf; - buf.SetLength(numSamples); - memset(buf.Elements(), 0, numSamples * sizeof(AudioDataValue)); - aStream->Write(buf.Elements(), aFrames); - - StartAudioStreamPlaybackIfNeeded(aStream); -} - -void MediaDecoderStateMachine::AudioLoop() -{ - NS_ASSERTION(OnAudioThread(), "Should be on audio thread."); - DECODER_LOG(PR_LOG_DEBUG, "Begun audio thread/loop"); - int64_t audioDuration = 0; - int64_t audioStartTime = -1; - uint32_t channels, rate; - double volume = -1; - bool setVolume; - double playbackRate = -1; - bool setPlaybackRate; - bool preservesPitch; - bool setPreservesPitch; - AudioChannel audioChannel; - - { - ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); - mAudioCompleted = false; - audioStartTime = mAudioStartTime; - NS_ASSERTION(audioStartTime != -1, "Should have audio start time by now"); - channels = mInfo.mAudio.mChannels; - rate = mInfo.mAudio.mRate; - - audioChannel = mDecoder->GetAudioChannel(); - volume = mVolume; - preservesPitch = mPreservesPitch; - playbackRate = mPlaybackRate; - } - - { - // AudioStream initialization can block for extended periods in unusual - // circumstances, so we take care to drop the decoder monitor while - // initializing. - RefPtr audioStream(new AudioStream()); - audioStream->Init(channels, rate, audioChannel, AudioStream::HighLatency); - audioStream->SetVolume(volume); - if (audioStream->SetPreservesPitch(preservesPitch) != NS_OK) { - NS_WARNING("Setting the pitch preservation failed at AudioLoop start."); - } - if (playbackRate != 1.0) { - NS_ASSERTION(playbackRate != 0, - "Don't set the playbackRate to 0 on an AudioStream."); - if (audioStream->SetPlaybackRate(playbackRate) != NS_OK) { - NS_WARNING("Setting the playback rate failed at AudioLoop start."); - } - } - - { - ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); - mAudioStream = audioStream.forget(); - } - } - - while (1) { - // Wait while we're not playing, and we're not shutting down, or we're - // playing and we've got no audio to play. - { - ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); - NS_ASSERTION(mState != DECODER_STATE_DECODING_METADATA, - "Should have meta data before audio started playing."); - while (mState != DECODER_STATE_SHUTDOWN && - !mStopAudioThread && - (!IsPlaying() || - mState == DECODER_STATE_BUFFERING || - (AudioQueue().GetSize() == 0 && - !AudioQueue().AtEndOfStream()))) - { - if (!IsPlaying() && !mAudioStream->IsPaused()) { - mAudioStream->Pause(); - } - mon.Wait(); - } - - // If we're shutting down, break out and exit the audio thread. - // Also break out if audio is being captured. - if (mState == DECODER_STATE_SHUTDOWN || - mStopAudioThread || - AudioQueue().AtEndOfStream()) - { - break; - } - - // We only want to go to the expense of changing the volume if - // the volume has changed. - setVolume = volume != mVolume; - volume = mVolume; - - // Same for the playbackRate. - setPlaybackRate = playbackRate != mPlaybackRate; - playbackRate = mPlaybackRate; - - // Same for the pitch preservation. - setPreservesPitch = preservesPitch != mPreservesPitch; - preservesPitch = mPreservesPitch; - - if (IsPlaying() && mAudioStream->IsPaused()) { - mAudioStream->Resume(); - } - } - - if (setVolume) { - mAudioStream->SetVolume(volume); - } - if (setPlaybackRate) { - NS_ASSERTION(playbackRate != 0, - "Don't set the playbackRate to 0 in the AudioStreams"); - if (mAudioStream->SetPlaybackRate(playbackRate) != NS_OK) { - NS_WARNING("Setting the playback rate failed in AudioLoop."); - } - } - if (setPreservesPitch) { - if (mAudioStream->SetPreservesPitch(preservesPitch) != NS_OK) { - NS_WARNING("Setting the pitch preservation failed in AudioLoop."); - } - } - NS_ASSERTION(AudioQueue().GetSize() > 0, - "Should have data to play"); - // See if there's a gap in the audio. If there is, push silence into the - // audio hardware, so we can play across the gap. - const AudioData* s = AudioQueue().PeekFront(); - - // Calculate the number of frames that have been pushed onto the audio - // hardware. - CheckedInt64 playedFrames = UsecsToFrames(audioStartTime, rate) + - audioDuration; - // Calculate the timestamp of the next chunk of audio in numbers of - // samples. - CheckedInt64 sampleTime = UsecsToFrames(s->mTime, rate); - CheckedInt64 missingFrames = sampleTime - playedFrames; - if (!missingFrames.isValid() || !sampleTime.isValid()) { - NS_WARNING("Int overflow adding in AudioLoop()"); - break; - } - - int64_t framesWritten = 0; - if (missingFrames.value() > 0) { - // The next audio chunk begins some time after the end of the last chunk - // we pushed to the audio hardware. We must push silence into the audio - // hardware so that the next audio chunk begins playback at the correct - // time. - missingFrames = std::min(UINT32_MAX, missingFrames.value()); - VERBOSE_LOG("playing %d frames of silence", int32_t(missingFrames.value())); - framesWritten = PlaySilence(static_cast(missingFrames.value()), - channels, playedFrames.value()); - } else { - framesWritten = PlayFromAudioQueue(sampleTime.value(), channels); - } - audioDuration += framesWritten; - { - ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); - CheckedInt64 playedUsecs = FramesToUsecs(audioDuration, rate) + audioStartTime; - if (!playedUsecs.isValid()) { - NS_WARNING("Int overflow calculating audio end time"); - break; - } - mAudioEndTime = playedUsecs.value(); - } - } - { - ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); - if (AudioQueue().AtEndOfStream() && - mState != DECODER_STATE_SHUTDOWN && - !mStopAudioThread) - { - // If the media was too short to trigger the start of the audio stream, - // start it now. - mAudioStream->Start(); - // Last frame pushed to audio hardware, wait for the audio to finish, - // before the audio thread terminates. - bool seeking = false; - { - int64_t oldPosition = -1; - int64_t position = GetMediaTime(); - while (oldPosition != position && - mAudioEndTime - position > 0 && - mState != DECODER_STATE_SEEKING && - mState != DECODER_STATE_SHUTDOWN) - { - const int64_t DRAIN_BLOCK_USECS = 100000; - Wait(std::min(mAudioEndTime - position, DRAIN_BLOCK_USECS)); - oldPosition = position; - position = GetMediaTime(); - } - seeking = mState == DECODER_STATE_SEEKING; - } - - if (!seeking && !mAudioStream->IsPaused()) { - { - ReentrantMonitorAutoExit exit(mDecoder->GetReentrantMonitor()); - mAudioStream->Drain(); - } - } - } - } - DECODER_LOG(PR_LOG_DEBUG, "Reached audio stream end."); - { - // Must hold lock while shutting down and anulling the audio stream to prevent - // state machine thread trying to use it while we're destroying it. - ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); - mAudioStream->Shutdown(); - mAudioStream = nullptr; - if (!mAudioCaptured) { - mAudioCompleted = true; - UpdateReadyState(); - // Kick the decode thread; it may be sleeping waiting for this to finish. - mDecoder->GetReentrantMonitor().NotifyAll(); - } - } - - DECODER_LOG(PR_LOG_DEBUG, "Audio stream finished playing, audio thread exit"); -} - -uint32_t MediaDecoderStateMachine::PlaySilence(uint32_t aFrames, - uint32_t aChannels, - uint64_t aFrameOffset) - -{ - NS_ASSERTION(OnAudioThread(), "Only call on audio thread."); - NS_ASSERTION(!mAudioStream->IsPaused(), "Don't play when paused"); - uint32_t maxFrames = SILENCE_BYTES_CHUNK / aChannels / sizeof(AudioDataValue); - uint32_t frames = std::min(aFrames, maxFrames); - WriteSilence(mAudioStream, frames); - return frames; -} - -uint32_t MediaDecoderStateMachine::PlayFromAudioQueue(uint64_t aFrameOffset, - uint32_t aChannels) -{ - NS_ASSERTION(OnAudioThread(), "Only call on audio thread."); - NS_ASSERTION(!mAudioStream->IsPaused(), "Don't play when paused"); - nsAutoPtr audio(AudioQueue().PopFront()); - { - ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); - NS_WARN_IF_FALSE(IsPlaying(), "Should be playing"); - // Awaken the decode loop if it's waiting for space to free up in the - // audio queue. - mDecoder->GetReentrantMonitor().NotifyAll(); - } - int64_t offset = -1; - uint32_t frames = 0; - VERBOSE_LOG("playing %d frames of data to stream for AudioData at %lld", - audio->mFrames, audio->mTime); - mAudioStream->Write(audio->mAudioData, - audio->mFrames); - - aChannels = mAudioStream->GetOutChannels(); - - StartAudioStreamPlaybackIfNeeded(mAudioStream); - - offset = audio->mOffset; - frames = audio->mFrames; - - if (offset != -1) { - mDecoder->UpdatePlaybackOffset(offset); - } - return frames; -} - nsresult MediaDecoderStateMachine::Init(MediaDecoderStateMachine* aCloneDonor) { MOZ_ASSERT(NS_IsMainThread()); @@ -1403,10 +1105,10 @@ void MediaDecoderStateMachine::StopPlayback() mDecoder->NotifyPlaybackStopped(); if (IsPlaying()) { - mPlayDuration = GetClock(); - mPlayStartTime = TimeStamp(); + mPlayDuration = GetClock() - mStartTime; + SetPlayStartTime(TimeStamp()); } - // Notify the audio thread, so that it notices that we've stopped playing, + // Notify the audio sink, so that it notices that we've stopped playing, // so it can pause audio playback. mDecoder->GetReentrantMonitor().NotifyAll(); NS_ASSERTION(!IsPlaying(), "Should report not playing at end of StopPlayback()"); @@ -1445,7 +1147,7 @@ void MediaDecoderStateMachine::StartPlayback() AssertCurrentThreadInMonitor(); mDecoder->NotifyPlaybackStarted(); - mPlayStartTime = TimeStamp::Now(); + SetPlayStartTime(TimeStamp::Now()); NS_ASSERTION(IsPlaying(), "Should report playing by end of StartPlayback()"); if (NS_FAILED(StartAudioThread())) { @@ -1519,6 +1221,9 @@ void MediaDecoderStateMachine::SetVolume(double volume) NS_ASSERTION(NS_IsMainThread(), "Should be on main thread."); ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); mVolume = volume; + if (mAudioSink) { + mAudioSink->SetVolume(mVolume); + } } void MediaDecoderStateMachine::SetAudioCaptured(bool aCaptured) @@ -1527,8 +1232,8 @@ void MediaDecoderStateMachine::SetAudioCaptured(bool aCaptured) ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); if (!mAudioCaptured && aCaptured && !mStopAudioThread) { // Make sure the state machine runs as soon as possible. That will - // stop the audio thread. - // If mStopAudioThread is true then we're already stopping the audio thread + // stop the audio sink. + // If mStopAudioThread is true then we're already stopping the audio sink // and since we set mAudioCaptured to true, nothing can start it again. ScheduleStateMachine(); } @@ -1639,6 +1344,9 @@ void MediaDecoderStateMachine::Shutdown() DECODER_LOG(PR_LOG_DEBUG, "Changed state to SHUTDOWN"); ScheduleStateMachine(); mState = DECODER_STATE_SHUTDOWN; + if (mAudioSink) { + mAudioSink->PrepareToShutdown(); + } mDecoder->GetReentrantMonitor().NotifyAll(); } @@ -1798,14 +1506,15 @@ void MediaDecoderStateMachine::StopAudioThread() mStopAudioThread = true; mDecoder->GetReentrantMonitor().NotifyAll(); - if (mAudioThread) { + if (mAudioSink) { DECODER_LOG(PR_LOG_DEBUG, "Shutdown audio thread"); + mAudioSink->PrepareToShutdown(); { ReentrantMonitorAutoExit exitMon(mDecoder->GetReentrantMonitor()); - mAudioThread->Shutdown(); + mAudioSink->Shutdown(); } - mAudioThread = nullptr; - // Now that the audio thread is dead, try sending data to our MediaStream(s). + mAudioSink = nullptr; + // Now that the audio sink is dead, try sending data to our MediaStream(s). // That may have been waiting for the audio thread to stop. SendStreamData(); } @@ -2036,20 +1745,20 @@ MediaDecoderStateMachine::StartAudioThread() } mStopAudioThread = false; - if (HasAudio() && !mAudioThread) { - nsresult rv = NS_NewNamedThread("Media Audio", - getter_AddRefs(mAudioThread), - nullptr, - MEDIA_THREAD_STACK_SIZE); + if (HasAudio() && !mAudioSink) { + mAudioCompleted = false; + mAudioSink = new AudioSink(this, + mAudioStartTime, mInfo.mAudio, mDecoder->GetAudioChannel()); + nsresult rv = mAudioSink->Init(); if (NS_FAILED(rv)) { - DECODER_LOG(PR_LOG_WARNING, "Changed state to SHUTDOWN because failed to create audio thread"); + DECODER_LOG(PR_LOG_WARNING, "Changed state to SHUTDOWN because audio sink initialization failed"); mState = DECODER_STATE_SHUTDOWN; return rv; } - nsCOMPtr event = - NS_NewRunnableMethod(this, &MediaDecoderStateMachine::AudioLoop); - mAudioThread->Dispatch(event, NS_DISPATCH_NORMAL); + mAudioSink->SetVolume(mVolume); + mAudioSink->SetPlaybackRate(mPlaybackRate); + mAudioSink->SetPreservesPitch(mPreservesPitch); } return NS_OK; } @@ -2333,12 +2042,6 @@ void MediaDecoderStateMachine::DecodeSeek() UpdatePlaybackPositionInternal(seekTime); } - // Update mBasePosition only after StopPlayback() which will call GetClock() - // which will call GetVideoStreamPosition() which will read mBasePosition. - // If we update mBasePosition too early in Seek(), |pos -= mBasePosition| - // will be wrong and assertion will fail in GetVideoStreamPosition(). - mBasePosition = seekTime - mStartTime; - // SeekingStarted will do a UpdateReadyStateForData which will // inform the element and its users that we have no frames // to display @@ -2364,7 +2067,7 @@ void MediaDecoderStateMachine::DecodeSeek() } else { // The seek target is different than the current playback position, // we'll need to seek the playback position, so shutdown our decode - // and audio threads. + // thread and audio sink. StopAudioThread(); ResetPlayback(); @@ -2569,11 +2272,11 @@ nsresult MediaDecoderStateMachine::RunStateMachine() mDecodeTaskQueue->Dispatch(task); StopAudioThread(); - // If mAudioThread is non-null after StopAudioThread completes, we are + // If mAudioSink is non-null after StopAudioThread completes, we are // running in a nested event loop waiting for Shutdown() on - // mAudioThread to complete. Return to the event loop and let it + // mAudioSink to complete. Return to the event loop and let it // finish processing before continuing with shutdown. - if (mAudioThread) { + if (mAudioSink) { MOZ_ASSERT(mStopAudioThread); return NS_OK; } @@ -2743,7 +2446,7 @@ nsresult MediaDecoderStateMachine::RunStateMachine() if (mDecoder->GetState() == MediaDecoder::PLAY_STATE_PLAYING && !mDecoder->GetDecodedStream()) { int64_t videoTime = HasVideo() ? mVideoFrameEndTime : 0; - int64_t clockTime = std::max(mEndTime, std::max(videoTime, GetAudioClock())); + int64_t clockTime = std::max(mEndTime, videoTime); UpdatePlaybackPosition(clockTime); { @@ -2788,16 +2491,16 @@ int64_t MediaDecoderStateMachine::GetAudioClock() { // We must hold the decoder monitor while using the audio stream off the - // audio thread to ensure that it doesn't get destroyed on the audio thread + // audio sink to ensure that it doesn't get destroyed on the audio sink // while we're using it. AssertCurrentThreadInMonitor(); if (!HasAudio() || mAudioCaptured) return -1; - if (!mAudioStream) { - // Audio thread hasn't played any data yet. + if (!mAudioSink) { + // Audio sink hasn't played any data yet. return mAudioStartTime; } - int64_t t = mAudioStream->GetPosition(); + int64_t t = mAudioSink->GetPosition(); return (t == -1) ? -1 : t + mAudioStartTime; } @@ -2809,16 +2512,11 @@ int64_t MediaDecoderStateMachine::GetVideoStreamPosition() return mPlayDuration + mStartTime; } - // The playbackRate has been just been changed, reset the playstartTime. - if (mResetPlayStartTime) { - mPlayStartTime = TimeStamp::Now(); - mResetPlayStartTime = false; - } - - int64_t pos = DurationToUsecs(TimeStamp::Now() - mPlayStartTime) + mPlayDuration; - pos -= mBasePosition; - NS_ASSERTION(pos >= 0, "Video stream position should be positive."); - return mBasePosition + pos * mPlaybackRate + mStartTime; + // Time elapsed since we started playing. + int64_t delta = DurationToUsecs(TimeStamp::Now() - mPlayStartTime); + // Take playback rate into account. + delta *= mPlaybackRate; + return mStartTime + mPlayDuration + delta; } int64_t MediaDecoderStateMachine::GetClock() @@ -2842,7 +2540,7 @@ int64_t MediaDecoderStateMachine::GetClock() // Resync against the audio clock, while we're trusting the // audio clock. This ensures no "drift", particularly on Linux. mPlayDuration = clock_time - mStartTime; - mPlayStartTime = TimeStamp::Now(); + SetPlayStartTime(TimeStamp::Now()); } else { // Audio is disabled on this system. Sync to the system clock. clock_time = GetVideoStreamPosition(); @@ -2895,7 +2593,7 @@ void MediaDecoderStateMachine::AdvanceFrame() // Notify the decode thread that the video queue's buffers may have // free'd up space for more frames. mDecoder->GetReentrantMonitor().NotifyAll(); - mDecoder->UpdatePlaybackOffset(frame->mOffset); + OnPlaybackOffsetUpdate(frame->mOffset); if (VideoQueue().GetSize() == 0) break; frame = VideoQueue().PeekFront(); @@ -2903,7 +2601,7 @@ void MediaDecoderStateMachine::AdvanceFrame() // Current frame has already been presented, wait until it's time to // present the next frame. if (frame && !currentFrame) { - int64_t now = IsPlaying() ? clock_time : mPlayDuration; + int64_t now = IsPlaying() ? clock_time : mStartTime + mPlayDuration; remainingTime = frame->mTime - now; } @@ -2987,25 +2685,6 @@ void MediaDecoderStateMachine::AdvanceFrame() ScheduleStateMachine(remainingTime); } -void MediaDecoderStateMachine::Wait(int64_t aUsecs) { - NS_ASSERTION(OnAudioThread(), "Only call on the audio thread"); - AssertCurrentThreadInMonitor(); - TimeStamp end = TimeStamp::Now() + UsecsToDuration(std::max(USECS_PER_MS, aUsecs)); - TimeStamp now; - while ((now = TimeStamp::Now()) < end && - mState != DECODER_STATE_SHUTDOWN && - mState != DECODER_STATE_SEEKING && - !mStopAudioThread && - IsPlaying()) - { - int64_t ms = static_cast(NS_round((end - now).ToSeconds() * 1000)); - if (ms == 0 || ms > UINT32_MAX) { - break; - } - mDecoder->GetReentrantMonitor().Wait(PR_MillisecondsToInterval(static_cast(ms))); - } -} - nsresult MediaDecoderStateMachine::DropVideoUpToSeekTarget(VideoData* aSample) { @@ -3217,12 +2896,26 @@ nsresult MediaDecoderStateMachine::GetBuffered(dom::TimeRanges* aBuffered) { return res; } +void MediaDecoderStateMachine::SetPlayStartTime(const TimeStamp& aTimeStamp) +{ + AssertCurrentThreadInMonitor(); + mPlayStartTime = aTimeStamp; + if (!mAudioSink) { + return; + } + if (!mPlayStartTime.IsNull()) { + mAudioSink->StartPlayback(); + } else { + mAudioSink->StopPlayback(); + } +} + nsresult MediaDecoderStateMachine::CallRunStateMachine() { AssertCurrentThreadInMonitor(); NS_ASSERTION(OnStateMachineThread(), "Should be on state machine thread."); - // If audio is being captured, stop the audio thread if it's running + // If audio is being captured, stop the audio sink if it's running if (mAudioCaptured) { StopAudioThread(); } @@ -3352,20 +3045,20 @@ void MediaDecoderStateMachine::SetPlaybackRate(double aPlaybackRate) return; } - // Get position of the last time we changed the rate. - if (!HasAudio()) { - // mBasePosition is a position in the video stream, not an absolute time. - if (mState == DECODER_STATE_SEEKING) { - mBasePosition = mCurrentSeekTarget.mTime - mStartTime; - } else { - mBasePosition = GetVideoStreamPosition(); - } - mPlayDuration = mBasePosition; - mResetPlayStartTime = true; - mPlayStartTime = TimeStamp::Now(); + // AudioStream will handle playback rate change when we have audio. + // Do nothing while we are not playing. Change in playback rate will + // take effect next time we start playing again. + if (!HasAudio() && IsPlaying()) { + // Remember how much time we've spent in playing the media + // for playback rate will change from now on. + mPlayDuration = GetVideoStreamPosition() - mStartTime; + SetPlayStartTime(TimeStamp::Now()); } mPlaybackRate = aPlaybackRate; + if (mAudioSink) { + mAudioSink->SetPlaybackRate(mPlaybackRate); + } } void MediaDecoderStateMachine::SetPreservesPitch(bool aPreservesPitch) @@ -3374,6 +3067,9 @@ void MediaDecoderStateMachine::SetPreservesPitch(bool aPreservesPitch) ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); mPreservesPitch = aPreservesPitch; + if (mAudioSink) { + mAudioSink->SetPreservesPitch(mPreservesPitch); + } } void @@ -3408,6 +3104,30 @@ void MediaDecoderStateMachine::QueueMetadata(int64_t aPublishTime, mMetadataManager.QueueMetadata(metadata); } +void MediaDecoderStateMachine::OnAudioEndTimeUpdate(int64_t aAudioEndTime) +{ + ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); + MOZ_ASSERT(aAudioEndTime >= mAudioEndTime); + mAudioEndTime = aAudioEndTime; +} + +void MediaDecoderStateMachine::OnPlaybackOffsetUpdate(int64_t aPlaybackOffset) +{ + mDecoder->UpdatePlaybackOffset(aPlaybackOffset); +} + +void MediaDecoderStateMachine::OnAudioSinkComplete() +{ + AssertCurrentThreadInMonitor(); + if (mAudioCaptured) { + return; + } + mAudioCompleted = true; + UpdateReadyState(); + // Kick the decode thread; it may be sleeping waiting for this to finish. + mDecoder->GetReentrantMonitor().NotifyAll(); +} + } // namespace mozilla // avoid redefined macro in unified build diff --git a/content/media/MediaDecoderStateMachine.h b/content/media/MediaDecoderStateMachine.h index a53f4637f380..80faf60b98c7 100644 --- a/content/media/MediaDecoderStateMachine.h +++ b/content/media/MediaDecoderStateMachine.h @@ -99,6 +99,7 @@ class AudioSegment; class VideoSegment; class MediaTaskQueue; class SharedThreadPool; +class AudioSink; // GetCurrentTime is defined in winbase.h as zero argument macro forwarding to // GetTickCount() and conflicts with MediaDecoderStateMachine::GetCurrentTime @@ -121,6 +122,7 @@ class SharedThreadPool; */ class MediaDecoderStateMachine { + friend class AudioSink; NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaDecoderStateMachine) public: typedef MediaDecoder::DecodedStreamData DecodedStreamData; @@ -185,9 +187,6 @@ public: // on the appropriate threads. bool OnDecodeThread() const; bool OnStateMachineThread() const; - bool OnAudioThread() const { - return IsCurrentThread(mAudioThread); - } MediaDecoderOwner::NextFrameStatus GetNextFrameStatus(); @@ -440,16 +439,6 @@ protected: // Returns true if we recently exited "quick buffering" mode. bool JustExitedQuickBuffering(); - // Waits on the decoder ReentrantMonitor for aUsecs microseconds. If the decoder - // monitor is awoken by a Notify() call, we'll continue waiting, unless - // we've moved into shutdown state. This enables us to ensure that we - // wait for a specified time, and that the myriad of Notify()s we do on - // the decoder monitor don't cause the audio thread to be starved. aUsecs - // values of less than 1 millisecond are rounded up to 1 millisecond - // (see bug 651023). The decoder monitor must be held. Called only on the - // audio thread. - void Wait(int64_t aUsecs); - // Dispatches an asynchronous event to update the media element's ready state. void UpdateReadyState(); @@ -492,21 +481,6 @@ protected: // state machine thread. void AdvanceFrame(); - // Write aFrames of audio frames of silence to the audio hardware. Returns - // the number of frames actually written. The write size is capped at - // SILENCE_BYTES_CHUNK (32kB), so must be called in a loop to write the - // desired number of frames. This ensures that the playback position - // advances smoothly, and guarantees that we don't try to allocate an - // impossibly large chunk of memory in order to play back silence. Called - // on the audio thread. - uint32_t PlaySilence(uint32_t aFrames, - uint32_t aChannels, - uint64_t aFrameOffset); - - // Pops an audio chunk from the front of the audio queue, and pushes its - // audio data to the audio hardware. - uint32_t PlayFromAudioQueue(uint64_t aFrameOffset, uint32_t aChannels); - // Stops the audio thread. The decoder monitor must be held with exactly // one lock count. Called on the state machine thread. void StopAudioThread(); @@ -515,11 +489,6 @@ protected: // one lock count. Called on the state machine thread. nsresult StartAudioThread(); - // The main loop for the audio thread. Sent to the thread as - // an nsRunnableMethod. This continually does blocking writes to - // to audio stream to play audio data. - void AudioLoop(); - // Sets internal state which causes playback of media to pause. // The decoder monitor must be held. void StopPlayback(); @@ -651,6 +620,20 @@ protected: bool IsAudioDecoding(); bool IsVideoDecoding(); + // Set the time that playback started from the system clock. + // Can only be called on the state machine thread. + void SetPlayStartTime(const TimeStamp& aTimeStamp); + + // Update mAudioEndTime. + void OnAudioEndTimeUpdate(int64_t aAudioEndTime); + + // Update mDecoder's playback offset. + void OnPlaybackOffsetUpdate(int64_t aPlaybackOffset); + + // Called by the AudioSink to signal that all outstanding work is complete + // and the sink is shutting down. + void OnAudioSinkComplete(); + // The decoder object that created this state machine. The state machine // holds a strong reference to the decoder to ensure that the decoder stays // alive once media element has started the decoder shutdown process, and has @@ -681,10 +664,6 @@ protected: // Accessed on state machine, audio, main, and AV thread. State mState; - // Thread for pushing audio onto the audio hardware. - // The "audio push thread". - nsCOMPtr mAudioThread; - // The task queue in which we run decode tasks. This is referred to as // the "decode thread", though in practise tasks can run on a different // thread every time they're called. @@ -705,7 +684,7 @@ protected: // The time that playback started from the system clock. This is used for // timing the presentation of video frames when there's no audio. - // Accessed only via the state machine thread. + // Accessed only via the state machine thread. Must be set via SetPlayStartTime. TimeStamp mPlayStartTime; // When we start writing decoded data to a new DecodedDataStream, or we @@ -714,11 +693,6 @@ protected: int64_t mSyncPointInMediaStream; // microseconds int64_t mSyncPointInDecodedStream; // microseconds - // When the playbackRate changes, and there is no audio clock, it is necessary - // to reset the mPlayStartTime. This is done next time the clock is queried, - // when this member is true. Access protected by decoder monitor. - bool mResetPlayStartTime; - // The amount of time we've spent playing already the media. The current // playback position is therefore |Now() - mPlayStartTime + // mPlayDuration|, which must be adjusted by mStartTime if used with media @@ -757,11 +731,8 @@ protected: // Media Fragment end time in microseconds. Access controlled by decoder monitor. int64_t mFragmentEndTime; - // The audio stream resource. Used on the state machine, and audio threads. - // This is created and destroyed on the audio thread, while holding the - // decoder monitor, so if this is used off the audio thread, you must - // first acquire the decoder monitor and check that it is non-null. - RefPtr mAudioStream; + // The audio sink resource. Used on state machine and audio threads. + RefPtr mAudioSink; // The reader, don't call its methods with the decoder monitor held. // This is created in the state machine's constructor. @@ -807,11 +778,6 @@ protected: // Pitch preservation for the playback rate. Synchronized via decoder monitor. bool mPreservesPitch; - // Position at which the last playback rate change occured, used to compute - // the actual position in the stream when the playback rate changes and there - // is no audio to be sync-ed to. Synchronized via decoder monitor. - int64_t mBasePosition; - // Time at which we started decoding. Synchronised via decoder monitor. TimeStamp mDecodeStartTime; diff --git a/content/media/moz.build b/content/media/moz.build index bdc0cc6647c3..df7080cebe4f 100644 --- a/content/media/moz.build +++ b/content/media/moz.build @@ -124,6 +124,7 @@ UNIFIED_SOURCES += [ 'AudioNodeExternalInputStream.cpp', 'AudioNodeStream.cpp', 'AudioSegment.cpp', + 'AudioSink.cpp', 'AudioStream.cpp', 'AudioStreamTrack.cpp', 'BufferDecoder.cpp', diff --git a/content/media/test/mochitest.ini b/content/media/test/mochitest.ini index d0d365a43a63..8f5396af677d 100644 --- a/content/media/test/mochitest.ini +++ b/content/media/test/mochitest.ini @@ -395,10 +395,7 @@ skip-if = appname == "seamonkey" || toolkit == 'gonk' || toolkit == 'android' skip-if = buildapp == 'b2g' || toolkit == 'android' # Disabled on Android & B2G due to bug 668973 [test_playback_errors.html] [test_playback_rate.html] -# Win: Bug 814533, B2G & Android Debug: Bug 1020538, see assertion annotations in test also -skip-if = os == 'win' || buildapp == 'b2g' || (toolkit == 'android' && debug) [test_playback_rate_playpause.html] -skip-if = os == 'linux' || os == 'win' # bug 897108, see assertion annotations in test also [test_played.html] skip-if = true # bug 1021794 [test_preload_actions.html] diff --git a/content/media/test/test_playback_rate.html b/content/media/test/test_playback_rate.html index 412428962695..fb46fcfd957f 100644 --- a/content/media/test/test_playback_rate.html +++ b/content/media/test/test_playback_rate.html @@ -10,19 +10,9 @@
 
+  
+  
+  
+
+
+Mozilla Bug 1022869
+

+ +
+
+ + diff --git a/dom/workers/test/test_csp.html^headers^ b/dom/workers/test/test_csp.html^headers^ index 036da648514e..b91ba384d948 100644 --- a/dom/workers/test/test_csp.html^headers^ +++ b/dom/workers/test/test_csp.html^headers^ @@ -1,2 +1,2 @@ Cache-Control: no-cache -X-Content-Security-Policy: allow 'self' +Content-Security-Policy: default-src 'self' diff --git a/gfx/skia/README_COMMITTING b/gfx/skia/README_COMMITTING new file mode 100644 index 000000000000..4014ea3c7f28 --- /dev/null +++ b/gfx/skia/README_COMMITTING @@ -0,0 +1,10 @@ +Any changes to Skia should have at a minimum both a Mozilla bug tagged with the [skia-upstream] +whiteboard tag, and also an upstream bug and review request. Any patches that do ultimately land +in mozilla-central must be reviewed by a Skia submodule peer. + +See https://wiki.mozilla.org/Modules/Core#Graphics for current peers. + +In most cases the patch will need to have an r+ from upstream before it is eligible to land here. + +For information on submitting upstream, see: +https://sites.google.com/site/skiadocs/developer-documentation/contributing-code/how-to-submit-a-patch diff --git a/gfx/skia/patches/README b/gfx/skia/patches/README index 5c8292816ff7..8fd2c5396a0f 100644 --- a/gfx/skia/patches/README +++ b/gfx/skia/patches/README @@ -1,15 +1,2 @@ -This directory contains the patches currently applied against upstream Skia. -The original patches are archived in archive/ - -See the relevant bugs in bugzilla for information on these patches: - -0001-Bug-777614-Re-add-our-SkUserConfig.h-r-nrc.patch -0004-Bug-777614-Re-apply-bug-719872-Fix-crash-on-Android-.patch -0005-Bug-777614-Re-apply-bug-687188-Expand-the-gradient-c.patch -0009-Bug-777614-Re-apply-759683-Handle-compilers-that-don.patch -0018-Bug-817356-PPC-defines.patch -0010-Bug-836892-Add-new-blending-modes-to-SkXfermode.patch -0011-Bug-839347-no-anon-namespace-around-SkNO_RETURN_HINT.patch -0012-Bug-751418-Add-our-own-GrUserConfig-r-mattwoodrow.patch -0013-Bug-751418-Fix-compile-error-on-gcc-in-Skia-GL-r-mat.patch -0031-Bug-945588-Add-include-guard.patch +We no longer keep a local patch queue of patches against upstream. The protocol now +is to upstream all patches before they are landed in mozilla-central. diff --git a/gfx/skia/patches/0001-Bug-895086-Remove-unused-find_from_uniqueID-function.patch b/gfx/skia/patches/archive/0001-Bug-895086-Remove-unused-find_from_uniqueID-function.patch similarity index 100% rename from gfx/skia/patches/0001-Bug-895086-Remove-unused-find_from_uniqueID-function.patch rename to gfx/skia/patches/archive/0001-Bug-895086-Remove-unused-find_from_uniqueID-function.patch diff --git a/gfx/skia/patches/0002-Bug-848491-Re-apply-Bug-795549-Move-TileProc-functio.patch b/gfx/skia/patches/archive/0002-Bug-848491-Re-apply-Bug-795549-Move-TileProc-functio.patch similarity index 100% rename from gfx/skia/patches/0002-Bug-848491-Re-apply-Bug-795549-Move-TileProc-functio.patch rename to gfx/skia/patches/archive/0002-Bug-848491-Re-apply-Bug-795549-Move-TileProc-functio.patch diff --git a/gfx/skia/patches/0005-Bug-736276-Add-a-new-SkFontHost-that-takes-a-cairo_s.patch b/gfx/skia/patches/archive/0005-Bug-736276-Add-a-new-SkFontHost-that-takes-a-cairo_s.patch similarity index 100% rename from gfx/skia/patches/0005-Bug-736276-Add-a-new-SkFontHost-that-takes-a-cairo_s.patch rename to gfx/skia/patches/archive/0005-Bug-736276-Add-a-new-SkFontHost-that-takes-a-cairo_s.patch diff --git a/gfx/skia/patches/0006-Bug-848491-Re-apply-Bug-777614-Add-our-SkUserConfig..patch b/gfx/skia/patches/archive/0006-Bug-848491-Re-apply-Bug-777614-Add-our-SkUserConfig..patch similarity index 100% rename from gfx/skia/patches/0006-Bug-848491-Re-apply-Bug-777614-Add-our-SkUserConfig..patch rename to gfx/skia/patches/archive/0006-Bug-848491-Re-apply-Bug-777614-Add-our-SkUserConfig..patch diff --git a/gfx/skia/patches/0007-Bug-848491-Re-apply-bug-687188-Expand-the-gradient-c.patch b/gfx/skia/patches/archive/0007-Bug-848491-Re-apply-bug-687188-Expand-the-gradient-c.patch similarity index 100% rename from gfx/skia/patches/0007-Bug-848491-Re-apply-bug-687188-Expand-the-gradient-c.patch rename to gfx/skia/patches/archive/0007-Bug-848491-Re-apply-bug-687188-Expand-the-gradient-c.patch diff --git a/gfx/skia/patches/0008-Bug-848491-Re-apply-759683-Handle-compilers-that-don.patch b/gfx/skia/patches/archive/0008-Bug-848491-Re-apply-759683-Handle-compilers-that-don.patch similarity index 100% rename from gfx/skia/patches/0008-Bug-848491-Re-apply-759683-Handle-compilers-that-don.patch rename to gfx/skia/patches/archive/0008-Bug-848491-Re-apply-759683-Handle-compilers-that-don.patch diff --git a/gfx/skia/patches/0009-Bug-848491-Re-apply-bug-751418-Add-our-own-GrUserCon.patch b/gfx/skia/patches/archive/0009-Bug-848491-Re-apply-bug-751418-Add-our-own-GrUserCon.patch similarity index 100% rename from gfx/skia/patches/0009-Bug-848491-Re-apply-bug-751418-Add-our-own-GrUserCon.patch rename to gfx/skia/patches/archive/0009-Bug-848491-Re-apply-bug-751418-Add-our-own-GrUserCon.patch diff --git a/gfx/skia/patches/0010-Bug-848491-Re-apply-bug-817356-Patch-Skia-to-recogni.patch b/gfx/skia/patches/archive/0010-Bug-848491-Re-apply-bug-817356-Patch-Skia-to-recogni.patch similarity index 100% rename from gfx/skia/patches/0010-Bug-848491-Re-apply-bug-817356-Patch-Skia-to-recogni.patch rename to gfx/skia/patches/archive/0010-Bug-848491-Re-apply-bug-817356-Patch-Skia-to-recogni.patch diff --git a/gfx/skia/patches/0022-Bug-848491-Re-apply-bug-795538-Ensure-we-use-the-cor.patch b/gfx/skia/patches/archive/0022-Bug-848491-Re-apply-bug-795538-Ensure-we-use-the-cor.patch similarity index 100% rename from gfx/skia/patches/0022-Bug-848491-Re-apply-bug-795538-Ensure-we-use-the-cor.patch rename to gfx/skia/patches/archive/0022-Bug-848491-Re-apply-bug-795538-Ensure-we-use-the-cor.patch diff --git a/gfx/skia/patches/0023-Bug-890539-Fix-SK_COMPILE_ASSERT-build-warning.patch b/gfx/skia/patches/archive/0023-Bug-890539-Fix-SK_COMPILE_ASSERT-build-warning.patch similarity index 100% rename from gfx/skia/patches/0023-Bug-890539-Fix-SK_COMPILE_ASSERT-build-warning.patch rename to gfx/skia/patches/archive/0023-Bug-890539-Fix-SK_COMPILE_ASSERT-build-warning.patch diff --git a/gfx/skia/patches/0024-Bug-887318-fix-bgra-readback.patch b/gfx/skia/patches/archive/0024-Bug-887318-fix-bgra-readback.patch similarity index 100% rename from gfx/skia/patches/0024-Bug-887318-fix-bgra-readback.patch rename to gfx/skia/patches/archive/0024-Bug-887318-fix-bgra-readback.patch diff --git a/gfx/skia/patches/0025-Bug-896049-Add-default-Value-SK_OVERRIDE.patch b/gfx/skia/patches/archive/0025-Bug-896049-Add-default-Value-SK_OVERRIDE.patch similarity index 100% rename from gfx/skia/patches/0025-Bug-896049-Add-default-Value-SK_OVERRIDE.patch rename to gfx/skia/patches/archive/0025-Bug-896049-Add-default-Value-SK_OVERRIDE.patch diff --git a/gfx/skia/patches/0026-Bug-901208-Fix-ARM-v4t.patch b/gfx/skia/patches/archive/0026-Bug-901208-Fix-ARM-v4t.patch similarity index 100% rename from gfx/skia/patches/0026-Bug-901208-Fix-ARM-v4t.patch rename to gfx/skia/patches/archive/0026-Bug-901208-Fix-ARM-v4t.patch diff --git a/gfx/skia/patches/0030-Bug-939629-Add-missing-include-guards.patch b/gfx/skia/patches/archive/0030-Bug-939629-Add-missing-include-guards.patch similarity index 100% rename from gfx/skia/patches/0030-Bug-939629-Add-missing-include-guards.patch rename to gfx/skia/patches/archive/0030-Bug-939629-Add-missing-include-guards.patch diff --git a/gfx/skia/patches/0031-Bug-945588-Add-include-guard.patch b/gfx/skia/patches/archive/0031-Bug-945588-Add-include-guard.patch similarity index 100% rename from gfx/skia/patches/0031-Bug-945588-Add-include-guard.patch rename to gfx/skia/patches/archive/0031-Bug-945588-Add-include-guard.patch diff --git a/gfx/skia/patches/0032-Bug-974900-More-missing-include-guards.patch b/gfx/skia/patches/archive/0032-Bug-974900-More-missing-include-guards.patch similarity index 100% rename from gfx/skia/patches/0032-Bug-974900-More-missing-include-guards.patch rename to gfx/skia/patches/archive/0032-Bug-974900-More-missing-include-guards.patch diff --git a/gfx/skia/patches/0033-Bug-974900-undef-interface-windows.patch b/gfx/skia/patches/archive/0033-Bug-974900-undef-interface-windows.patch similarity index 100% rename from gfx/skia/patches/0033-Bug-974900-undef-interface-windows.patch rename to gfx/skia/patches/archive/0033-Bug-974900-undef-interface-windows.patch diff --git a/intl/icu/Makefile.in b/intl/icu/Makefile.in index ed17efa12769..6ccb772e6055 100644 --- a/intl/icu/Makefile.in +++ b/intl/icu/Makefile.in @@ -44,32 +44,24 @@ include $(topsrcdir)/config/rules.mk ifdef ENABLE_INTL_API ifndef MOZ_NATIVE_ICU -ifdef .PYMAKE -ICU_MAKE = $(GMAKE) -else -ICU_MAKE = $(MAKE) -endif - default:: buildicu -# - ICU requires GNU make according to its readme.html. pymake can't be used -# because it doesn't support order only dependencies. # - Force ICU to use the standard suffix for object files because expandlibs # will discard all files with a non-standard suffix (bug 857450). # - Options for genrb: -k strict parsing; -R omit collation tailoring rules. buildicu:: # ICU's build system is full of races, so force non-parallel build. ifdef CROSS_COMPILE - +$(ICU_MAKE) -j1 -C host STATIC_O=$(OBJ_SUFFIX) GENRBOPTS='-k -R -C' + +$(MAKE) -j1 -C host STATIC_O=$(OBJ_SUFFIX) GENRBOPTS='-k -R -C' endif - +$(ICU_MAKE) -j1 -C target STATIC_O=$(OBJ_SUFFIX) GENRBOPTS='-k -R' + +$(MAKE) -j1 -C target STATIC_O=$(OBJ_SUFFIX) GENRBOPTS='-k -R' $(ICU_LIB_RENAME) distclean clean:: ifdef CROSS_COMPILE - +$(ICU_MAKE) -C host $@ STATIC_O=$(OBJ_SUFFIX) + +$(MAKE) -C host $@ STATIC_O=$(OBJ_SUFFIX) endif - +$(ICU_MAKE) -C target $@ STATIC_O=$(OBJ_SUFFIX) + +$(MAKE) -C target $@ STATIC_O=$(OBJ_SUFFIX) endif endif diff --git a/js/src/Makefile.in b/js/src/Makefile.in index f52bd6229264..5e9f5f24e377 100644 --- a/js/src/Makefile.in +++ b/js/src/Makefile.in @@ -4,7 +4,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/. -ifndef .PYMAKE ifeq (,$(MAKE_VERSION)) $(error GNU Make is required) endif @@ -12,7 +11,6 @@ make_min_ver := 3.81 ifneq ($(make_min_ver),$(firstword $(sort $(make_min_ver) $(MAKE_VERSION)))) $(error GNU Make $(make_min_ver) or higher is required) endif -endif TOPLEVEL_BUILD := 1 diff --git a/js/src/doc/Debugger/Debugger.Object.md b/js/src/doc/Debugger/Debugger.Object.md index deba1bd4d665..3c8269232f08 100644 --- a/js/src/doc/Debugger/Debugger.Object.md +++ b/js/src/doc/Debugger/Debugger.Object.md @@ -181,34 +181,6 @@ from its prototype: wrapper's global, not the wrapped object's global. The result refers to the global directly, not via a wrapper. -`hostAnnotations` -: A JavaScript object providing further metadata about the referent, or - `null` if none is available. The metadata object is in the same - compartment as this `Debugger.Object` instance. The same metadata - object is returned each time for a given `Debugger.Object` instance. - - A typical JavaScript embedding provides "host objects" to expose - application-specific functionality to scripts. The `hostAnnotations` - accessor consults the embedding for additional information about the - referent that might be of interest to the debugger. The returned - object's properties' meanings are up to the embedding. For example, a - web browser might provide host annotations for global objects to - distinguish top-level windows, iframes, and internal JavaScript scopes. - - By convention, host annotation objects have a string-valued `"type"` - property that, taken together with the object's class, indicate what - sort of thing the referent is. The host annotation object's other - properties provide further details, as appropriate for the type. For - example, in Firefox, a metadata object for a JavaScript Module's global - object might look like this: - - ```language-js - { "type":"jsm", "uri":"resource:://gre/modules/XPCOMUtils.jsm" } - ``` - - Firefox provides [DebuggerHostAnnotationsForFirefox annotations] for its - host objects. - ## Function Properties of the Debugger.Object prototype diff --git a/js/src/doc/Debugger/Debugger.md b/js/src/doc/Debugger/Debugger.md index fbcddf8734d8..f3beb113bcff 100644 --- a/js/src/doc/Debugger/Debugger.md +++ b/js/src/doc/Debugger/Debugger.md @@ -184,9 +184,7 @@ compartment. This method's return value is ignored. `onNewGlobalObject(global)` -: A new global object, global, has been created. The application - embedding the JavaScript implementation may provide details about what - kind of global it is via global.hostAnnotations. +: A new global object, global, has been created. This handler method should return a [resumption value][rv] specifying how the debuggee's execution should proceed. However, note that a { return: @@ -364,9 +362,7 @@ other kinds of objects. `findAllGlobals()` : Return an array of [`Debugger.Object`][object] instances referring to all the - global objects present in this JavaScript instance. The application may - provide details about what kind of globals they are via the - [`Debugger.Object`][object] instances' `hostAnnotations` accessors. + global objects present in this JavaScript instance. The results of this call can be affected in non-deterministic ways by the details of the JavaScript implementation. The array may include diff --git a/js/src/gc/Zone.cpp b/js/src/gc/Zone.cpp index 9cc5e244bb2a..ef96048b1457 100644 --- a/js/src/gc/Zone.cpp +++ b/js/src/gc/Zone.cpp @@ -197,18 +197,7 @@ Zone::discardJitCode(FreeOp *fop) for (ZoneCellIterUnderGC i(this, FINALIZE_SCRIPT); !i.done(); i.next()) { JSScript *script = i.get(); jit::FinishInvalidation(fop, script); - - // Preserve JIT code that have been recently used in - // parallel. Note that we mark their baseline scripts as active as - // well to preserve them. - if (script->hasParallelIonScript()) { - if (jit::ShouldPreserveParallelJITCode(runtimeFromMainThread(), script)) { - script->parallelIonScript()->purgeCaches(); - script->baselineScript()->setActive(); - } else { - jit::FinishInvalidation(fop, script); - } - } + jit::FinishInvalidation(fop, script); /* * Discard baseline script if it's not marked as active. Note that diff --git a/js/src/jit-test/tests/parallel/bug1029440.js b/js/src/jit-test/tests/parallel/bug1029440.js new file mode 100644 index 000000000000..270672f14dcb --- /dev/null +++ b/js/src/jit-test/tests/parallel/bug1029440.js @@ -0,0 +1,7 @@ +if (getBuildConfiguration().parallelJS) { + Array.buildPar(3, function() {}) + gczeal(10, 3) + Array.buildPar(9, function() { + Array.prototype.unshift.call([], undefined) + }) +} diff --git a/js/src/jit/Ion.cpp b/js/src/jit/Ion.cpp index f1dbf8824653..080faf654947 100644 --- a/js/src/jit/Ion.cpp +++ b/js/src/jit/Ion.cpp @@ -541,6 +541,12 @@ JitCompartment::notifyOfActiveParallelEntryScript(JSContext *cx, HandleScript sc return p || activeParallelEntryScripts_->add(p, script); } +bool +JitCompartment::hasRecentParallelActivity() const +{ + return activeParallelEntryScripts_ && !activeParallelEntryScripts_->empty(); +} + void jit::FinishOffThreadBuilder(IonBuilder *builder) { @@ -610,7 +616,8 @@ JitCompartment::mark(JSTracer *trc, JSCompartment *compartment) // off-thread helper too late (i.e., the ForkJoin finished with // warmup doing all the work), remove it. if (!script->hasParallelIonScript() || - !script->parallelIonScript()->isParallelEntryScript()) + !script->parallelIonScript()->isParallelEntryScript() || + trc->runtime()->gc.shouldCleanUpEverything) { e.removeFront(); continue; @@ -622,9 +629,11 @@ JitCompartment::mark(JSTracer *trc, JSCompartment *compartment) // Subtlety: We depend on the tracing of the parallel IonScript's // callTargetEntries to propagate the parallel age to the entire // call graph. - if (ShouldPreserveParallelJITCode(trc->runtime(), script, /* increase = */ true)) { + if (script->parallelIonScript()->shouldPreserveParallelCode(IonScript::IncreaseAge)) { MarkScript(trc, const_cast(&e.front()), "par-script"); MOZ_ASSERT(script == e.front()); + } else { + e.removeFront(); } } } @@ -959,13 +968,8 @@ IonScript::trace(JSTracer *trc) // No write barrier is needed for the call target list, as it's attached // at compilation time and is read only. - for (size_t i = 0; i < callTargetEntries(); i++) { - // Propagate the parallelAge to the call targets. - if (callTargetList()[i]->hasParallelIonScript()) - callTargetList()[i]->parallelIonScript()->parallelAge_ = parallelAge_; - + for (size_t i = 0; i < callTargetEntries(); i++) gc::MarkScriptUnbarriered(trc, &callTargetList()[i], "callTarget"); - } } /* static */ void diff --git a/js/src/jit/IonCode.h b/js/src/jit/IonCode.h index fde760844a6a..c6c7d2665415 100644 --- a/js/src/jit/IonCode.h +++ b/js/src/jit/IonCode.h @@ -601,6 +601,11 @@ struct IonScript static const uint32_t MAX_PARALLEL_AGE = 5; + enum ShouldIncreaseAge { + IncreaseAge = true, + KeepAge = false + }; + void resetParallelAge() { MOZ_ASSERT(isParallelEntryScript()); parallelAge_ = 0; @@ -608,9 +613,9 @@ struct IonScript uint32_t parallelAge() const { return parallelAge_; } - uint32_t increaseParallelAge() { + uint32_t shouldPreserveParallelCode(ShouldIncreaseAge increaseAge = KeepAge) { MOZ_ASSERT(isParallelEntryScript()); - return ++parallelAge_; + return (increaseAge ? ++parallelAge_ : parallelAge_) < MAX_PARALLEL_AGE; } static void writeBarrierPre(Zone *zone, IonScript *ionScript); diff --git a/js/src/jit/IonFrames.cpp b/js/src/jit/IonFrames.cpp index a8f8033201d2..9f5ff3d6acf1 100644 --- a/js/src/jit/IonFrames.cpp +++ b/js/src/jit/IonFrames.cpp @@ -1899,11 +1899,11 @@ InlineFrameIterator::computeScopeChain(Value scopeChainValue) const if (scopeChainValue.isObject()) return &scopeChainValue.toObject(); - if (isFunctionFrame()) { - // Heavyweight functions should always have a scope chain. - MOZ_ASSERT(!callee()->isHeavyweight()); + // Note we can hit this case even for heavyweight functions, in case we + // are walking the frame during the function prologue, before the scope + // chain has been initialized. + if (isFunctionFrame()) return callee()->environment(); - } // Ion does not handle scripts that are not compile-and-go. MOZ_ASSERT(!script()->isForEval()); diff --git a/js/src/jit/JitCompartment.h b/js/src/jit/JitCompartment.h index a48a4e4ac2e6..b2da45b216d5 100644 --- a/js/src/jit/JitCompartment.h +++ b/js/src/jit/JitCompartment.h @@ -467,6 +467,7 @@ class JitCompartment } bool notifyOfActiveParallelEntryScript(JSContext *cx, HandleScript script); + bool hasRecentParallelActivity() const; void toggleBaselineStubBarriers(bool enabled); @@ -498,14 +499,6 @@ void InvalidateAll(FreeOp *fop, JS::Zone *zone); template void FinishInvalidation(FreeOp *fop, JSScript *script); -inline bool -ShouldPreserveParallelJITCode(JSRuntime *rt, JSScript *script, bool increase = false) -{ - IonScript *parallelIon = script->parallelIonScript(); - uint32_t age = increase ? parallelIon->increaseParallelAge() : parallelIon->parallelAge(); - return age < jit::IonScript::MAX_PARALLEL_AGE && !rt->gc.shouldCleanUpEverything; -} - // On windows systems, really large frames need to be incrementally touched. // The following constant defines the minimum increment of the touch. #ifdef XP_WIN diff --git a/js/src/jit/ParallelFunctions.cpp b/js/src/jit/ParallelFunctions.cpp index 16b3ca11268f..e77499fdd628 100644 --- a/js/src/jit/ParallelFunctions.cpp +++ b/js/src/jit/ParallelFunctions.cpp @@ -131,13 +131,8 @@ jit::CheckOverRecursedPar(ForkJoinContext *cx) JS_ASSERT(ForkJoinContext::current() == cx); int stackDummy_; - // When an interrupt is requested, the main thread stack limit is - // overwritten with a sentinel value that brings us here. - // Therefore, we must check whether this is really a stack overrun - // and, if not, check whether an interrupt was requested. - // - // When not on the main thread, we don't overwrite the stack - // limit, but we do still call into this routine if the interrupt + // In PJS, unlike sequential execution, we don't overwrite the stack limit + // on interrupt, but we do still call into this routine if the interrupt // flag is set, so we still need to double check. #if defined(JS_ARM_SIMULATOR) || defined(JS_MIPS_SIMULATOR) @@ -147,13 +142,7 @@ jit::CheckOverRecursedPar(ForkJoinContext *cx) } #endif - uintptr_t realStackLimit; - if (cx->isMainThread()) - realStackLimit = GetNativeStackLimit(cx); - else - realStackLimit = cx->perThreadData->jitStackLimit; - - if (!JS_CHECK_STACK_SIZE(realStackLimit, &stackDummy_)) { + if (!JS_CHECK_STACK_SIZE(cx->perThreadData->jitStackLimit, &stackDummy_)) { cx->bailoutRecord->joinCause(ParallelBailoutOverRecursed); return false; } @@ -178,10 +167,8 @@ jit::ExtendArrayPar(ForkJoinContext *cx, JSObject *array, uint32_t length) { JSObject::EnsureDenseResult res = array->ensureDenseElementsPreservePackedFlag(cx, 0, length); - if (res != JSObject::ED_OK) { - fprintf(stderr, "==== NGNG\n"); + if (res != JSObject::ED_OK) return nullptr; - } return array; } diff --git a/js/src/jit/RangeAnalysis.cpp b/js/src/jit/RangeAnalysis.cpp index 3780a55815dc..0adb7fac41ad 100644 --- a/js/src/jit/RangeAnalysis.cpp +++ b/js/src/jit/RangeAnalysis.cpp @@ -916,9 +916,9 @@ Range::abs(TempAllocator &alloc, const Range *op) int32_t l = op->lower_; int32_t u = op->upper_; - return new(alloc) Range(Max(Max(int32_t(0), l), u == INT32_MIN ? int32_t(INT32_MAX) : -u), + return new(alloc) Range(Max(Max(int32_t(0), l), u == INT32_MIN ? INT32_MAX : -u), true, - Max(Max(int32_t(0), u), l == INT32_MIN ? int32_t(INT32_MAX) : -l), + Max(Max(int32_t(0), u), l == INT32_MIN ? INT32_MAX : -l), op->hasInt32Bounds() && l != INT32_MIN, op->canHaveFractionalPart_, op->max_exponent_); diff --git a/js/src/jsgc.cpp b/js/src/jsgc.cpp index f57f61599cb4..81941c671b19 100644 --- a/js/src/jsgc.cpp +++ b/js/src/jsgc.cpp @@ -2975,6 +2975,11 @@ GCRuntime::shouldPreserveJITCode(JSCompartment *comp, int64_t currentTime) if (comp->lastAnimationTime + PRMJ_USEC_PER_SEC >= currentTime) return true; +#ifdef JS_ION + if (comp->jitCompartment() && comp->jitCompartment()->hasRecentParallelActivity()) + return true; +#endif + return false; } diff --git a/js/src/jsinfer.cpp b/js/src/jsinfer.cpp index 5dd952484748..398eea5cc9bb 100644 --- a/js/src/jsinfer.cpp +++ b/js/src/jsinfer.cpp @@ -4437,28 +4437,17 @@ TypeZone::sweep(FreeOp *fop, bool releaseTypes, bool *oom) types::TypeScript::Sweep(fop, script, oom); if (releaseTypes) { - if (script->hasParallelIonScript()) { -#ifdef JS_ION - // It's possible that we preserved the parallel - // IonScript. The heuristic for their preservation is - // independent of general JIT code preservation. - MOZ_ASSERT(jit::ShouldPreserveParallelJITCode(rt, script)); - script->parallelIonScript()->recompileInfoRef().shouldSweep(*this); -#else - MOZ_CRASH(); -#endif - } else { - script->types->destroy(); - script->types = nullptr; + script->types->destroy(); + script->types = nullptr; - /* - * Freeze constraints on stack type sets need to be - * regenerated the next time the script is analyzed. - */ - script->clearHasFreezeConstraints(); - } + /* + * Freeze constraints on stack type sets need to be + * regenerated the next time the script is analyzed. + */ + script->clearHasFreezeConstraints(); JS_ASSERT(!script->hasIonScript()); + JS_ASSERT(!script->hasParallelIonScript()); } else { /* Update the recompile indexes in any IonScripts still on the script. */ if (script->hasIonScript()) diff --git a/js/src/vm/ForkJoin.cpp b/js/src/vm/ForkJoin.cpp index e64ac701efbe..d25bf2e9f0b2 100644 --- a/js/src/vm/ForkJoin.cpp +++ b/js/src/vm/ForkJoin.cpp @@ -1611,9 +1611,20 @@ ForkJoinShared::executeFromMainThread(ThreadPoolWorker *worker) } TlsPerThreadData.set(&thisThread); - // Don't use setIonStackLimit() because that acquires the ionStackLimitLock, and the - // lock has not been initialized in these cases. - thisThread.jitStackLimit = oldData->jitStackLimit; + // Subtlety warning: the reason the stack limit is set via + // GetNativeStackLimit instead of oldData->jitStackLimit is because the + // main thread's jitStackLimit could be -1 due to runtime->interrupt being + // set. + // + // In turn, the reason that it is okay for runtime->interrupt to be + // set and for us to still continue PJS execution is because PJS, being + // unable to use the signal-based interrupt handling like sequential JIT + // code, keeps a separate flag, interruptPar, to filter out interrupts + // which should not interrupt JIT code. + // + // Thus, use GetNativeStackLimit instead of just propagating the + // main thread's. + thisThread.jitStackLimit = GetNativeStackLimit(cx_); executePortion(&thisThread, worker); TlsPerThreadData.set(oldData); @@ -1853,7 +1864,7 @@ bool ForkJoinContext::initialize() bool ForkJoinContext::isMainThread() const { - return perThreadData == &shared_->runtime()->mainThread; + return worker_->isMainThread(); } JSRuntime * diff --git a/layout/base/FrameLayerBuilder.cpp b/layout/base/FrameLayerBuilder.cpp index 915fc6c2ce45..f2c9ea36a88e 100644 --- a/layout/base/FrameLayerBuilder.cpp +++ b/layout/base/FrameLayerBuilder.cpp @@ -3522,7 +3522,7 @@ FrameLayerBuilder::GetThebesLayerScaleForFrame(nsIFrame* aFrame) } nsTArray *array = - reinterpret_cast*>(aFrame->Properties().Get(LayerManagerDataProperty())); + reinterpret_cast*>(f->Properties().Get(LayerManagerDataProperty())); if (!array) { continue; } diff --git a/layout/base/nsRefreshDriver.cpp b/layout/base/nsRefreshDriver.cpp index 57eba1cdafdb..5e4cc2d2efe5 100644 --- a/layout/base/nsRefreshDriver.cpp +++ b/layout/base/nsRefreshDriver.cpp @@ -873,8 +873,15 @@ nsRefreshDriver::EnsureTimerStarted(bool aAdjustingTimer) mActiveTimer->AddRefreshDriver(this); } - mMostRecentRefresh = mActiveTimer->MostRecentRefresh(); - mMostRecentRefreshEpochTime = mActiveTimer->MostRecentRefreshEpochTime(); + // Since the different timers are sampled at different rates, when switching + // timers, the most recent refresh of the new timer may be *before* the + // most recent refresh of the old timer. However, the refresh driver time + // should not go backwards so we clamp the most recent refresh time. + mMostRecentRefresh = + std::max(mActiveTimer->MostRecentRefresh(), mMostRecentRefresh); + mMostRecentRefreshEpochTime = + std::max(mActiveTimer->MostRecentRefreshEpochTime(), + mMostRecentRefreshEpochTime); } void diff --git a/layout/reftests/font-face/reftest.list b/layout/reftests/font-face/reftest.list index 39885d068625..e33b47552dc1 100644 --- a/layout/reftests/font-face/reftest.list +++ b/layout/reftests/font-face/reftest.list @@ -7,7 +7,7 @@ HTTP(..) == download-2.html download-2-ref.html HTTP(..) != download-2.html about:blank random-if(winWidget) HTTP(..) == download-2-big.html download-2-big-otf.html # bug 470713 HTTP(..) != download-2-big-otf.html about:blank -skip-if(Android&&AndroidVersion==17) HTTP(..) != download-3-notref.html download-3.html +asserts-if(Android,2) skip-if(Android&&AndroidVersion==17) HTTP(..) != download-3-notref.html download-3.html # bug 1019192, bug 936226 HTTP(..) == download-3-ref.html download-3.html HTTP(..) == fallback-to-system-1.html fallback-to-system-1-ref.html HTTP(..) == name-override-simple-1.html name-override-simple-1-ref.html diff --git a/media/libstagefright/binding/AnnexB.cpp b/media/libstagefright/binding/AnnexB.cpp index 80cc5c696d5f..1b2bf22df246 100644 --- a/media/libstagefright/binding/AnnexB.cpp +++ b/media/libstagefright/binding/AnnexB.cpp @@ -21,8 +21,18 @@ AnnexB::ConvertSample(MP4Sample* aSample, MOZ_ASSERT(aSample); MOZ_ASSERT(aSample->data); MOZ_ASSERT(aSample->size >= ArrayLength(kAnnexBDelimiter)); - // Overwrite the NAL length with the Annex B separator. - memcpy(aSample->data, kAnnexBDelimiter, ArrayLength(kAnnexBDelimiter)); + + uint8_t* d = aSample->data; + while (d + 4 < aSample->data + aSample->size) { + uint32_t nalLen = (uint32_t(d[0]) << 24) + + (uint32_t(d[1]) << 16) + + (uint32_t(d[2]) << 8) + + uint32_t(d[3]); + // Overwrite the NAL length with the Annex B separator. + memcpy(d, kAnnexBDelimiter, ArrayLength(kAnnexBDelimiter)); + d += 4 + nalLen; + } + // Prepend the Annex B header with SPS and PPS tables to keyframes. if (aSample->is_sync_point) { aSample->Prepend(annexB.begin(), annexB.length()); diff --git a/media/libstagefright/binding/DecoderData.cpp b/media/libstagefright/binding/DecoderData.cpp index c86bf08668a8..eb7e45bb8236 100644 --- a/media/libstagefright/binding/DecoderData.cpp +++ b/media/libstagefright/binding/DecoderData.cpp @@ -82,9 +82,12 @@ VideoDecoderConfig::Update(sp& aMetaData, const char* aMimeType) size_t size; uint32_t type; - if (aMetaData->findData(kKeyAVCC, &type, &data, &size)) { + if (aMetaData->findData(kKeyAVCC, &type, &data, &size) && size >= 7) { extra_data.clear(); extra_data.append(reinterpret_cast(data), size); + // Set size of the NAL length to 4. The demuxer formats its output with + // this NAL length size. + extra_data[4] |= 3; annex_b = AnnexB::ConvertExtraDataToAnnexB(extra_data); } } diff --git a/media/libstagefright/binding/include/mp4_demuxer/AnnexB.h b/media/libstagefright/binding/include/mp4_demuxer/AnnexB.h index f4be4df5f49b..56beced90375 100644 --- a/media/libstagefright/binding/include/mp4_demuxer/AnnexB.h +++ b/media/libstagefright/binding/include/mp4_demuxer/AnnexB.h @@ -16,6 +16,7 @@ class AnnexB { public: // Convert a sample from NAL unit syntax to Annex B. + // Assumes size of NAL length field is 4 bytes. static void ConvertSample(MP4Sample* aSample, const mozilla::Vector& annexB); diff --git a/media/libstagefright/frameworks/av/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/frameworks/av/media/libstagefright/MPEG4Extractor.cpp index b53584bb498f..6cb5ec5e61c7 100644 --- a/media/libstagefright/frameworks/av/media/libstagefright/MPEG4Extractor.cpp +++ b/media/libstagefright/frameworks/av/media/libstagefright/MPEG4Extractor.cpp @@ -3253,7 +3253,7 @@ status_t MPEG4Source::read( return OK; } else { // Whole NAL units are returned but each fragment is prefixed by - // the start code (0x00 00 00 01). + // the NAL length, stored in four bytes. ssize_t num_bytes_read = 0; int32_t drm = 0; bool usesDRM = (mFormat->findInt32(kKeyIsDRM, &drm) && drm != 0); @@ -3539,7 +3539,7 @@ status_t MPEG4Source::fragmentedRead( } else { ALOGV("whole NAL"); // Whole NAL units are returned but each fragment is prefixed by - // the start code (0x00 00 00 01). + // the NAL unit's length, stored in four bytes. ssize_t num_bytes_read = 0; int32_t drm = 0; bool usesDRM = (mFormat->findInt32(kKeyIsDRM, &drm) && drm != 0); diff --git a/media/webrtc/trunk/webrtc/modules/video_coding/codecs/vp8/vp8_impl.cc b/media/webrtc/trunk/webrtc/modules/video_coding/codecs/vp8/vp8_impl.cc index 86591a24f117..d9c3a2244028 100644 --- a/media/webrtc/trunk/webrtc/modules/video_coding/codecs/vp8/vp8_impl.cc +++ b/media/webrtc/trunk/webrtc/modules/video_coding/codecs/vp8/vp8_impl.cc @@ -346,12 +346,16 @@ int VP8EncoderImpl::Encode(const I420VideoFrame& input_image, if (ret < 0) { return ret; } +#ifndef LIBVPX_ENCODER_CONFIG_ON_RESIZE //work around for bug 1030324 + frame_type = kKeyFrame; +#endif } + // Image in vpx_image_t format. // Input image is const. VP8's raw image is not defined as const. - raw_->planes[PLANE_Y] = const_cast(input_image.buffer(kYPlane)); - raw_->planes[PLANE_U] = const_cast(input_image.buffer(kUPlane)); - raw_->planes[PLANE_V] = const_cast(input_image.buffer(kVPlane)); + raw_->planes[VPX_PLANE_Y] = const_cast(input_image.buffer(kYPlane)); + raw_->planes[VPX_PLANE_U] = const_cast(input_image.buffer(kUPlane)); + raw_->planes[VPX_PLANE_V] = const_cast(input_image.buffer(kVPlane)); // TODO(mikhal): Stride should be set in initialization. raw_->stride[VPX_PLANE_Y] = input_image.stride(kYPlane); raw_->stride[VPX_PLANE_U] = input_image.stride(kUPlane); @@ -413,7 +417,15 @@ int VP8EncoderImpl::UpdateCodecFrameSize(const I420VideoFrame& input_image) { // Change of frame size will automatically trigger a key frame. config_->g_w = codec_.width; config_->g_h = codec_.height; +#ifndef LIBVPX_ENCODER_CONFIG_ON_RESIZE + //work around for bug 1030324 + // doing only a configuration change causes + // horizontal streaking and distortion in the output. + vpx_codec_flags_t flags = VPX_CODEC_USE_OUTPUT_PARTITION; + if (vpx_codec_enc_init(encoder_, vpx_codec_vp8_cx(), config_, flags)) { +#else if (vpx_codec_enc_config_set(encoder_, config_)) { +#endif return WEBRTC_VIDEO_CODEC_ERROR; } return WEBRTC_VIDEO_CODEC_OK; diff --git a/mobile/android/app/mobile.js b/mobile/android/app/mobile.js index 111ae7009b8e..ded06f32a2bc 100644 --- a/mobile/android/app/mobile.js +++ b/mobile/android/app/mobile.js @@ -797,9 +797,6 @@ pref("dom.phonenumber.substringmatching.VE", 7); // Support for the mozAudioChannel attribute on media elements is disabled in non-webapps pref("media.useAudioChannelService", false); -// Turn on the CSP 1.0 parser for Content Security Policy headers -pref("security.csp.speccompliant", true); - // Enable hardware-accelerated Skia canvas pref("gfx.canvas.azure.backends", "skia"); pref("gfx.canvas.azure.accelerated", true); diff --git a/mobile/android/base/ActionModeCompat.java b/mobile/android/base/ActionModeCompat.java index 245c6f18f66c..67b6a7768514 100644 --- a/mobile/android/base/ActionModeCompat.java +++ b/mobile/android/base/ActionModeCompat.java @@ -5,6 +5,7 @@ package org.mozilla.gecko; import org.mozilla.gecko.widget.GeckoPopupMenu; +import org.mozilla.gecko.menu.GeckoMenuItem; import android.view.Gravity; import android.view.Menu; @@ -99,7 +100,7 @@ class ActionModeCompat implements GeckoPopupMenu.OnMenuItemClickListener, /* GeckoPopupMenu.onMenuItemLongClickListener */ @Override public boolean onMenuItemLongClick(MenuItem item) { - showTooltip(item); + showTooltip((GeckoMenuItem) item); return true; } @@ -109,7 +110,7 @@ class ActionModeCompat implements GeckoPopupMenu.OnMenuItemClickListener, mPresenter.endActionModeCompat(); } - private void showTooltip(MenuItem item) { + private void showTooltip(GeckoMenuItem item) { // Computes the tooltip toast screen position (shown when long-tapping the menu item) with regards to the // menu item's position (i.e below the item and slightly to the left) int[] location = new int[2]; diff --git a/mobile/android/base/BrowserApp.java b/mobile/android/base/BrowserApp.java index 871677f04e7a..689a33ee0200 100644 --- a/mobile/android/base/BrowserApp.java +++ b/mobile/android/base/BrowserApp.java @@ -758,12 +758,17 @@ public class BrowserApp extends GeckoApp if (!TextUtils.isEmpty(text)) { Tabs.getInstance().loadUrl(text); Telemetry.sendUIEvent(TelemetryContract.Event.LOAD_URL, TelemetryContract.Method.CONTEXT_MENU); + Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.CONTEXT_MENU, "pasteandgo"); } return true; } if (itemId == R.id.site_settings) { + // This can be selected from either the browser menu or the contextmenu, depending on the size and version (v11+) of the phone. GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("Permissions:Get", null)); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { + Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.CONTEXT_MENU, "site_settings"); + } return true; } @@ -771,11 +776,13 @@ public class BrowserApp extends GeckoApp String text = Clipboard.getText(); if (!TextUtils.isEmpty(text)) { enterEditingMode(text); + Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.CONTEXT_MENU, "paste"); } return true; } if (itemId == R.id.subscribe) { + // This can be selected from either the browser menu or the contextmenu, depending on the size and version (v11+) of the phone. Tab tab = Tabs.getInstance().getSelectedTab(); if (tab != null && tab.hasFeeds()) { JSONObject args = new JSONObject(); @@ -785,6 +792,9 @@ public class BrowserApp extends GeckoApp Log.e(LOGTAG, "error building json arguments"); } GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("Feeds:Subscribe", args.toString())); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { + Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.CONTEXT_MENU, "subscribe"); + } } return true; } @@ -815,6 +825,7 @@ public class BrowserApp extends GeckoApp String url = tab.getURL(); if (url != null) { Clipboard.setText(url); + Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.CONTEXT_MENU, "copyurl"); } } return true; diff --git a/mobile/android/chrome/content/SelectionHandler.js b/mobile/android/chrome/content/SelectionHandler.js index 7e3241c06c52..6a98e13820ab 100644 --- a/mobile/android/chrome/content/SelectionHandler.js +++ b/mobile/android/chrome/content/SelectionHandler.js @@ -518,7 +518,8 @@ var SelectionHandler = { id: "selectall_action", icon: "drawable://ab_select_all", action: function(aElement) { - SelectionHandler.startSelection(aElement) + SelectionHandler.startSelection(aElement); + UITelemetry.addEvent("action.1", "actionbar", null, "select_all"); }, order: 5, selector: { @@ -541,6 +542,7 @@ var SelectionHandler = { // copySelection closes the selection. Show a caret where we just cut the text. SelectionHandler.attachCaret(aElement); + UITelemetry.addEvent("action.1", "actionbar", null, "cut"); }, order: 4, selector: { @@ -557,6 +559,7 @@ var SelectionHandler = { icon: "drawable://ab_copy", action: function() { SelectionHandler.copySelection(); + UITelemetry.addEvent("action.1", "actionbar", null, "copy"); }, order: 3, selector: { @@ -581,6 +584,7 @@ var SelectionHandler = { target.editor.paste(Ci.nsIClipboard.kGlobalClipboard); target.focus(); SelectionHandler._closeSelection(); + UITelemetry.addEvent("action.1", "actionbar", null, "paste"); } }, order: 2, @@ -601,6 +605,7 @@ var SelectionHandler = { icon: "drawable://ic_menu_share", action: function() { SelectionHandler.shareSelection(); + UITelemetry.addEvent("action.1", "actionbar", null, "share"); }, selector: { matches: function() { @@ -618,6 +623,7 @@ var SelectionHandler = { action: function() { SelectionHandler.searchSelection(); SelectionHandler._closeSelection(); + UITelemetry.addEvent("action.1", "actionbar", null, "search"); }, order: 1, selector: { @@ -633,6 +639,7 @@ var SelectionHandler = { icon: "drawable://phone", action: function() { SelectionHandler.callSelection(); + UITelemetry.addEvent("action.1", "actionbar", null, "call"); }, order: 1, selector: { diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js index ea4d3954fc4b..103984e3ccd9 100644 --- a/mobile/android/chrome/content/browser.js +++ b/mobile/android/chrome/content/browser.js @@ -39,6 +39,9 @@ XPCOMUtils.defineLazyModuleGetter(this, "UserAgentOverrides", XPCOMUtils.defineLazyModuleGetter(this, "LoginManagerContent", "resource://gre/modules/LoginManagerContent.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "LoginManagerParent", + "resource://gre/modules/LoginManagerParent.jsm"); + XPCOMUtils.defineLazyModuleGetter(this, "Task", "resource://gre/modules/Task.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "OS", "resource://gre/modules/osfile.jsm"); @@ -5394,6 +5397,8 @@ var FormAssistant = { BrowserApp.deck.addEventListener("click", this, true); BrowserApp.deck.addEventListener("input", this, false); BrowserApp.deck.addEventListener("pageshow", this, false); + + LoginManagerParent.init(); }, uninit: function() { diff --git a/netwerk/protocol/http/Http2Compression.cpp b/netwerk/protocol/http/Http2Compression.cpp index 3c7daf943e19..0fb14c822c85 100644 --- a/netwerk/protocol/http/Http2Compression.cpp +++ b/netwerk/protocol/http/Http2Compression.cpp @@ -66,7 +66,7 @@ InitializeStaticHeaders() AddStaticElement(NS_LITERAL_CSTRING(":status"), NS_LITERAL_CSTRING("404")); AddStaticElement(NS_LITERAL_CSTRING(":status"), NS_LITERAL_CSTRING("500")); AddStaticElement(NS_LITERAL_CSTRING("accept-charset")); - AddStaticElement(NS_LITERAL_CSTRING("accept-encoding")); + AddStaticElement(NS_LITERAL_CSTRING("accept-encoding"), NS_LITERAL_CSTRING("gzip, deflate")); AddStaticElement(NS_LITERAL_CSTRING("accept-language")); AddStaticElement(NS_LITERAL_CSTRING("accept-ranges")); AddStaticElement(NS_LITERAL_CSTRING("accept")); diff --git a/netwerk/protocol/http/Http2HuffmanIncoming.h b/netwerk/protocol/http/Http2HuffmanIncoming.h index edb1b0b46ced..1ef731cf0f75 100644 --- a/netwerk/protocol/http/Http2HuffmanIncoming.h +++ b/netwerk/protocol/http/Http2HuffmanIncoming.h @@ -20,1719 +20,135 @@ struct HuffmanIncomingTable { uint8_t mPrefixLen; }; -static HuffmanIncomingEntry HuffmanIncomingEntries_248[] = { - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 34, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 }, - { nullptr, 41, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_248 = { - HuffmanIncomingEntries_248, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_249[] = { - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 72, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 }, - { nullptr, 74, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_249 = { - HuffmanIncomingEntries_249, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_250[] = { - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 75, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 }, - { nullptr, 76, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_250 = { - HuffmanIncomingEntries_250, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_251[] = { - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 81, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 }, - { nullptr, 82, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_251 = { - HuffmanIncomingEntries_251, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_252[] = { - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 86, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 }, - { nullptr, 87, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_252 = { - HuffmanIncomingEntries_252, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_253[] = { - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 89, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 }, - { nullptr, 90, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_253 = { - HuffmanIncomingEntries_253, - 1 -}; - static HuffmanIncomingEntry HuffmanIncomingEntries_254[] = { - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, - { nullptr, 113, 1 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 33, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, + { nullptr, 34, 2 }, { nullptr, 40, 2 }, { nullptr, 40, 2 }, { nullptr, 40, 2 }, @@ -1797,70 +213,70 @@ static HuffmanIncomingEntry HuffmanIncomingEntries_254[] = { { nullptr, 40, 2 }, { nullptr, 40, 2 }, { nullptr, 40, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 }, - { nullptr, 42, 2 } + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 }, + { nullptr, 41, 2 } }; static HuffmanIncomingTable HuffmanIncoming_254 = { @@ -1869,4886 +285,271 @@ static HuffmanIncomingTable HuffmanIncoming_254 = { }; static HuffmanIncomingEntry HuffmanIncomingEntries_255_254[] = { - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 60, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 }, - { nullptr, 123, 1 } + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 92, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 195, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 208, 3 }, + { nullptr, 128, 4 }, + { nullptr, 128, 4 }, + { nullptr, 128, 4 }, + { nullptr, 128, 4 }, + { nullptr, 128, 4 }, + { nullptr, 128, 4 }, + { nullptr, 128, 4 }, + { nullptr, 128, 4 }, + { nullptr, 128, 4 }, + { nullptr, 128, 4 }, + { nullptr, 128, 4 }, + { nullptr, 128, 4 }, + { nullptr, 128, 4 }, + { nullptr, 128, 4 }, + { nullptr, 128, 4 }, + { nullptr, 128, 4 }, + { nullptr, 130, 4 }, + { nullptr, 130, 4 }, + { nullptr, 130, 4 }, + { nullptr, 130, 4 }, + { nullptr, 130, 4 }, + { nullptr, 130, 4 }, + { nullptr, 130, 4 }, + { nullptr, 130, 4 }, + { nullptr, 130, 4 }, + { nullptr, 130, 4 }, + { nullptr, 130, 4 }, + { nullptr, 130, 4 }, + { nullptr, 130, 4 }, + { nullptr, 130, 4 }, + { nullptr, 130, 4 }, + { nullptr, 130, 4 }, + { nullptr, 131, 4 }, + { nullptr, 131, 4 }, + { nullptr, 131, 4 }, + { nullptr, 131, 4 }, + { nullptr, 131, 4 }, + { nullptr, 131, 4 }, + { nullptr, 131, 4 }, + { nullptr, 131, 4 }, + { nullptr, 131, 4 }, + { nullptr, 131, 4 }, + { nullptr, 131, 4 }, + { nullptr, 131, 4 }, + { nullptr, 131, 4 }, + { nullptr, 131, 4 }, + { nullptr, 131, 4 }, + { nullptr, 131, 4 }, + { nullptr, 162, 4 }, + { nullptr, 162, 4 }, + { nullptr, 162, 4 }, + { nullptr, 162, 4 }, + { nullptr, 162, 4 }, + { nullptr, 162, 4 }, + { nullptr, 162, 4 }, + { nullptr, 162, 4 }, + { nullptr, 162, 4 }, + { nullptr, 162, 4 }, + { nullptr, 162, 4 }, + { nullptr, 162, 4 }, + { nullptr, 162, 4 }, + { nullptr, 162, 4 }, + { nullptr, 162, 4 }, + { nullptr, 162, 4 }, + { nullptr, 184, 4 }, + { nullptr, 184, 4 }, + { nullptr, 184, 4 }, + { nullptr, 184, 4 }, + { nullptr, 184, 4 }, + { nullptr, 184, 4 }, + { nullptr, 184, 4 }, + { nullptr, 184, 4 }, + { nullptr, 184, 4 }, + { nullptr, 184, 4 }, + { nullptr, 184, 4 }, + { nullptr, 184, 4 }, + { nullptr, 184, 4 }, + { nullptr, 184, 4 }, + { nullptr, 184, 4 }, + { nullptr, 184, 4 }, + { nullptr, 194, 4 }, + { nullptr, 194, 4 }, + { nullptr, 194, 4 }, + { nullptr, 194, 4 }, + { nullptr, 194, 4 }, + { nullptr, 194, 4 }, + { nullptr, 194, 4 }, + { nullptr, 194, 4 }, + { nullptr, 194, 4 }, + { nullptr, 194, 4 }, + { nullptr, 194, 4 }, + { nullptr, 194, 4 }, + { nullptr, 194, 4 }, + { nullptr, 194, 4 }, + { nullptr, 194, 4 }, + { nullptr, 194, 4 }, + { nullptr, 224, 4 }, + { nullptr, 224, 4 }, + { nullptr, 224, 4 }, + { nullptr, 224, 4 }, + { nullptr, 224, 4 }, + { nullptr, 224, 4 }, + { nullptr, 224, 4 }, + { nullptr, 224, 4 }, + { nullptr, 224, 4 }, + { nullptr, 224, 4 }, + { nullptr, 224, 4 }, + { nullptr, 224, 4 }, + { nullptr, 224, 4 }, + { nullptr, 224, 4 }, + { nullptr, 224, 4 }, + { nullptr, 224, 4 }, + { nullptr, 226, 4 }, + { nullptr, 226, 4 }, + { nullptr, 226, 4 }, + { nullptr, 226, 4 }, + { nullptr, 226, 4 }, + { nullptr, 226, 4 }, + { nullptr, 226, 4 }, + { nullptr, 226, 4 }, + { nullptr, 226, 4 }, + { nullptr, 226, 4 }, + { nullptr, 226, 4 }, + { nullptr, 226, 4 }, + { nullptr, 226, 4 }, + { nullptr, 226, 4 }, + { nullptr, 226, 4 }, + { nullptr, 226, 4 }, + { nullptr, 153, 5 }, + { nullptr, 153, 5 }, + { nullptr, 153, 5 }, + { nullptr, 153, 5 }, + { nullptr, 153, 5 }, + { nullptr, 153, 5 }, + { nullptr, 153, 5 }, + { nullptr, 153, 5 }, + { nullptr, 161, 5 }, + { nullptr, 161, 5 }, + { nullptr, 161, 5 }, + { nullptr, 161, 5 }, + { nullptr, 161, 5 }, + { nullptr, 161, 5 }, + { nullptr, 161, 5 }, + { nullptr, 161, 5 }, + { nullptr, 167, 5 }, + { nullptr, 167, 5 }, + { nullptr, 167, 5 }, + { nullptr, 167, 5 }, + { nullptr, 167, 5 }, + { nullptr, 167, 5 }, + { nullptr, 167, 5 }, + { nullptr, 167, 5 }, + { nullptr, 172, 5 }, + { nullptr, 172, 5 }, + { nullptr, 172, 5 }, + { nullptr, 172, 5 }, + { nullptr, 172, 5 }, + { nullptr, 172, 5 }, + { nullptr, 172, 5 }, + { nullptr, 172, 5 } }; static HuffmanIncomingTable HuffmanIncoming_255_254 = { HuffmanIncomingEntries_255_254, - 1 + 5 }; -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_192[] = { - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 164, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 }, - { nullptr, 165, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_192 = { - HuffmanIncomingEntries_255_255_192, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_193[] = { - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 166, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 }, - { nullptr, 167, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_193 = { - HuffmanIncomingEntries_255_255_193, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_194[] = { - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 168, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 }, - { nullptr, 169, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_194 = { - HuffmanIncomingEntries_255_255_194, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_195[] = { - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 170, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 }, - { nullptr, 171, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_195 = { - HuffmanIncomingEntries_255_255_195, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_196[] = { - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 172, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 }, - { nullptr, 173, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_196 = { - HuffmanIncomingEntries_255_255_196, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_197[] = { - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 174, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 }, - { nullptr, 175, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_197 = { - HuffmanIncomingEntries_255_255_197, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_198[] = { - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 176, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 }, - { nullptr, 177, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_198 = { - HuffmanIncomingEntries_255_255_198, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_199[] = { - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 178, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 }, - { nullptr, 179, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_199 = { - HuffmanIncomingEntries_255_255_199, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_200[] = { - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 180, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 }, - { nullptr, 181, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_200 = { - HuffmanIncomingEntries_255_255_200, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_201[] = { - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 182, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 }, - { nullptr, 183, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_201 = { - HuffmanIncomingEntries_255_255_201, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_202[] = { - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 184, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 }, - { nullptr, 185, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_202 = { - HuffmanIncomingEntries_255_255_202, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_203[] = { - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 186, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 }, - { nullptr, 187, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_203 = { - HuffmanIncomingEntries_255_255_203, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_204[] = { - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 188, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 }, - { nullptr, 189, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_204 = { - HuffmanIncomingEntries_255_255_204, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_205[] = { - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 190, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 }, - { nullptr, 191, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_205 = { - HuffmanIncomingEntries_255_255_205, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_206[] = { - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 192, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 }, - { nullptr, 193, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_206 = { - HuffmanIncomingEntries_255_255_206, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_207[] = { - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 194, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 }, - { nullptr, 195, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_207 = { - HuffmanIncomingEntries_255_255_207, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_208[] = { - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 196, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 }, - { nullptr, 197, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_208 = { - HuffmanIncomingEntries_255_255_208, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_209[] = { - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, - { nullptr, 198, 1 }, +static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_246[] = { + { nullptr, 199, 1 }, { nullptr, 199, 1 }, { nullptr, 199, 1 }, { nullptr, 199, 1 }, @@ -6876,935 +677,6 @@ static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_209[] = { { nullptr, 199, 1 }, { nullptr, 199, 1 }, { nullptr, 199, 1 }, - { nullptr, 199, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_209 = { - HuffmanIncomingEntries_255_255_209, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_210[] = { - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 200, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 }, - { nullptr, 201, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_210 = { - HuffmanIncomingEntries_255_255_210, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_211[] = { - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 202, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 }, - { nullptr, 203, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_211 = { - HuffmanIncomingEntries_255_255_211, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_212[] = { - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 204, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 }, - { nullptr, 205, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_212 = { - HuffmanIncomingEntries_255_255_212, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_213[] = { - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, - { nullptr, 206, 1 }, { nullptr, 207, 1 }, { nullptr, 207, 1 }, { nullptr, 207, 1 }, @@ -7935,3444 +807,12 @@ static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_213[] = { { nullptr, 207, 1 } }; -static HuffmanIncomingTable HuffmanIncoming_255_255_213 = { - HuffmanIncomingEntries_255_255_213, +static HuffmanIncomingTable HuffmanIncoming_255_255_246 = { + HuffmanIncomingEntries_255_255_246, 1 }; -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_214[] = { - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 208, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 }, - { nullptr, 209, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_214 = { - HuffmanIncomingEntries_255_255_214, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_215[] = { - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 210, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 }, - { nullptr, 211, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_215 = { - HuffmanIncomingEntries_255_255_215, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_216[] = { - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 212, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 }, - { nullptr, 213, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_216 = { - HuffmanIncomingEntries_255_255_216, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_217[] = { - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 214, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 }, - { nullptr, 215, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_217 = { - HuffmanIncomingEntries_255_255_217, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_218[] = { - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 216, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 }, - { nullptr, 217, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_218 = { - HuffmanIncomingEntries_255_255_218, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_219[] = { - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 218, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 }, - { nullptr, 219, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_219 = { - HuffmanIncomingEntries_255_255_219, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_220[] = { - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 220, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 }, - { nullptr, 221, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_220 = { - HuffmanIncomingEntries_255_255_220, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_221[] = { - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 222, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 }, - { nullptr, 223, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_221 = { - HuffmanIncomingEntries_255_255_221, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_222[] = { - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 224, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 }, - { nullptr, 225, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_222 = { - HuffmanIncomingEntries_255_255_222, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_223[] = { - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 226, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 }, - { nullptr, 227, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_223 = { - HuffmanIncomingEntries_255_255_223, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_224[] = { - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 228, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 }, - { nullptr, 229, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_224 = { - HuffmanIncomingEntries_255_255_224, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_225[] = { - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 230, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 }, - { nullptr, 231, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_225 = { - HuffmanIncomingEntries_255_255_225, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_226[] = { - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 232, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 }, - { nullptr, 233, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_226 = { - HuffmanIncomingEntries_255_255_226, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_227[] = { +static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_247[] = { { nullptr, 234, 1 }, { nullptr, 234, 1 }, { nullptr, 234, 1 }, @@ -11631,5548 +1071,268 @@ static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_227[] = { { nullptr, 235, 1 } }; -static HuffmanIncomingTable HuffmanIncoming_255_255_227 = { - HuffmanIncomingEntries_255_255_227, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_228[] = { - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 236, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 }, - { nullptr, 237, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_228 = { - HuffmanIncomingEntries_255_255_228, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_229[] = { - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 238, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 }, - { nullptr, 239, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_229 = { - HuffmanIncomingEntries_255_255_229, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_230[] = { - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 240, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 }, - { nullptr, 241, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_230 = { - HuffmanIncomingEntries_255_255_230, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_231[] = { - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 242, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 }, - { nullptr, 243, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_231 = { - HuffmanIncomingEntries_255_255_231, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_232[] = { - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 244, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 }, - { nullptr, 245, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_232 = { - HuffmanIncomingEntries_255_255_232, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_233[] = { - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 246, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 }, - { nullptr, 247, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_233 = { - HuffmanIncomingEntries_255_255_233, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_234[] = { - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 248, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 }, - { nullptr, 249, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_234 = { - HuffmanIncomingEntries_255_255_234, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_235[] = { - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 250, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 }, - { nullptr, 251, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_235 = { - HuffmanIncomingEntries_255_255_235, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_236[] = { - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 252, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 }, - { nullptr, 253, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_236 = { - HuffmanIncomingEntries_255_255_236, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_237[] = { - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 254, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 }, - { nullptr, 255, 1 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_237 = { - HuffmanIncomingEntries_255_255_237, - 1 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_238[] = { - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 256, 1 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 0, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 }, - { nullptr, 1, 2 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_238 = { - HuffmanIncomingEntries_255_255_238, - 2 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_239[] = { - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 2, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 3, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 4, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 }, - { nullptr, 5, 2 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_239 = { - HuffmanIncomingEntries_255_255_239, - 2 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_240[] = { - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 6, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 7, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 8, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 }, - { nullptr, 9, 2 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_240 = { - HuffmanIncomingEntries_255_255_240, - 2 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_241[] = { - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 10, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 11, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 12, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 }, - { nullptr, 13, 2 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_241 = { - HuffmanIncomingEntries_255_255_241, - 2 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_242[] = { - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 14, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 15, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 16, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 }, - { nullptr, 17, 2 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_242 = { - HuffmanIncomingEntries_255_255_242, - 2 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_243[] = { - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 18, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 19, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 20, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 }, - { nullptr, 21, 2 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_243 = { - HuffmanIncomingEntries_255_255_243, - 2 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_244[] = { - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 22, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 23, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 24, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 }, - { nullptr, 25, 2 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_244 = { - HuffmanIncomingEntries_255_255_244, - 2 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_245[] = { - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 26, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 27, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 28, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 }, - { nullptr, 29, 2 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_245 = { - HuffmanIncomingEntries_255_255_245, - 2 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_246[] = { - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 30, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 31, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 92, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 }, - { nullptr, 127, 2 } -}; - -static HuffmanIncomingTable HuffmanIncoming_255_255_246 = { - HuffmanIncomingEntries_255_255_246, - 2 -}; - -static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_247[] = { - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 128, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 129, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 130, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 }, - { nullptr, 131, 2 } -}; - static HuffmanIncomingTable HuffmanIncoming_255_255_247 = { HuffmanIncomingEntries_255_255_247, - 2 + 1 }; static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_248[] = { - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 132, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 133, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 134, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 }, - { nullptr, 135, 2 } + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 192, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 193, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 200, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 }, + { nullptr, 201, 2 } }; static HuffmanIncomingTable HuffmanIncoming_255_255_248 = { @@ -17181,262 +1341,262 @@ static HuffmanIncomingTable HuffmanIncoming_255_255_248 = { }; static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_249[] = { - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 136, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 137, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 138, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 }, - { nullptr, 139, 2 } + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 202, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 205, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 210, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 }, + { nullptr, 213, 2 } }; static HuffmanIncomingTable HuffmanIncoming_255_255_249 = { @@ -17445,262 +1605,262 @@ static HuffmanIncomingTable HuffmanIncoming_255_255_249 = { }; static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_250[] = { - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 140, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 141, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 142, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 }, - { nullptr, 143, 2 } + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 218, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 219, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 238, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 }, + { nullptr, 240, 2 } }; static HuffmanIncomingTable HuffmanIncoming_255_255_250 = { @@ -17709,1572 +1869,1572 @@ static HuffmanIncomingTable HuffmanIncoming_255_255_250 = { }; static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_251[] = { - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 144, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 145, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 146, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 }, - { nullptr, 147, 2 } + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 242, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 243, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 255, 2 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 203, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 }, + { nullptr, 204, 3 } }; static HuffmanIncomingTable HuffmanIncoming_255_255_251 = { HuffmanIncomingEntries_255_255_251, - 2 + 3 }; static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_252[] = { - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 148, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 149, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 150, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 }, - { nullptr, 151, 2 } + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 211, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 212, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 214, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 221, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 222, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 223, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 241, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 }, + { nullptr, 244, 3 } }; static HuffmanIncomingTable HuffmanIncoming_255_255_252 = { HuffmanIncomingEntries_255_255_252, - 2 + 3 }; static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_253[] = { - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 152, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 153, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 154, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 }, - { nullptr, 155, 2 } + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 245, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 246, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 247, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 248, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 250, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 251, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 252, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 }, + { nullptr, 253, 3 } }; static HuffmanIncomingTable HuffmanIncoming_255_255_253 = { HuffmanIncomingEntries_255_255_253, - 2 + 3 }; static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_254[] = { - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 156, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 157, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 158, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 }, - { nullptr, 159, 2 } + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 254, 3 }, + { nullptr, 2, 4 }, + { nullptr, 2, 4 }, + { nullptr, 2, 4 }, + { nullptr, 2, 4 }, + { nullptr, 2, 4 }, + { nullptr, 2, 4 }, + { nullptr, 2, 4 }, + { nullptr, 2, 4 }, + { nullptr, 2, 4 }, + { nullptr, 2, 4 }, + { nullptr, 2, 4 }, + { nullptr, 2, 4 }, + { nullptr, 2, 4 }, + { nullptr, 2, 4 }, + { nullptr, 2, 4 }, + { nullptr, 2, 4 }, + { nullptr, 3, 4 }, + { nullptr, 3, 4 }, + { nullptr, 3, 4 }, + { nullptr, 3, 4 }, + { nullptr, 3, 4 }, + { nullptr, 3, 4 }, + { nullptr, 3, 4 }, + { nullptr, 3, 4 }, + { nullptr, 3, 4 }, + { nullptr, 3, 4 }, + { nullptr, 3, 4 }, + { nullptr, 3, 4 }, + { nullptr, 3, 4 }, + { nullptr, 3, 4 }, + { nullptr, 3, 4 }, + { nullptr, 3, 4 }, + { nullptr, 4, 4 }, + { nullptr, 4, 4 }, + { nullptr, 4, 4 }, + { nullptr, 4, 4 }, + { nullptr, 4, 4 }, + { nullptr, 4, 4 }, + { nullptr, 4, 4 }, + { nullptr, 4, 4 }, + { nullptr, 4, 4 }, + { nullptr, 4, 4 }, + { nullptr, 4, 4 }, + { nullptr, 4, 4 }, + { nullptr, 4, 4 }, + { nullptr, 4, 4 }, + { nullptr, 4, 4 }, + { nullptr, 4, 4 }, + { nullptr, 5, 4 }, + { nullptr, 5, 4 }, + { nullptr, 5, 4 }, + { nullptr, 5, 4 }, + { nullptr, 5, 4 }, + { nullptr, 5, 4 }, + { nullptr, 5, 4 }, + { nullptr, 5, 4 }, + { nullptr, 5, 4 }, + { nullptr, 5, 4 }, + { nullptr, 5, 4 }, + { nullptr, 5, 4 }, + { nullptr, 5, 4 }, + { nullptr, 5, 4 }, + { nullptr, 5, 4 }, + { nullptr, 5, 4 }, + { nullptr, 6, 4 }, + { nullptr, 6, 4 }, + { nullptr, 6, 4 }, + { nullptr, 6, 4 }, + { nullptr, 6, 4 }, + { nullptr, 6, 4 }, + { nullptr, 6, 4 }, + { nullptr, 6, 4 }, + { nullptr, 6, 4 }, + { nullptr, 6, 4 }, + { nullptr, 6, 4 }, + { nullptr, 6, 4 }, + { nullptr, 6, 4 }, + { nullptr, 6, 4 }, + { nullptr, 6, 4 }, + { nullptr, 6, 4 }, + { nullptr, 7, 4 }, + { nullptr, 7, 4 }, + { nullptr, 7, 4 }, + { nullptr, 7, 4 }, + { nullptr, 7, 4 }, + { nullptr, 7, 4 }, + { nullptr, 7, 4 }, + { nullptr, 7, 4 }, + { nullptr, 7, 4 }, + { nullptr, 7, 4 }, + { nullptr, 7, 4 }, + { nullptr, 7, 4 }, + { nullptr, 7, 4 }, + { nullptr, 7, 4 }, + { nullptr, 7, 4 }, + { nullptr, 7, 4 }, + { nullptr, 8, 4 }, + { nullptr, 8, 4 }, + { nullptr, 8, 4 }, + { nullptr, 8, 4 }, + { nullptr, 8, 4 }, + { nullptr, 8, 4 }, + { nullptr, 8, 4 }, + { nullptr, 8, 4 }, + { nullptr, 8, 4 }, + { nullptr, 8, 4 }, + { nullptr, 8, 4 }, + { nullptr, 8, 4 }, + { nullptr, 8, 4 }, + { nullptr, 8, 4 }, + { nullptr, 8, 4 }, + { nullptr, 8, 4 }, + { nullptr, 11, 4 }, + { nullptr, 11, 4 }, + { nullptr, 11, 4 }, + { nullptr, 11, 4 }, + { nullptr, 11, 4 }, + { nullptr, 11, 4 }, + { nullptr, 11, 4 }, + { nullptr, 11, 4 }, + { nullptr, 11, 4 }, + { nullptr, 11, 4 }, + { nullptr, 11, 4 }, + { nullptr, 11, 4 }, + { nullptr, 11, 4 }, + { nullptr, 11, 4 }, + { nullptr, 11, 4 }, + { nullptr, 11, 4 }, + { nullptr, 12, 4 }, + { nullptr, 12, 4 }, + { nullptr, 12, 4 }, + { nullptr, 12, 4 }, + { nullptr, 12, 4 }, + { nullptr, 12, 4 }, + { nullptr, 12, 4 }, + { nullptr, 12, 4 }, + { nullptr, 12, 4 }, + { nullptr, 12, 4 }, + { nullptr, 12, 4 }, + { nullptr, 12, 4 }, + { nullptr, 12, 4 }, + { nullptr, 12, 4 }, + { nullptr, 12, 4 }, + { nullptr, 12, 4 }, + { nullptr, 14, 4 }, + { nullptr, 14, 4 }, + { nullptr, 14, 4 }, + { nullptr, 14, 4 }, + { nullptr, 14, 4 }, + { nullptr, 14, 4 }, + { nullptr, 14, 4 }, + { nullptr, 14, 4 }, + { nullptr, 14, 4 }, + { nullptr, 14, 4 }, + { nullptr, 14, 4 }, + { nullptr, 14, 4 }, + { nullptr, 14, 4 }, + { nullptr, 14, 4 }, + { nullptr, 14, 4 }, + { nullptr, 14, 4 }, + { nullptr, 15, 4 }, + { nullptr, 15, 4 }, + { nullptr, 15, 4 }, + { nullptr, 15, 4 }, + { nullptr, 15, 4 }, + { nullptr, 15, 4 }, + { nullptr, 15, 4 }, + { nullptr, 15, 4 }, + { nullptr, 15, 4 }, + { nullptr, 15, 4 }, + { nullptr, 15, 4 }, + { nullptr, 15, 4 }, + { nullptr, 15, 4 }, + { nullptr, 15, 4 }, + { nullptr, 15, 4 }, + { nullptr, 15, 4 }, + { nullptr, 16, 4 }, + { nullptr, 16, 4 }, + { nullptr, 16, 4 }, + { nullptr, 16, 4 }, + { nullptr, 16, 4 }, + { nullptr, 16, 4 }, + { nullptr, 16, 4 }, + { nullptr, 16, 4 }, + { nullptr, 16, 4 }, + { nullptr, 16, 4 }, + { nullptr, 16, 4 }, + { nullptr, 16, 4 }, + { nullptr, 16, 4 }, + { nullptr, 16, 4 }, + { nullptr, 16, 4 }, + { nullptr, 16, 4 }, + { nullptr, 17, 4 }, + { nullptr, 17, 4 }, + { nullptr, 17, 4 }, + { nullptr, 17, 4 }, + { nullptr, 17, 4 }, + { nullptr, 17, 4 }, + { nullptr, 17, 4 }, + { nullptr, 17, 4 }, + { nullptr, 17, 4 }, + { nullptr, 17, 4 }, + { nullptr, 17, 4 }, + { nullptr, 17, 4 }, + { nullptr, 17, 4 }, + { nullptr, 17, 4 }, + { nullptr, 17, 4 }, + { nullptr, 17, 4 }, + { nullptr, 18, 4 }, + { nullptr, 18, 4 }, + { nullptr, 18, 4 }, + { nullptr, 18, 4 }, + { nullptr, 18, 4 }, + { nullptr, 18, 4 }, + { nullptr, 18, 4 }, + { nullptr, 18, 4 }, + { nullptr, 18, 4 }, + { nullptr, 18, 4 }, + { nullptr, 18, 4 }, + { nullptr, 18, 4 }, + { nullptr, 18, 4 }, + { nullptr, 18, 4 }, + { nullptr, 18, 4 }, + { nullptr, 18, 4 } }; static HuffmanIncomingTable HuffmanIncoming_255_255_254 = { HuffmanIncomingEntries_255_255_254, - 2 + 4 }; static HuffmanIncomingEntry HuffmanIncomingEntries_255_255_255[] = { - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 160, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 161, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 162, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 }, - { nullptr, 163, 2 } + { nullptr, 19, 4 }, + { nullptr, 19, 4 }, + { nullptr, 19, 4 }, + { nullptr, 19, 4 }, + { nullptr, 19, 4 }, + { nullptr, 19, 4 }, + { nullptr, 19, 4 }, + { nullptr, 19, 4 }, + { nullptr, 19, 4 }, + { nullptr, 19, 4 }, + { nullptr, 19, 4 }, + { nullptr, 19, 4 }, + { nullptr, 19, 4 }, + { nullptr, 19, 4 }, + { nullptr, 19, 4 }, + { nullptr, 19, 4 }, + { nullptr, 20, 4 }, + { nullptr, 20, 4 }, + { nullptr, 20, 4 }, + { nullptr, 20, 4 }, + { nullptr, 20, 4 }, + { nullptr, 20, 4 }, + { nullptr, 20, 4 }, + { nullptr, 20, 4 }, + { nullptr, 20, 4 }, + { nullptr, 20, 4 }, + { nullptr, 20, 4 }, + { nullptr, 20, 4 }, + { nullptr, 20, 4 }, + { nullptr, 20, 4 }, + { nullptr, 20, 4 }, + { nullptr, 20, 4 }, + { nullptr, 21, 4 }, + { nullptr, 21, 4 }, + { nullptr, 21, 4 }, + { nullptr, 21, 4 }, + { nullptr, 21, 4 }, + { nullptr, 21, 4 }, + { nullptr, 21, 4 }, + { nullptr, 21, 4 }, + { nullptr, 21, 4 }, + { nullptr, 21, 4 }, + { nullptr, 21, 4 }, + { nullptr, 21, 4 }, + { nullptr, 21, 4 }, + { nullptr, 21, 4 }, + { nullptr, 21, 4 }, + { nullptr, 21, 4 }, + { nullptr, 23, 4 }, + { nullptr, 23, 4 }, + { nullptr, 23, 4 }, + { nullptr, 23, 4 }, + { nullptr, 23, 4 }, + { nullptr, 23, 4 }, + { nullptr, 23, 4 }, + { nullptr, 23, 4 }, + { nullptr, 23, 4 }, + { nullptr, 23, 4 }, + { nullptr, 23, 4 }, + { nullptr, 23, 4 }, + { nullptr, 23, 4 }, + { nullptr, 23, 4 }, + { nullptr, 23, 4 }, + { nullptr, 23, 4 }, + { nullptr, 24, 4 }, + { nullptr, 24, 4 }, + { nullptr, 24, 4 }, + { nullptr, 24, 4 }, + { nullptr, 24, 4 }, + { nullptr, 24, 4 }, + { nullptr, 24, 4 }, + { nullptr, 24, 4 }, + { nullptr, 24, 4 }, + { nullptr, 24, 4 }, + { nullptr, 24, 4 }, + { nullptr, 24, 4 }, + { nullptr, 24, 4 }, + { nullptr, 24, 4 }, + { nullptr, 24, 4 }, + { nullptr, 24, 4 }, + { nullptr, 25, 4 }, + { nullptr, 25, 4 }, + { nullptr, 25, 4 }, + { nullptr, 25, 4 }, + { nullptr, 25, 4 }, + { nullptr, 25, 4 }, + { nullptr, 25, 4 }, + { nullptr, 25, 4 }, + { nullptr, 25, 4 }, + { nullptr, 25, 4 }, + { nullptr, 25, 4 }, + { nullptr, 25, 4 }, + { nullptr, 25, 4 }, + { nullptr, 25, 4 }, + { nullptr, 25, 4 }, + { nullptr, 25, 4 }, + { nullptr, 26, 4 }, + { nullptr, 26, 4 }, + { nullptr, 26, 4 }, + { nullptr, 26, 4 }, + { nullptr, 26, 4 }, + { nullptr, 26, 4 }, + { nullptr, 26, 4 }, + { nullptr, 26, 4 }, + { nullptr, 26, 4 }, + { nullptr, 26, 4 }, + { nullptr, 26, 4 }, + { nullptr, 26, 4 }, + { nullptr, 26, 4 }, + { nullptr, 26, 4 }, + { nullptr, 26, 4 }, + { nullptr, 26, 4 }, + { nullptr, 27, 4 }, + { nullptr, 27, 4 }, + { nullptr, 27, 4 }, + { nullptr, 27, 4 }, + { nullptr, 27, 4 }, + { nullptr, 27, 4 }, + { nullptr, 27, 4 }, + { nullptr, 27, 4 }, + { nullptr, 27, 4 }, + { nullptr, 27, 4 }, + { nullptr, 27, 4 }, + { nullptr, 27, 4 }, + { nullptr, 27, 4 }, + { nullptr, 27, 4 }, + { nullptr, 27, 4 }, + { nullptr, 27, 4 }, + { nullptr, 28, 4 }, + { nullptr, 28, 4 }, + { nullptr, 28, 4 }, + { nullptr, 28, 4 }, + { nullptr, 28, 4 }, + { nullptr, 28, 4 }, + { nullptr, 28, 4 }, + { nullptr, 28, 4 }, + { nullptr, 28, 4 }, + { nullptr, 28, 4 }, + { nullptr, 28, 4 }, + { nullptr, 28, 4 }, + { nullptr, 28, 4 }, + { nullptr, 28, 4 }, + { nullptr, 28, 4 }, + { nullptr, 28, 4 }, + { nullptr, 29, 4 }, + { nullptr, 29, 4 }, + { nullptr, 29, 4 }, + { nullptr, 29, 4 }, + { nullptr, 29, 4 }, + { nullptr, 29, 4 }, + { nullptr, 29, 4 }, + { nullptr, 29, 4 }, + { nullptr, 29, 4 }, + { nullptr, 29, 4 }, + { nullptr, 29, 4 }, + { nullptr, 29, 4 }, + { nullptr, 29, 4 }, + { nullptr, 29, 4 }, + { nullptr, 29, 4 }, + { nullptr, 29, 4 }, + { nullptr, 30, 4 }, + { nullptr, 30, 4 }, + { nullptr, 30, 4 }, + { nullptr, 30, 4 }, + { nullptr, 30, 4 }, + { nullptr, 30, 4 }, + { nullptr, 30, 4 }, + { nullptr, 30, 4 }, + { nullptr, 30, 4 }, + { nullptr, 30, 4 }, + { nullptr, 30, 4 }, + { nullptr, 30, 4 }, + { nullptr, 30, 4 }, + { nullptr, 30, 4 }, + { nullptr, 30, 4 }, + { nullptr, 30, 4 }, + { nullptr, 31, 4 }, + { nullptr, 31, 4 }, + { nullptr, 31, 4 }, + { nullptr, 31, 4 }, + { nullptr, 31, 4 }, + { nullptr, 31, 4 }, + { nullptr, 31, 4 }, + { nullptr, 31, 4 }, + { nullptr, 31, 4 }, + { nullptr, 31, 4 }, + { nullptr, 31, 4 }, + { nullptr, 31, 4 }, + { nullptr, 31, 4 }, + { nullptr, 31, 4 }, + { nullptr, 31, 4 }, + { nullptr, 31, 4 }, + { nullptr, 127, 4 }, + { nullptr, 127, 4 }, + { nullptr, 127, 4 }, + { nullptr, 127, 4 }, + { nullptr, 127, 4 }, + { nullptr, 127, 4 }, + { nullptr, 127, 4 }, + { nullptr, 127, 4 }, + { nullptr, 127, 4 }, + { nullptr, 127, 4 }, + { nullptr, 127, 4 }, + { nullptr, 127, 4 }, + { nullptr, 127, 4 }, + { nullptr, 127, 4 }, + { nullptr, 127, 4 }, + { nullptr, 127, 4 }, + { nullptr, 220, 4 }, + { nullptr, 220, 4 }, + { nullptr, 220, 4 }, + { nullptr, 220, 4 }, + { nullptr, 220, 4 }, + { nullptr, 220, 4 }, + { nullptr, 220, 4 }, + { nullptr, 220, 4 }, + { nullptr, 220, 4 }, + { nullptr, 220, 4 }, + { nullptr, 220, 4 }, + { nullptr, 220, 4 }, + { nullptr, 220, 4 }, + { nullptr, 220, 4 }, + { nullptr, 220, 4 }, + { nullptr, 220, 4 }, + { nullptr, 249, 4 }, + { nullptr, 249, 4 }, + { nullptr, 249, 4 }, + { nullptr, 249, 4 }, + { nullptr, 249, 4 }, + { nullptr, 249, 4 }, + { nullptr, 249, 4 }, + { nullptr, 249, 4 }, + { nullptr, 249, 4 }, + { nullptr, 249, 4 }, + { nullptr, 249, 4 }, + { nullptr, 249, 4 }, + { nullptr, 249, 4 }, + { nullptr, 249, 4 }, + { nullptr, 249, 4 }, + { nullptr, 249, 4 }, + { nullptr, 10, 6 }, + { nullptr, 10, 6 }, + { nullptr, 10, 6 }, + { nullptr, 10, 6 }, + { nullptr, 13, 6 }, + { nullptr, 13, 6 }, + { nullptr, 13, 6 }, + { nullptr, 13, 6 }, + { nullptr, 22, 6 }, + { nullptr, 22, 6 }, + { nullptr, 22, 6 }, + { nullptr, 22, 6 }, + { nullptr, 256, 6 }, + { nullptr, 256, 6 }, + { nullptr, 256, 6 }, + { nullptr, 256, 6 } }; static HuffmanIncomingTable HuffmanIncoming_255_255_255 = { HuffmanIncomingEntries_255_255_255, - 2 + 6 }; static HuffmanIncomingEntry HuffmanIncomingEntries_255_255[] = { - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 125, 1 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { nullptr, 96, 2 }, - { &HuffmanIncoming_255_255_192, 0, 0 }, - { &HuffmanIncoming_255_255_193, 0, 0 }, - { &HuffmanIncoming_255_255_194, 0, 0 }, - { &HuffmanIncoming_255_255_195, 0, 0 }, - { &HuffmanIncoming_255_255_196, 0, 0 }, - { &HuffmanIncoming_255_255_197, 0, 0 }, - { &HuffmanIncoming_255_255_198, 0, 0 }, - { &HuffmanIncoming_255_255_199, 0, 0 }, - { &HuffmanIncoming_255_255_200, 0, 0 }, - { &HuffmanIncoming_255_255_201, 0, 0 }, - { &HuffmanIncoming_255_255_202, 0, 0 }, - { &HuffmanIncoming_255_255_203, 0, 0 }, - { &HuffmanIncoming_255_255_204, 0, 0 }, - { &HuffmanIncoming_255_255_205, 0, 0 }, - { &HuffmanIncoming_255_255_206, 0, 0 }, - { &HuffmanIncoming_255_255_207, 0, 0 }, - { &HuffmanIncoming_255_255_208, 0, 0 }, - { &HuffmanIncoming_255_255_209, 0, 0 }, - { &HuffmanIncoming_255_255_210, 0, 0 }, - { &HuffmanIncoming_255_255_211, 0, 0 }, - { &HuffmanIncoming_255_255_212, 0, 0 }, - { &HuffmanIncoming_255_255_213, 0, 0 }, - { &HuffmanIncoming_255_255_214, 0, 0 }, - { &HuffmanIncoming_255_255_215, 0, 0 }, - { &HuffmanIncoming_255_255_216, 0, 0 }, - { &HuffmanIncoming_255_255_217, 0, 0 }, - { &HuffmanIncoming_255_255_218, 0, 0 }, - { &HuffmanIncoming_255_255_219, 0, 0 }, - { &HuffmanIncoming_255_255_220, 0, 0 }, - { &HuffmanIncoming_255_255_221, 0, 0 }, - { &HuffmanIncoming_255_255_222, 0, 0 }, - { &HuffmanIncoming_255_255_223, 0, 0 }, - { &HuffmanIncoming_255_255_224, 0, 0 }, - { &HuffmanIncoming_255_255_225, 0, 0 }, - { &HuffmanIncoming_255_255_226, 0, 0 }, - { &HuffmanIncoming_255_255_227, 0, 0 }, - { &HuffmanIncoming_255_255_228, 0, 0 }, - { &HuffmanIncoming_255_255_229, 0, 0 }, - { &HuffmanIncoming_255_255_230, 0, 0 }, - { &HuffmanIncoming_255_255_231, 0, 0 }, - { &HuffmanIncoming_255_255_232, 0, 0 }, - { &HuffmanIncoming_255_255_233, 0, 0 }, - { &HuffmanIncoming_255_255_234, 0, 0 }, - { &HuffmanIncoming_255_255_235, 0, 0 }, - { &HuffmanIncoming_255_255_236, 0, 0 }, - { &HuffmanIncoming_255_255_237, 0, 0 }, - { &HuffmanIncoming_255_255_238, 0, 0 }, - { &HuffmanIncoming_255_255_239, 0, 0 }, - { &HuffmanIncoming_255_255_240, 0, 0 }, - { &HuffmanIncoming_255_255_241, 0, 0 }, - { &HuffmanIncoming_255_255_242, 0, 0 }, - { &HuffmanIncoming_255_255_243, 0, 0 }, - { &HuffmanIncoming_255_255_244, 0, 0 }, - { &HuffmanIncoming_255_255_245, 0, 0 }, + { nullptr, 176, 5 }, + { nullptr, 176, 5 }, + { nullptr, 176, 5 }, + { nullptr, 176, 5 }, + { nullptr, 176, 5 }, + { nullptr, 176, 5 }, + { nullptr, 176, 5 }, + { nullptr, 176, 5 }, + { nullptr, 177, 5 }, + { nullptr, 177, 5 }, + { nullptr, 177, 5 }, + { nullptr, 177, 5 }, + { nullptr, 177, 5 }, + { nullptr, 177, 5 }, + { nullptr, 177, 5 }, + { nullptr, 177, 5 }, + { nullptr, 179, 5 }, + { nullptr, 179, 5 }, + { nullptr, 179, 5 }, + { nullptr, 179, 5 }, + { nullptr, 179, 5 }, + { nullptr, 179, 5 }, + { nullptr, 179, 5 }, + { nullptr, 179, 5 }, + { nullptr, 209, 5 }, + { nullptr, 209, 5 }, + { nullptr, 209, 5 }, + { nullptr, 209, 5 }, + { nullptr, 209, 5 }, + { nullptr, 209, 5 }, + { nullptr, 209, 5 }, + { nullptr, 209, 5 }, + { nullptr, 216, 5 }, + { nullptr, 216, 5 }, + { nullptr, 216, 5 }, + { nullptr, 216, 5 }, + { nullptr, 216, 5 }, + { nullptr, 216, 5 }, + { nullptr, 216, 5 }, + { nullptr, 216, 5 }, + { nullptr, 217, 5 }, + { nullptr, 217, 5 }, + { nullptr, 217, 5 }, + { nullptr, 217, 5 }, + { nullptr, 217, 5 }, + { nullptr, 217, 5 }, + { nullptr, 217, 5 }, + { nullptr, 217, 5 }, + { nullptr, 227, 5 }, + { nullptr, 227, 5 }, + { nullptr, 227, 5 }, + { nullptr, 227, 5 }, + { nullptr, 227, 5 }, + { nullptr, 227, 5 }, + { nullptr, 227, 5 }, + { nullptr, 227, 5 }, + { nullptr, 229, 5 }, + { nullptr, 229, 5 }, + { nullptr, 229, 5 }, + { nullptr, 229, 5 }, + { nullptr, 229, 5 }, + { nullptr, 229, 5 }, + { nullptr, 229, 5 }, + { nullptr, 229, 5 }, + { nullptr, 230, 5 }, + { nullptr, 230, 5 }, + { nullptr, 230, 5 }, + { nullptr, 230, 5 }, + { nullptr, 230, 5 }, + { nullptr, 230, 5 }, + { nullptr, 230, 5 }, + { nullptr, 230, 5 }, + { nullptr, 129, 6 }, + { nullptr, 129, 6 }, + { nullptr, 129, 6 }, + { nullptr, 129, 6 }, + { nullptr, 132, 6 }, + { nullptr, 132, 6 }, + { nullptr, 132, 6 }, + { nullptr, 132, 6 }, + { nullptr, 133, 6 }, + { nullptr, 133, 6 }, + { nullptr, 133, 6 }, + { nullptr, 133, 6 }, + { nullptr, 134, 6 }, + { nullptr, 134, 6 }, + { nullptr, 134, 6 }, + { nullptr, 134, 6 }, + { nullptr, 136, 6 }, + { nullptr, 136, 6 }, + { nullptr, 136, 6 }, + { nullptr, 136, 6 }, + { nullptr, 146, 6 }, + { nullptr, 146, 6 }, + { nullptr, 146, 6 }, + { nullptr, 146, 6 }, + { nullptr, 154, 6 }, + { nullptr, 154, 6 }, + { nullptr, 154, 6 }, + { nullptr, 154, 6 }, + { nullptr, 156, 6 }, + { nullptr, 156, 6 }, + { nullptr, 156, 6 }, + { nullptr, 156, 6 }, + { nullptr, 160, 6 }, + { nullptr, 160, 6 }, + { nullptr, 160, 6 }, + { nullptr, 160, 6 }, + { nullptr, 163, 6 }, + { nullptr, 163, 6 }, + { nullptr, 163, 6 }, + { nullptr, 163, 6 }, + { nullptr, 164, 6 }, + { nullptr, 164, 6 }, + { nullptr, 164, 6 }, + { nullptr, 164, 6 }, + { nullptr, 169, 6 }, + { nullptr, 169, 6 }, + { nullptr, 169, 6 }, + { nullptr, 169, 6 }, + { nullptr, 170, 6 }, + { nullptr, 170, 6 }, + { nullptr, 170, 6 }, + { nullptr, 170, 6 }, + { nullptr, 173, 6 }, + { nullptr, 173, 6 }, + { nullptr, 173, 6 }, + { nullptr, 173, 6 }, + { nullptr, 178, 6 }, + { nullptr, 178, 6 }, + { nullptr, 178, 6 }, + { nullptr, 178, 6 }, + { nullptr, 181, 6 }, + { nullptr, 181, 6 }, + { nullptr, 181, 6 }, + { nullptr, 181, 6 }, + { nullptr, 185, 6 }, + { nullptr, 185, 6 }, + { nullptr, 185, 6 }, + { nullptr, 185, 6 }, + { nullptr, 186, 6 }, + { nullptr, 186, 6 }, + { nullptr, 186, 6 }, + { nullptr, 186, 6 }, + { nullptr, 187, 6 }, + { nullptr, 187, 6 }, + { nullptr, 187, 6 }, + { nullptr, 187, 6 }, + { nullptr, 189, 6 }, + { nullptr, 189, 6 }, + { nullptr, 189, 6 }, + { nullptr, 189, 6 }, + { nullptr, 190, 6 }, + { nullptr, 190, 6 }, + { nullptr, 190, 6 }, + { nullptr, 190, 6 }, + { nullptr, 196, 6 }, + { nullptr, 196, 6 }, + { nullptr, 196, 6 }, + { nullptr, 196, 6 }, + { nullptr, 198, 6 }, + { nullptr, 198, 6 }, + { nullptr, 198, 6 }, + { nullptr, 198, 6 }, + { nullptr, 228, 6 }, + { nullptr, 228, 6 }, + { nullptr, 228, 6 }, + { nullptr, 228, 6 }, + { nullptr, 232, 6 }, + { nullptr, 232, 6 }, + { nullptr, 232, 6 }, + { nullptr, 232, 6 }, + { nullptr, 233, 6 }, + { nullptr, 233, 6 }, + { nullptr, 233, 6 }, + { nullptr, 233, 6 }, + { nullptr, 1, 7 }, + { nullptr, 1, 7 }, + { nullptr, 135, 7 }, + { nullptr, 135, 7 }, + { nullptr, 137, 7 }, + { nullptr, 137, 7 }, + { nullptr, 138, 7 }, + { nullptr, 138, 7 }, + { nullptr, 139, 7 }, + { nullptr, 139, 7 }, + { nullptr, 140, 7 }, + { nullptr, 140, 7 }, + { nullptr, 141, 7 }, + { nullptr, 141, 7 }, + { nullptr, 143, 7 }, + { nullptr, 143, 7 }, + { nullptr, 147, 7 }, + { nullptr, 147, 7 }, + { nullptr, 149, 7 }, + { nullptr, 149, 7 }, + { nullptr, 150, 7 }, + { nullptr, 150, 7 }, + { nullptr, 151, 7 }, + { nullptr, 151, 7 }, + { nullptr, 152, 7 }, + { nullptr, 152, 7 }, + { nullptr, 155, 7 }, + { nullptr, 155, 7 }, + { nullptr, 157, 7 }, + { nullptr, 157, 7 }, + { nullptr, 158, 7 }, + { nullptr, 158, 7 }, + { nullptr, 165, 7 }, + { nullptr, 165, 7 }, + { nullptr, 166, 7 }, + { nullptr, 166, 7 }, + { nullptr, 168, 7 }, + { nullptr, 168, 7 }, + { nullptr, 174, 7 }, + { nullptr, 174, 7 }, + { nullptr, 175, 7 }, + { nullptr, 175, 7 }, + { nullptr, 180, 7 }, + { nullptr, 180, 7 }, + { nullptr, 182, 7 }, + { nullptr, 182, 7 }, + { nullptr, 183, 7 }, + { nullptr, 183, 7 }, + { nullptr, 188, 7 }, + { nullptr, 188, 7 }, + { nullptr, 191, 7 }, + { nullptr, 191, 7 }, + { nullptr, 197, 7 }, + { nullptr, 197, 7 }, + { nullptr, 231, 7 }, + { nullptr, 231, 7 }, + { nullptr, 239, 7 }, + { nullptr, 239, 7 }, + { nullptr, 9, 8 }, + { nullptr, 142, 8 }, + { nullptr, 144, 8 }, + { nullptr, 145, 8 }, + { nullptr, 148, 8 }, + { nullptr, 159, 8 }, + { nullptr, 171, 8 }, + { nullptr, 206, 8 }, + { nullptr, 215, 8 }, + { nullptr, 225, 8 }, + { nullptr, 236, 8 }, + { nullptr, 237, 8 }, { &HuffmanIncoming_255_255_246, 0, 0 }, { &HuffmanIncoming_255_255_247, 0, 0 }, { &HuffmanIncoming_255_255_248, 0, 0 }, @@ -19289,74 +3449,10 @@ static HuffmanIncomingEntry HuffmanIncomingEntries_255_255[] = { static HuffmanIncomingTable HuffmanIncoming_255_255 = { HuffmanIncomingEntries_255_255, - 2 + 8 }; static HuffmanIncomingEntry HuffmanIncomingEntries_255[] = { - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, - { nullptr, 43, 2 }, { nullptr, 63, 2 }, { nullptr, 63, 2 }, { nullptr, 63, 2 }, @@ -19421,132 +3517,196 @@ static HuffmanIncomingEntry HuffmanIncomingEntries_255[] = { { nullptr, 63, 2 }, { nullptr, 63, 2 }, { nullptr, 63, 2 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 91, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 93, 3 }, - { nullptr, 124, 4 }, - { nullptr, 124, 4 }, - { nullptr, 124, 4 }, - { nullptr, 124, 4 }, - { nullptr, 124, 4 }, - { nullptr, 124, 4 }, - { nullptr, 124, 4 }, - { nullptr, 124, 4 }, - { nullptr, 124, 4 }, - { nullptr, 124, 4 }, - { nullptr, 124, 4 }, - { nullptr, 124, 4 }, - { nullptr, 124, 4 }, - { nullptr, 124, 4 }, - { nullptr, 124, 4 }, - { nullptr, 124, 4 }, - { nullptr, 126, 4 }, - { nullptr, 126, 4 }, - { nullptr, 126, 4 }, - { nullptr, 126, 4 }, - { nullptr, 126, 4 }, - { nullptr, 126, 4 }, - { nullptr, 126, 4 }, - { nullptr, 126, 4 }, - { nullptr, 126, 4 }, - { nullptr, 126, 4 }, - { nullptr, 126, 4 }, - { nullptr, 126, 4 }, - { nullptr, 126, 4 }, - { nullptr, 126, 4 }, - { nullptr, 126, 4 }, - { nullptr, 126, 4 }, - { nullptr, 33, 5 }, - { nullptr, 33, 5 }, - { nullptr, 33, 5 }, - { nullptr, 33, 5 }, - { nullptr, 33, 5 }, - { nullptr, 33, 5 }, - { nullptr, 33, 5 }, - { nullptr, 33, 5 }, - { nullptr, 39, 5 }, - { nullptr, 39, 5 }, - { nullptr, 39, 5 }, - { nullptr, 39, 5 }, - { nullptr, 39, 5 }, - { nullptr, 39, 5 }, - { nullptr, 39, 5 }, - { nullptr, 39, 5 }, - { nullptr, 35, 6 }, - { nullptr, 35, 6 }, - { nullptr, 35, 6 }, - { nullptr, 35, 6 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 39, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 43, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 124, 3 }, + { nullptr, 35, 4 }, + { nullptr, 35, 4 }, + { nullptr, 35, 4 }, + { nullptr, 35, 4 }, + { nullptr, 35, 4 }, + { nullptr, 35, 4 }, + { nullptr, 35, 4 }, + { nullptr, 35, 4 }, + { nullptr, 35, 4 }, + { nullptr, 35, 4 }, + { nullptr, 35, 4 }, + { nullptr, 35, 4 }, + { nullptr, 35, 4 }, + { nullptr, 35, 4 }, + { nullptr, 35, 4 }, + { nullptr, 35, 4 }, + { nullptr, 62, 4 }, + { nullptr, 62, 4 }, + { nullptr, 62, 4 }, + { nullptr, 62, 4 }, + { nullptr, 62, 4 }, + { nullptr, 62, 4 }, + { nullptr, 62, 4 }, + { nullptr, 62, 4 }, + { nullptr, 62, 4 }, + { nullptr, 62, 4 }, + { nullptr, 62, 4 }, + { nullptr, 62, 4 }, + { nullptr, 62, 4 }, + { nullptr, 62, 4 }, + { nullptr, 62, 4 }, + { nullptr, 62, 4 }, + { nullptr, 0, 5 }, + { nullptr, 0, 5 }, + { nullptr, 0, 5 }, + { nullptr, 0, 5 }, + { nullptr, 0, 5 }, + { nullptr, 0, 5 }, + { nullptr, 0, 5 }, + { nullptr, 0, 5 }, + { nullptr, 36, 5 }, + { nullptr, 36, 5 }, + { nullptr, 36, 5 }, + { nullptr, 36, 5 }, + { nullptr, 36, 5 }, + { nullptr, 36, 5 }, + { nullptr, 36, 5 }, + { nullptr, 36, 5 }, + { nullptr, 64, 5 }, + { nullptr, 64, 5 }, + { nullptr, 64, 5 }, + { nullptr, 64, 5 }, + { nullptr, 64, 5 }, + { nullptr, 64, 5 }, + { nullptr, 64, 5 }, + { nullptr, 64, 5 }, + { nullptr, 91, 5 }, + { nullptr, 91, 5 }, + { nullptr, 91, 5 }, + { nullptr, 91, 5 }, + { nullptr, 91, 5 }, + { nullptr, 91, 5 }, + { nullptr, 91, 5 }, + { nullptr, 91, 5 }, + { nullptr, 93, 5 }, + { nullptr, 93, 5 }, + { nullptr, 93, 5 }, + { nullptr, 93, 5 }, + { nullptr, 93, 5 }, + { nullptr, 93, 5 }, + { nullptr, 93, 5 }, + { nullptr, 93, 5 }, + { nullptr, 126, 5 }, + { nullptr, 126, 5 }, + { nullptr, 126, 5 }, + { nullptr, 126, 5 }, + { nullptr, 126, 5 }, + { nullptr, 126, 5 }, + { nullptr, 126, 5 }, + { nullptr, 126, 5 }, { nullptr, 94, 6 }, { nullptr, 94, 6 }, { nullptr, 94, 6 }, { nullptr, 94, 6 }, - { nullptr, 36, 7 }, - { nullptr, 36, 7 }, - { nullptr, 62, 7 }, - { nullptr, 62, 7 }, - { nullptr, 64, 7 }, - { nullptr, 64, 7 }, + { nullptr, 125, 6 }, + { nullptr, 125, 6 }, + { nullptr, 125, 6 }, + { nullptr, 125, 6 }, + { nullptr, 60, 7 }, + { nullptr, 60, 7 }, + { nullptr, 96, 7 }, + { nullptr, 96, 7 }, + { nullptr, 123, 7 }, + { nullptr, 123, 7 }, { &HuffmanIncoming_255_254, 0, 0 }, { &HuffmanIncoming_255_255, 0, 0 } }; @@ -19557,78 +3717,30 @@ static HuffmanIncomingTable HuffmanIncoming_255 = { }; static HuffmanIncomingEntry HuffmanIncomingEntriesRoot[] = { - { nullptr, 48, 4 }, - { nullptr, 48, 4 }, - { nullptr, 48, 4 }, - { nullptr, 48, 4 }, - { nullptr, 48, 4 }, - { nullptr, 48, 4 }, - { nullptr, 48, 4 }, - { nullptr, 48, 4 }, - { nullptr, 48, 4 }, - { nullptr, 48, 4 }, - { nullptr, 48, 4 }, - { nullptr, 48, 4 }, - { nullptr, 48, 4 }, - { nullptr, 48, 4 }, - { nullptr, 48, 4 }, - { nullptr, 48, 4 }, - { nullptr, 49, 4 }, - { nullptr, 49, 4 }, - { nullptr, 49, 4 }, - { nullptr, 49, 4 }, - { nullptr, 49, 4 }, - { nullptr, 49, 4 }, - { nullptr, 49, 4 }, - { nullptr, 49, 4 }, - { nullptr, 49, 4 }, - { nullptr, 49, 4 }, - { nullptr, 49, 4 }, - { nullptr, 49, 4 }, - { nullptr, 49, 4 }, - { nullptr, 49, 4 }, - { nullptr, 49, 4 }, - { nullptr, 49, 4 }, - { nullptr, 50, 4 }, - { nullptr, 50, 4 }, - { nullptr, 50, 4 }, - { nullptr, 50, 4 }, - { nullptr, 50, 4 }, - { nullptr, 50, 4 }, - { nullptr, 50, 4 }, - { nullptr, 50, 4 }, - { nullptr, 50, 4 }, - { nullptr, 50, 4 }, - { nullptr, 50, 4 }, - { nullptr, 50, 4 }, - { nullptr, 50, 4 }, - { nullptr, 50, 4 }, - { nullptr, 50, 4 }, - { nullptr, 50, 4 }, - { nullptr, 32, 5 }, - { nullptr, 32, 5 }, - { nullptr, 32, 5 }, - { nullptr, 32, 5 }, - { nullptr, 32, 5 }, - { nullptr, 32, 5 }, - { nullptr, 32, 5 }, - { nullptr, 32, 5 }, - { nullptr, 47, 5 }, - { nullptr, 47, 5 }, - { nullptr, 47, 5 }, - { nullptr, 47, 5 }, - { nullptr, 47, 5 }, - { nullptr, 47, 5 }, - { nullptr, 47, 5 }, - { nullptr, 47, 5 }, - { nullptr, 51, 5 }, - { nullptr, 51, 5 }, - { nullptr, 51, 5 }, - { nullptr, 51, 5 }, - { nullptr, 51, 5 }, - { nullptr, 51, 5 }, - { nullptr, 51, 5 }, - { nullptr, 51, 5 }, + { nullptr, 48, 5 }, + { nullptr, 48, 5 }, + { nullptr, 48, 5 }, + { nullptr, 48, 5 }, + { nullptr, 48, 5 }, + { nullptr, 48, 5 }, + { nullptr, 48, 5 }, + { nullptr, 48, 5 }, + { nullptr, 49, 5 }, + { nullptr, 49, 5 }, + { nullptr, 49, 5 }, + { nullptr, 49, 5 }, + { nullptr, 49, 5 }, + { nullptr, 49, 5 }, + { nullptr, 49, 5 }, + { nullptr, 49, 5 }, + { nullptr, 50, 5 }, + { nullptr, 50, 5 }, + { nullptr, 50, 5 }, + { nullptr, 50, 5 }, + { nullptr, 50, 5 }, + { nullptr, 50, 5 }, + { nullptr, 50, 5 }, + { nullptr, 50, 5 }, { nullptr, 97, 5 }, { nullptr, 97, 5 }, { nullptr, 97, 5 }, @@ -19669,6 +3781,14 @@ static HuffmanIncomingEntry HuffmanIncomingEntriesRoot[] = { { nullptr, 111, 5 }, { nullptr, 111, 5 }, { nullptr, 111, 5 }, + { nullptr, 115, 5 }, + { nullptr, 115, 5 }, + { nullptr, 115, 5 }, + { nullptr, 115, 5 }, + { nullptr, 115, 5 }, + { nullptr, 115, 5 }, + { nullptr, 115, 5 }, + { nullptr, 115, 5 }, { nullptr, 116, 5 }, { nullptr, 116, 5 }, { nullptr, 116, 5 }, @@ -19677,14 +3797,30 @@ static HuffmanIncomingEntry HuffmanIncomingEntriesRoot[] = { { nullptr, 116, 5 }, { nullptr, 116, 5 }, { nullptr, 116, 5 }, + { nullptr, 32, 6 }, + { nullptr, 32, 6 }, + { nullptr, 32, 6 }, + { nullptr, 32, 6 }, { nullptr, 37, 6 }, { nullptr, 37, 6 }, { nullptr, 37, 6 }, { nullptr, 37, 6 }, + { nullptr, 45, 6 }, + { nullptr, 45, 6 }, + { nullptr, 45, 6 }, + { nullptr, 45, 6 }, { nullptr, 46, 6 }, { nullptr, 46, 6 }, { nullptr, 46, 6 }, { nullptr, 46, 6 }, + { nullptr, 47, 6 }, + { nullptr, 47, 6 }, + { nullptr, 47, 6 }, + { nullptr, 47, 6 }, + { nullptr, 51, 6 }, + { nullptr, 51, 6 }, + { nullptr, 51, 6 }, + { nullptr, 51, 6 }, { nullptr, 52, 6 }, { nullptr, 52, 6 }, { nullptr, 52, 6 }, @@ -19709,22 +3845,30 @@ static HuffmanIncomingEntry HuffmanIncomingEntriesRoot[] = { { nullptr, 57, 6 }, { nullptr, 57, 6 }, { nullptr, 57, 6 }, - { nullptr, 58, 6 }, - { nullptr, 58, 6 }, - { nullptr, 58, 6 }, - { nullptr, 58, 6 }, { nullptr, 61, 6 }, { nullptr, 61, 6 }, { nullptr, 61, 6 }, { nullptr, 61, 6 }, - { nullptr, 84, 6 }, - { nullptr, 84, 6 }, - { nullptr, 84, 6 }, - { nullptr, 84, 6 }, + { nullptr, 65, 6 }, + { nullptr, 65, 6 }, + { nullptr, 65, 6 }, + { nullptr, 65, 6 }, + { nullptr, 95, 6 }, + { nullptr, 95, 6 }, + { nullptr, 95, 6 }, + { nullptr, 95, 6 }, + { nullptr, 98, 6 }, + { nullptr, 98, 6 }, + { nullptr, 98, 6 }, + { nullptr, 98, 6 }, { nullptr, 100, 6 }, { nullptr, 100, 6 }, { nullptr, 100, 6 }, { nullptr, 100, 6 }, + { nullptr, 102, 6 }, + { nullptr, 102, 6 }, + { nullptr, 102, 6 }, + { nullptr, 102, 6 }, { nullptr, 103, 6 }, { nullptr, 103, 6 }, { nullptr, 103, 6 }, @@ -19753,38 +3897,64 @@ static HuffmanIncomingEntry HuffmanIncomingEntriesRoot[] = { { nullptr, 114, 6 }, { nullptr, 114, 6 }, { nullptr, 114, 6 }, - { nullptr, 115, 6 }, - { nullptr, 115, 6 }, - { nullptr, 115, 6 }, - { nullptr, 115, 6 }, - { nullptr, 38, 7 }, - { nullptr, 38, 7 }, - { nullptr, 44, 7 }, - { nullptr, 44, 7 }, - { nullptr, 45, 7 }, - { nullptr, 45, 7 }, - { nullptr, 65, 7 }, - { nullptr, 65, 7 }, + { nullptr, 117, 6 }, + { nullptr, 117, 6 }, + { nullptr, 117, 6 }, + { nullptr, 117, 6 }, + { nullptr, 58, 7 }, + { nullptr, 58, 7 }, + { nullptr, 66, 7 }, + { nullptr, 66, 7 }, + { nullptr, 67, 7 }, + { nullptr, 67, 7 }, { nullptr, 68, 7 }, { nullptr, 68, 7 }, + { nullptr, 69, 7 }, + { nullptr, 69, 7 }, { nullptr, 70, 7 }, { nullptr, 70, 7 }, { nullptr, 71, 7 }, { nullptr, 71, 7 }, + { nullptr, 72, 7 }, + { nullptr, 72, 7 }, + { nullptr, 73, 7 }, + { nullptr, 73, 7 }, + { nullptr, 74, 7 }, + { nullptr, 74, 7 }, + { nullptr, 75, 7 }, + { nullptr, 75, 7 }, + { nullptr, 76, 7 }, + { nullptr, 76, 7 }, { nullptr, 77, 7 }, { nullptr, 77, 7 }, { nullptr, 78, 7 }, { nullptr, 78, 7 }, + { nullptr, 79, 7 }, + { nullptr, 79, 7 }, + { nullptr, 80, 7 }, + { nullptr, 80, 7 }, + { nullptr, 81, 7 }, + { nullptr, 81, 7 }, + { nullptr, 82, 7 }, + { nullptr, 82, 7 }, { nullptr, 83, 7 }, { nullptr, 83, 7 }, - { nullptr, 95, 7 }, - { nullptr, 95, 7 }, - { nullptr, 98, 7 }, - { nullptr, 98, 7 }, - { nullptr, 102, 7 }, - { nullptr, 102, 7 }, - { nullptr, 117, 7 }, - { nullptr, 117, 7 }, + { nullptr, 84, 7 }, + { nullptr, 84, 7 }, + { nullptr, 85, 7 }, + { nullptr, 85, 7 }, + { nullptr, 86, 7 }, + { nullptr, 86, 7 }, + { nullptr, 87, 7 }, + { nullptr, 87, 7 }, + { nullptr, 89, 7 }, + { nullptr, 89, 7 }, + { nullptr, 106, 7 }, + { nullptr, 106, 7 }, + { nullptr, 107, 7 }, + { nullptr, 107, 7 }, + { nullptr, 113, 7 }, + { nullptr, 113, 7 }, { nullptr, 118, 7 }, { nullptr, 118, 7 }, { nullptr, 119, 7 }, @@ -19793,24 +3963,14 @@ static HuffmanIncomingEntry HuffmanIncomingEntriesRoot[] = { { nullptr, 120, 7 }, { nullptr, 121, 7 }, { nullptr, 121, 7 }, + { nullptr, 122, 7 }, + { nullptr, 122, 7 }, + { nullptr, 38, 8 }, + { nullptr, 42, 8 }, + { nullptr, 44, 8 }, { nullptr, 59, 8 }, - { nullptr, 66, 8 }, - { nullptr, 67, 8 }, - { nullptr, 69, 8 }, - { nullptr, 73, 8 }, - { nullptr, 79, 8 }, - { nullptr, 80, 8 }, - { nullptr, 85, 8 }, { nullptr, 88, 8 }, - { nullptr, 106, 8 }, - { nullptr, 107, 8 }, - { nullptr, 122, 8 }, - { &HuffmanIncoming_248, 0, 0 }, - { &HuffmanIncoming_249, 0, 0 }, - { &HuffmanIncoming_250, 0, 0 }, - { &HuffmanIncoming_251, 0, 0 }, - { &HuffmanIncoming_252, 0, 0 }, - { &HuffmanIncoming_253, 0, 0 }, + { nullptr, 90, 8 }, { &HuffmanIncoming_254, 0, 0 }, { &HuffmanIncoming_255, 0, 0 } }; diff --git a/netwerk/protocol/http/Http2HuffmanOutgoing.h b/netwerk/protocol/http/Http2HuffmanOutgoing.h index 5d51f76888c6..ba59e6bd5a9c 100644 --- a/netwerk/protocol/http/Http2HuffmanOutgoing.h +++ b/netwerk/protocol/http/Http2HuffmanOutgoing.h @@ -13,263 +13,263 @@ struct HuffmanOutgoingEntry { }; static HuffmanOutgoingEntry HuffmanOutgoing[] = { - { 0x03ffffba, 26 }, - { 0x03ffffbb, 26 }, - { 0x03ffffbc, 26 }, - { 0x03ffffbd, 26 }, - { 0x03ffffbe, 26 }, - { 0x03ffffbf, 26 }, - { 0x03ffffc0, 26 }, - { 0x03ffffc1, 26 }, - { 0x03ffffc2, 26 }, - { 0x03ffffc3, 26 }, - { 0x03ffffc4, 26 }, - { 0x03ffffc5, 26 }, - { 0x03ffffc6, 26 }, - { 0x03ffffc7, 26 }, - { 0x03ffffc8, 26 }, - { 0x03ffffc9, 26 }, - { 0x03ffffca, 26 }, - { 0x03ffffcb, 26 }, - { 0x03ffffcc, 26 }, - { 0x03ffffcd, 26 }, - { 0x03ffffce, 26 }, - { 0x03ffffcf, 26 }, - { 0x03ffffd0, 26 }, - { 0x03ffffd1, 26 }, - { 0x03ffffd2, 26 }, - { 0x03ffffd3, 26 }, - { 0x03ffffd4, 26 }, - { 0x03ffffd5, 26 }, - { 0x03ffffd6, 26 }, - { 0x03ffffd7, 26 }, - { 0x03ffffd8, 26 }, - { 0x03ffffd9, 26 }, - { 0x00000006, 5 }, - { 0x00001ffc, 13 }, - { 0x000001f0, 9 }, - { 0x00003ffc, 14 }, - { 0x00007ffc, 15 }, - { 0x0000001e, 6 }, - { 0x00000064, 7 }, - { 0x00001ffd, 13 }, + { 0x00001ff8, 13 }, + { 0x007fffd8, 23 }, + { 0x0fffffe2, 28 }, + { 0x0fffffe3, 28 }, + { 0x0fffffe4, 28 }, + { 0x0fffffe5, 28 }, + { 0x0fffffe6, 28 }, + { 0x0fffffe7, 28 }, + { 0x0fffffe8, 28 }, + { 0x00ffffea, 24 }, + { 0x3ffffffc, 30 }, + { 0x0fffffe9, 28 }, + { 0x0fffffea, 28 }, + { 0x3ffffffd, 30 }, + { 0x0fffffeb, 28 }, + { 0x0fffffec, 28 }, + { 0x0fffffed, 28 }, + { 0x0fffffee, 28 }, + { 0x0fffffef, 28 }, + { 0x0ffffff0, 28 }, + { 0x0ffffff1, 28 }, + { 0x0ffffff2, 28 }, + { 0x3ffffffe, 30 }, + { 0x0ffffff3, 28 }, + { 0x0ffffff4, 28 }, + { 0x0ffffff5, 28 }, + { 0x0ffffff6, 28 }, + { 0x0ffffff7, 28 }, + { 0x0ffffff8, 28 }, + { 0x0ffffff9, 28 }, + { 0x0ffffffa, 28 }, + { 0x0ffffffb, 28 }, + { 0x00000014, 6 }, + { 0x000003f8, 10 }, + { 0x000003f9, 10 }, + { 0x00000ffa, 12 }, + { 0x00001ff9, 13 }, + { 0x00000015, 6 }, + { 0x000000f8, 8 }, + { 0x000007fa, 11 }, { 0x000003fa, 10 }, - { 0x000001f1, 9 }, { 0x000003fb, 10 }, + { 0x000000f9, 8 }, + { 0x000007fb, 11 }, + { 0x000000fa, 8 }, + { 0x00000016, 6 }, + { 0x00000017, 6 }, + { 0x00000018, 6 }, + { 0x00000000, 5 }, + { 0x00000001, 5 }, + { 0x00000002, 5 }, + { 0x00000019, 6 }, + { 0x0000001a, 6 }, + { 0x0000001b, 6 }, + { 0x0000001c, 6 }, + { 0x0000001d, 6 }, + { 0x0000001e, 6 }, + { 0x0000001f, 6 }, + { 0x0000005c, 7 }, + { 0x000000fb, 8 }, + { 0x00007ffc, 15 }, + { 0x00000020, 6 }, + { 0x00000ffb, 12 }, { 0x000003fc, 10 }, + { 0x00001ffa, 13 }, + { 0x00000021, 6 }, + { 0x0000005d, 7 }, + { 0x0000005e, 7 }, + { 0x0000005f, 7 }, + { 0x00000060, 7 }, + { 0x00000061, 7 }, + { 0x00000062, 7 }, + { 0x00000063, 7 }, + { 0x00000064, 7 }, { 0x00000065, 7 }, { 0x00000066, 7 }, - { 0x0000001f, 6 }, - { 0x00000007, 5 }, - { 0x00000000, 4 }, - { 0x00000001, 4 }, - { 0x00000002, 4 }, - { 0x00000008, 5 }, - { 0x00000020, 6 }, - { 0x00000021, 6 }, - { 0x00000022, 6 }, - { 0x00000023, 6 }, - { 0x00000024, 6 }, - { 0x00000025, 6 }, - { 0x00000026, 6 }, - { 0x000000ec, 8 }, - { 0x0001fffc, 17 }, - { 0x00000027, 6 }, - { 0x00007ffd, 15 }, - { 0x000003fd, 10 }, - { 0x00007ffe, 15 }, { 0x00000067, 7 }, - { 0x000000ed, 8 }, - { 0x000000ee, 8 }, { 0x00000068, 7 }, - { 0x000000ef, 8 }, { 0x00000069, 7 }, { 0x0000006a, 7 }, - { 0x000001f2, 9 }, - { 0x000000f0, 8 }, - { 0x000001f3, 9 }, - { 0x000001f4, 9 }, - { 0x000001f5, 9 }, { 0x0000006b, 7 }, { 0x0000006c, 7 }, - { 0x000000f1, 8 }, - { 0x000000f2, 8 }, - { 0x000001f6, 9 }, - { 0x000001f7, 9 }, { 0x0000006d, 7 }, - { 0x00000028, 6 }, - { 0x000000f3, 8 }, - { 0x000001f8, 9 }, - { 0x000001f9, 9 }, - { 0x000000f4, 8 }, - { 0x000001fa, 9 }, - { 0x000001fb, 9 }, - { 0x000007fc, 11 }, - { 0x03ffffda, 26 }, - { 0x000007fd, 11 }, - { 0x00003ffd, 14 }, { 0x0000006e, 7 }, - { 0x0003fffe, 18 }, - { 0x00000009, 5 }, { 0x0000006f, 7 }, - { 0x0000000a, 5 }, - { 0x00000029, 6 }, - { 0x0000000b, 5 }, { 0x00000070, 7 }, - { 0x0000002a, 6 }, - { 0x0000002b, 6 }, - { 0x0000000c, 5 }, - { 0x000000f5, 8 }, - { 0x000000f6, 8 }, - { 0x0000002c, 6 }, - { 0x0000002d, 6 }, - { 0x0000002e, 6 }, - { 0x0000000d, 5 }, - { 0x0000002f, 6 }, - { 0x000001fc, 9 }, - { 0x00000030, 6 }, - { 0x00000031, 6 }, - { 0x0000000e, 5 }, { 0x00000071, 7 }, { 0x00000072, 7 }, + { 0x000000fc, 8 }, { 0x00000073, 7 }, + { 0x000000fd, 8 }, + { 0x00001ffb, 13 }, + { 0x0007fff0, 19 }, + { 0x00001ffc, 13 }, + { 0x00003ffc, 14 }, + { 0x00000022, 6 }, + { 0x00007ffd, 15 }, + { 0x00000003, 5 }, + { 0x00000023, 6 }, + { 0x00000004, 5 }, + { 0x00000024, 6 }, + { 0x00000005, 5 }, + { 0x00000025, 6 }, + { 0x00000026, 6 }, + { 0x00000027, 6 }, + { 0x00000006, 5 }, { 0x00000074, 7 }, { 0x00000075, 7 }, - { 0x000000f7, 8 }, - { 0x0001fffd, 17 }, - { 0x00000ffc, 12 }, - { 0x0001fffe, 17 }, - { 0x00000ffd, 12 }, - { 0x03ffffdb, 26 }, - { 0x03ffffdc, 26 }, - { 0x03ffffdd, 26 }, - { 0x03ffffde, 26 }, - { 0x03ffffdf, 26 }, + { 0x00000028, 6 }, + { 0x00000029, 6 }, + { 0x0000002a, 6 }, + { 0x00000007, 5 }, + { 0x0000002b, 6 }, + { 0x00000076, 7 }, + { 0x0000002c, 6 }, + { 0x00000008, 5 }, + { 0x00000009, 5 }, + { 0x0000002d, 6 }, + { 0x00000077, 7 }, + { 0x00000078, 7 }, + { 0x00000079, 7 }, + { 0x0000007a, 7 }, + { 0x0000007b, 7 }, + { 0x00007ffe, 15 }, + { 0x000007fc, 11 }, + { 0x00003ffd, 14 }, + { 0x00001ffd, 13 }, + { 0x0ffffffc, 28 }, + { 0x000fffe6, 20 }, + { 0x003fffd2, 22 }, + { 0x000fffe7, 20 }, + { 0x000fffe8, 20 }, + { 0x003fffd3, 22 }, + { 0x003fffd4, 22 }, + { 0x003fffd5, 22 }, + { 0x007fffd9, 23 }, + { 0x003fffd6, 22 }, + { 0x007fffda, 23 }, + { 0x007fffdb, 23 }, + { 0x007fffdc, 23 }, + { 0x007fffdd, 23 }, + { 0x007fffde, 23 }, + { 0x00ffffeb, 24 }, + { 0x007fffdf, 23 }, + { 0x00ffffec, 24 }, + { 0x00ffffed, 24 }, + { 0x003fffd7, 22 }, + { 0x007fffe0, 23 }, + { 0x00ffffee, 24 }, + { 0x007fffe1, 23 }, + { 0x007fffe2, 23 }, + { 0x007fffe3, 23 }, + { 0x007fffe4, 23 }, + { 0x001fffdc, 21 }, + { 0x003fffd8, 22 }, + { 0x007fffe5, 23 }, + { 0x003fffd9, 22 }, + { 0x007fffe6, 23 }, + { 0x007fffe7, 23 }, + { 0x00ffffef, 24 }, + { 0x003fffda, 22 }, + { 0x001fffdd, 21 }, + { 0x000fffe9, 20 }, + { 0x003fffdb, 22 }, + { 0x003fffdc, 22 }, + { 0x007fffe8, 23 }, + { 0x007fffe9, 23 }, + { 0x001fffde, 21 }, + { 0x007fffea, 23 }, + { 0x003fffdd, 22 }, + { 0x003fffde, 22 }, + { 0x00fffff0, 24 }, + { 0x001fffdf, 21 }, + { 0x003fffdf, 22 }, + { 0x007fffeb, 23 }, + { 0x007fffec, 23 }, + { 0x001fffe0, 21 }, + { 0x001fffe1, 21 }, + { 0x003fffe0, 22 }, + { 0x001fffe2, 21 }, + { 0x007fffed, 23 }, + { 0x003fffe1, 22 }, + { 0x007fffee, 23 }, + { 0x007fffef, 23 }, + { 0x000fffea, 20 }, + { 0x003fffe2, 22 }, + { 0x003fffe3, 22 }, + { 0x003fffe4, 22 }, + { 0x007ffff0, 23 }, + { 0x003fffe5, 22 }, + { 0x003fffe6, 22 }, + { 0x007ffff1, 23 }, { 0x03ffffe0, 26 }, { 0x03ffffe1, 26 }, + { 0x000fffeb, 20 }, + { 0x0007fff1, 19 }, + { 0x003fffe7, 22 }, + { 0x007ffff2, 23 }, + { 0x003fffe8, 22 }, + { 0x01ffffec, 25 }, { 0x03ffffe2, 26 }, { 0x03ffffe3, 26 }, { 0x03ffffe4, 26 }, + { 0x07ffffde, 27 }, + { 0x07ffffdf, 27 }, { 0x03ffffe5, 26 }, + { 0x00fffff1, 24 }, + { 0x01ffffed, 25 }, + { 0x0007fff2, 19 }, + { 0x001fffe3, 21 }, { 0x03ffffe6, 26 }, + { 0x07ffffe0, 27 }, + { 0x07ffffe1, 27 }, { 0x03ffffe7, 26 }, + { 0x07ffffe2, 27 }, + { 0x00fffff2, 24 }, + { 0x001fffe4, 21 }, + { 0x001fffe5, 21 }, { 0x03ffffe8, 26 }, { 0x03ffffe9, 26 }, + { 0x0ffffffd, 28 }, + { 0x07ffffe3, 27 }, + { 0x07ffffe4, 27 }, + { 0x07ffffe5, 27 }, + { 0x000fffec, 20 }, + { 0x00fffff3, 24 }, + { 0x000fffed, 20 }, + { 0x001fffe6, 21 }, + { 0x003fffe9, 22 }, + { 0x001fffe7, 21 }, + { 0x001fffe8, 21 }, + { 0x007ffff3, 23 }, + { 0x003fffea, 22 }, + { 0x003fffeb, 22 }, + { 0x01ffffee, 25 }, + { 0x01ffffef, 25 }, + { 0x00fffff4, 24 }, + { 0x00fffff5, 24 }, { 0x03ffffea, 26 }, + { 0x007ffff4, 23 }, { 0x03ffffeb, 26 }, + { 0x07ffffe6, 27 }, { 0x03ffffec, 26 }, { 0x03ffffed, 26 }, + { 0x07ffffe7, 27 }, + { 0x07ffffe8, 27 }, + { 0x07ffffe9, 27 }, + { 0x07ffffea, 27 }, + { 0x07ffffeb, 27 }, + { 0x0ffffffe, 28 }, + { 0x07ffffec, 27 }, + { 0x07ffffed, 27 }, + { 0x07ffffee, 27 }, + { 0x07ffffef, 27 }, + { 0x07fffff0, 27 }, { 0x03ffffee, 26 }, - { 0x03ffffef, 26 }, - { 0x03fffff0, 26 }, - { 0x03fffff1, 26 }, - { 0x03fffff2, 26 }, - { 0x03fffff3, 26 }, - { 0x03fffff4, 26 }, - { 0x03fffff5, 26 }, - { 0x03fffff6, 26 }, - { 0x03fffff7, 26 }, - { 0x03fffff8, 26 }, - { 0x03fffff9, 26 }, - { 0x03fffffa, 26 }, - { 0x03fffffb, 26 }, - { 0x03fffffc, 26 }, - { 0x03fffffd, 26 }, - { 0x03fffffe, 26 }, - { 0x03ffffff, 26 }, - { 0x01ffff80, 25 }, - { 0x01ffff81, 25 }, - { 0x01ffff82, 25 }, - { 0x01ffff83, 25 }, - { 0x01ffff84, 25 }, - { 0x01ffff85, 25 }, - { 0x01ffff86, 25 }, - { 0x01ffff87, 25 }, - { 0x01ffff88, 25 }, - { 0x01ffff89, 25 }, - { 0x01ffff8a, 25 }, - { 0x01ffff8b, 25 }, - { 0x01ffff8c, 25 }, - { 0x01ffff8d, 25 }, - { 0x01ffff8e, 25 }, - { 0x01ffff8f, 25 }, - { 0x01ffff90, 25 }, - { 0x01ffff91, 25 }, - { 0x01ffff92, 25 }, - { 0x01ffff93, 25 }, - { 0x01ffff94, 25 }, - { 0x01ffff95, 25 }, - { 0x01ffff96, 25 }, - { 0x01ffff97, 25 }, - { 0x01ffff98, 25 }, - { 0x01ffff99, 25 }, - { 0x01ffff9a, 25 }, - { 0x01ffff9b, 25 }, - { 0x01ffff9c, 25 }, - { 0x01ffff9d, 25 }, - { 0x01ffff9e, 25 }, - { 0x01ffff9f, 25 }, - { 0x01ffffa0, 25 }, - { 0x01ffffa1, 25 }, - { 0x01ffffa2, 25 }, - { 0x01ffffa3, 25 }, - { 0x01ffffa4, 25 }, - { 0x01ffffa5, 25 }, - { 0x01ffffa6, 25 }, - { 0x01ffffa7, 25 }, - { 0x01ffffa8, 25 }, - { 0x01ffffa9, 25 }, - { 0x01ffffaa, 25 }, - { 0x01ffffab, 25 }, - { 0x01ffffac, 25 }, - { 0x01ffffad, 25 }, - { 0x01ffffae, 25 }, - { 0x01ffffaf, 25 }, - { 0x01ffffb0, 25 }, - { 0x01ffffb1, 25 }, - { 0x01ffffb2, 25 }, - { 0x01ffffb3, 25 }, - { 0x01ffffb4, 25 }, - { 0x01ffffb5, 25 }, - { 0x01ffffb6, 25 }, - { 0x01ffffb7, 25 }, - { 0x01ffffb8, 25 }, - { 0x01ffffb9, 25 }, - { 0x01ffffba, 25 }, - { 0x01ffffbb, 25 }, - { 0x01ffffbc, 25 }, - { 0x01ffffbd, 25 }, - { 0x01ffffbe, 25 }, - { 0x01ffffbf, 25 }, - { 0x01ffffc0, 25 }, - { 0x01ffffc1, 25 }, - { 0x01ffffc2, 25 }, - { 0x01ffffc3, 25 }, - { 0x01ffffc4, 25 }, - { 0x01ffffc5, 25 }, - { 0x01ffffc6, 25 }, - { 0x01ffffc7, 25 }, - { 0x01ffffc8, 25 }, - { 0x01ffffc9, 25 }, - { 0x01ffffca, 25 }, - { 0x01ffffcb, 25 }, - { 0x01ffffcc, 25 }, - { 0x01ffffcd, 25 }, - { 0x01ffffce, 25 }, - { 0x01ffffcf, 25 }, - { 0x01ffffd0, 25 }, - { 0x01ffffd1, 25 }, - { 0x01ffffd2, 25 }, - { 0x01ffffd3, 25 }, - { 0x01ffffd4, 25 }, - { 0x01ffffd5, 25 }, - { 0x01ffffd6, 25 }, - { 0x01ffffd7, 25 }, - { 0x01ffffd8, 25 }, - { 0x01ffffd9, 25 }, - { 0x01ffffda, 25 }, - { 0x01ffffdb, 25 }, - { 0x01ffffdc, 25 } + { 0x3fffffff, 30 } }; } // namespace net diff --git a/netwerk/protocol/http/Http2Session.cpp b/netwerk/protocol/http/Http2Session.cpp index dce10e886566..dd06f04fd7a9 100644 --- a/netwerk/protocol/http/Http2Session.cpp +++ b/netwerk/protocol/http/Http2Session.cpp @@ -134,6 +134,17 @@ CopyAsNetwork32(charType dest, // where to store it template void CopyAsNetwork32(char *dest, uint32_t number); template void CopyAsNetwork32(uint8_t *dest, uint32_t number); +template static void +CopyAsNetwork16(charType dest, // where to store it + uint16_t number) // the 16 bit number in native format +{ + number = PR_htons(number); + memcpy(dest, &number, sizeof(number)); +} + +template void CopyAsNetwork16(char *dest, uint16_t number); +template void CopyAsNetwork16(uint8_t *dest, uint16_t number); + PLDHashOperator Http2Session::ShutdownEnumerator(nsAHttpTransaction *key, nsAutoPtr &stream, @@ -242,9 +253,7 @@ static Http2ControlFx sControlFunctions[] = { Http2Session::RecvPing, Http2Session::RecvGoAway, Http2Session::RecvWindowUpdate, - Http2Session::RecvContinuation, - Http2Session::RecvAltSvc, - Http2Session::RecvBlocked + Http2Session::RecvContinuation }; bool @@ -599,9 +608,7 @@ Http2Session::CreateFrameHeader(charType dest, uint16_t frameLength, MOZ_ASSERT(frameLength <= kMaxFrameData, "framelength too large"); MOZ_ASSERT(!(streamID & 0x80000000)); - frameLength = PR_htons(frameLength); - - memcpy(dest, &frameLength, 2); + CopyAsNetwork16(dest, frameLength); dest[2] = frameType; dest[3] = frameFlags; CopyAsNetwork32(dest + 4, streamID); @@ -771,10 +778,10 @@ Http2Session::SendHello() MOZ_ASSERT(PR_GetCurrentThread() == gSocketThread); LOG3(("Http2Session::SendHello %p\n", this)); - // sized for magic + 2 settings and a session window update to follow - // 24 magic, 23 for settings (8 header + 3 settings @5), 12 for window update - static const uint32_t maxSettings = 4; - static const uint32_t maxDataLen = 24 + 8 + maxSettings * 5 + 12; + // sized for magic + 3 settings and a session window update to follow + // 24 magic, 26 for settings (8 header + 3 settings @6), 12 for window update + static const uint32_t maxSettings = 3; + static const uint32_t maxDataLen = 24 + 8 + maxSettings * 6 + 12; char *packet = EnsureOutputBuffer(maxDataLen); memcpy(packet, kMagicHello, 24); mOutputQueueUsed += 24; @@ -787,37 +794,30 @@ Http2Session::SendHello() uint8_t numberOfEntries = 0; // entries need to be listed in order by ID - // 1st entry is bytes 8 to 12 - // 2nd entry is bytes 13 to 17 - // 3rd entry is bytes 18 to 22 - // 4th entry is bytes 23 to 17 + // 1st entry is bytes 8 to 13 + // 2nd entry is bytes 14 to 19 + // 3rd entry is bytes 20 to 25 if (!gHttpHandler->AllowPush()) { // If we don't support push then set MAX_CONCURRENT to 0 and also // set ENABLE_PUSH to 0 - packet[8 + 5 * numberOfEntries] = SETTINGS_TYPE_ENABLE_PUSH; + CopyAsNetwork16(packet + 8 + (6 * numberOfEntries), SETTINGS_TYPE_ENABLE_PUSH); // The value portion of the setting pair is already initialized to 0 numberOfEntries++; - packet[8 + 5 * numberOfEntries] = SETTINGS_TYPE_MAX_CONCURRENT; + CopyAsNetwork16(packet + 8 + (6 * numberOfEntries), SETTINGS_TYPE_MAX_CONCURRENT); // The value portion of the setting pair is already initialized to 0 numberOfEntries++; } // Advertise the Push RWIN for the session, and on each new pull stream // send a window update with END_FLOW_CONTROL - packet[8 + 5 * numberOfEntries] = SETTINGS_TYPE_INITIAL_WINDOW; - CopyAsNetwork32(packet + 9 + 5 * numberOfEntries, mPushAllowance); - numberOfEntries++; - - // Explicitly signal that we do NOT support compressed data frames, even - // though the default is to not support anyway. - packet[8 + 5 * numberOfEntries] = SETTINGS_TYPE_COMPRESS_DATA; - // The value portion of the setting pair is already initialized to 0 + CopyAsNetwork16(packet + 8 + (6 * numberOfEntries), SETTINGS_TYPE_INITIAL_WINDOW); + CopyAsNetwork32(packet + 8 + (6 * numberOfEntries) + 2, mPushAllowance); numberOfEntries++; MOZ_ASSERT(numberOfEntries <= maxSettings); - uint32_t dataLen = 5 * numberOfEntries; + uint32_t dataLen = 6 * numberOfEntries; CreateFrameHeader(packet, dataLen, FRAME_TYPE_SETTINGS, 0, 0); mOutputQueueUsed += 8 + dataLen; @@ -1035,16 +1035,9 @@ Http2Session::SetInputFrameDataStream(uint32_t streamID) nsresult Http2Session::ParsePadding(uint8_t &paddingControlBytes, uint16_t &paddingLength) { - if (mInputFrameFlags & kFlag_PAD_HIGH) { - uint8_t paddingHighValue = *reinterpret_cast(mInputFrameBuffer + 8); - paddingLength = static_cast(paddingHighValue) * 256; - ++paddingControlBytes; - } - - if (mInputFrameFlags & kFlag_PAD_LOW) { - uint8_t paddingLowValue = *reinterpret_cast(mInputFrameBuffer + 8 + paddingControlBytes); - paddingLength += paddingLowValue; - ++paddingControlBytes; + if (mInputFrameFlags & kFlag_PADDED) { + paddingLength = *reinterpret_cast(mInputFrameBuffer + 8); + paddingControlBytes = 1; } if (paddingLength > mInputFrameDataSize) { @@ -1063,6 +1056,8 @@ Http2Session::RecvHeaders(Http2Session *self) { MOZ_ASSERT(self->mInputFrameType == FRAME_TYPE_HEADERS); + bool isContinuation = self->mExpectedHeaderID != 0; + // If this doesn't have END_HEADERS set on it then require the next // frame to be HEADERS of the same ID bool endHeadersFlag = self->mInputFrameFlags & kFlag_END_HEADERS; @@ -1082,22 +1077,24 @@ Http2Session::RecvHeaders(Http2Session *self) // header data from the frame. uint16_t paddingLength = 0; uint8_t paddingControlBytes = 0; + nsresult rv; - nsresult rv = self->ParsePadding(paddingControlBytes, paddingLength); - if (NS_FAILED(rv)) { - return rv; + if (!isContinuation) { + rv = self->ParsePadding(paddingControlBytes, paddingLength); + if (NS_FAILED(rv)) { + return rv; + } } LOG3(("Http2Session::RecvHeaders %p stream 0x%X priorityLen=%d stream=%p " "end_stream=%d end_headers=%d priority_group=%d " - "paddingLength=%d pad_high_flag=%d pad_low_flag=%d\n", + "paddingLength=%d padded=%d\n", self, self->mInputFrameID, priorityLen, self->mInputFrameDataStream, self->mInputFrameFlags & kFlag_END_STREAM, self->mInputFrameFlags & kFlag_END_HEADERS, self->mInputFrameFlags & kFlag_PRIORITY, paddingLength, - self->mInputFrameFlags & kFlag_PAD_HIGH, - self->mInputFrameFlags & kFlag_PAD_LOW)); + self->mInputFrameFlags & kFlag_PADDED)); if (!self->mInputFrameDataStream) { // Cannot find stream. We can continue the session, but we need to @@ -1299,15 +1296,15 @@ Http2Session::RecvSettings(Http2Session *self) RETURN_SESSION_ERROR(self, PROTOCOL_ERROR); } - if (self->mInputFrameDataSize % 5) { - // Number of Settings is determined by dividing by each 5 byte setting - // entry. So the payload must be a multiple of 5. + if (self->mInputFrameDataSize % 6) { + // Number of Settings is determined by dividing by each 6 byte setting + // entry. So the payload must be a multiple of 6. LOG3(("Http2Session::RecvSettings %p SETTINGS wrong length data=%d", self, self->mInputFrameDataSize)); RETURN_SESSION_ERROR(self, PROTOCOL_ERROR); } - uint32_t numEntries = self->mInputFrameDataSize / 5; + uint32_t numEntries = self->mInputFrameDataSize / 6; LOG3(("Http2Session::RecvSettings %p SETTINGS Control Frame " "with %d entries ack=%X", self, numEntries, self->mInputFrameFlags & kFlag_ACK)); @@ -1319,11 +1316,11 @@ Http2Session::RecvSettings(Http2Session *self) for (uint32_t index = 0; index < numEntries; ++index) { uint8_t *setting = reinterpret_cast - (self->mInputFrameBuffer.get()) + 8 + index * 5; + (self->mInputFrameBuffer.get()) + 8 + index * 6; - uint8_t id = setting[0]; - uint32_t value = PR_ntohl(*reinterpret_cast(setting + 1)); - LOG3(("Settings ID %d, Value %d", id, value)); + uint16_t id = PR_ntohs(*reinterpret_cast(setting)); + uint32_t value = PR_ntohl(*reinterpret_cast(setting + 2)); + LOG3(("Settings ID %u, Value %u", id, value)); switch (id) { @@ -1355,11 +1352,6 @@ Http2Session::RecvSettings(Http2Session *self) } break; - case SETTINGS_TYPE_COMPRESS_DATA: - LOG3(("Received DATA compression setting: %d\n", value)); - // nop - break; - default: break; } @@ -1382,10 +1374,6 @@ Http2Session::RecvPushPromise(Http2Session *self) // header data from the frame. uint16_t paddingLength = 0; uint8_t paddingControlBytes = 0; - nsresult rv = self->ParsePadding(paddingControlBytes, paddingLength); - if (NS_FAILED(rv)) { - return rv; - } // If this doesn't have END_PUSH_PROMISE set on it then require the next // frame to be PUSH_PROMISE of the same ID @@ -1396,6 +1384,10 @@ Http2Session::RecvPushPromise(Http2Session *self) promiseLen = 0; // really a continuation frame promisedID = self->mContinuedPromiseStream; } else { + nsresult rv = self->ParsePadding(paddingControlBytes, paddingLength); + if (NS_FAILED(rv)) { + return rv; + } promiseLen = 4; promisedID = PR_ntohl(*reinterpret_cast(self->mInputFrameBuffer.get() + 8 + paddingControlBytes)); @@ -1422,10 +1414,9 @@ Http2Session::RecvPushPromise(Http2Session *self) } LOG3(("Http2Session::RecvPushPromise %p ID 0x%X assoc ID 0x%X " - "paddingLength %d pad_high_flag %d pad_low_flag %d.\n", + "paddingLength %d padded %d\n", self, promisedID, associatedID, paddingLength, - self->mInputFrameFlags & kFlag_PAD_HIGH, - self->mInputFrameFlags & kFlag_PAD_LOW)); + self->mInputFrameFlags & kFlag_PADDED)); if (!associatedID || !promisedID || (promisedID & 1)) { LOG3(("Http2Session::RecvPushPromise %p ID invalid.\n", self)); @@ -1433,7 +1424,7 @@ Http2Session::RecvPushPromise(Http2Session *self) } // confirm associated-to - rv = self->SetInputFrameDataStream(associatedID); + nsresult rv = self->SetInputFrameDataStream(associatedID); if (NS_FAILED(rv)) return rv; @@ -1799,33 +1790,6 @@ Http2Session::RecvContinuation(Http2Session *self) return RecvPushPromise(self); } -nsresult -Http2Session::RecvAltSvc(Http2Session *self) -{ - MOZ_ASSERT(self->mInputFrameType == FRAME_TYPE_ALTSVC); - LOG3(("Http2Session::RecvAltSvc %p Flags 0x%X id 0x%X\n", self, - self->mInputFrameFlags, self->mInputFrameID)); - - // For now, we don't do anything with ALTSVC frames - self->ResetDownstreamState(); - return NS_OK; -} - -nsresult -Http2Session::RecvBlocked(Http2Session *self) -{ - MOZ_ASSERT(self->mInputFrameType == FRAME_TYPE_BLOCKED); - LOG3(("Http2Session::RecvBlocked %p id 0x%X\n", self, self->mInputFrameID)); - - if (self->mInputFrameDataSize) { - RETURN_SESSION_ERROR(self, FRAME_SIZE_ERROR); - } - - // Logging is all we do with BLOCKED for now - self->ResetDownstreamState(); - return NS_OK; -} - //----------------------------------------------------------------------------- // nsAHttpTransaction. It is expected that nsHttpConnection is the caller // of these methods @@ -1999,12 +1963,6 @@ Http2Session::ReadyToProcessDataFrame(enum internalStateType newState) RETURN_SESSION_ERROR(this, PROTOCOL_ERROR); } - if (mInputFrameFlags & kFlag_COMPRESSED) { - LOG3(("Http2Session::ReadyToProcessDataFrame %p streamID 0x%X compressed\n", - this, mInputFrameID)); - RETURN_SESSION_ERROR(this, PROTOCOL_ERROR); - } - nsresult rv = SetInputFrameDataStream(mInputFrameID); if (NS_FAILED(rv)) { LOG3(("Http2Session::ReadyToProcessDataFrame %p lookup streamID 0x%X " @@ -2168,17 +2126,6 @@ Http2Session::WriteSegments(nsAHttpSegmentWriter *writer, } mPaddingLength = 0; - if (mInputFrameType == FRAME_TYPE_DATA || - mInputFrameType == FRAME_TYPE_HEADERS || - mInputFrameType == FRAME_TYPE_PUSH_PROMISE || - mInputFrameType == FRAME_TYPE_CONTINUATION) { - if ((mInputFrameFlags & kFlag_PAD_HIGH) && - !(mInputFrameFlags & kFlag_PAD_LOW)) { - LOG3(("Http2Session::WriteSegments %p PROTOCOL_ERROR pad_high present " - "without pad_low\n", this)); - RETURN_SESSION_ERROR(this, PROTOCOL_ERROR); - } - } if (mInputFrameDataSize >= 0x4000) { // Section 9.1 HTTP frames cannot exceed 2^14 - 1 but receviers must ignore @@ -2222,7 +2169,7 @@ Http2Session::WriteSegments(nsAHttpSegmentWriter *writer, EnsureBuffer(mInputFrameBuffer, mInputFrameDataSize + 8, 8, mInputFrameBufferSize); ChangeDownstreamState(BUFFERING_CONTROL_FRAME); - } else if (mInputFrameFlags & (kFlag_PAD_LOW | kFlag_PAD_HIGH)) { + } else if (mInputFrameFlags & kFlag_PADDED) { ChangeDownstreamState(PROCESSING_DATA_FRAME_PADDING_CONTROL); } else { rv = ReadyToProcessDataFrame(PROCESSING_DATA_FRAME); @@ -2233,21 +2180,14 @@ Http2Session::WriteSegments(nsAHttpSegmentWriter *writer, } if (mDownstreamState == PROCESSING_DATA_FRAME_PADDING_CONTROL) { - uint32_t numControlBytes = 0; - if (mInputFrameFlags & kFlag_PAD_LOW) { - ++numControlBytes; - } - if (mInputFrameFlags & kFlag_PAD_HIGH) { - ++numControlBytes; - } + MOZ_ASSERT(mInputFrameFlags & kFlag_PADDED, + "Processing padding control on unpadded frame"); - MOZ_ASSERT(numControlBytes, - "Processing padding control with no control bytes!"); - MOZ_ASSERT(mInputFrameBufferUsed < (8 + numControlBytes), + MOZ_ASSERT(mInputFrameBufferUsed < (8 + 1), "Frame buffer used too large for state"); rv = NetworkRead(writer, mInputFrameBuffer + mInputFrameBufferUsed, - (8 + numControlBytes) - mInputFrameBufferUsed, + (8 + 1) - mInputFrameBufferUsed, countWritten); if (NS_FAILED(rv)) { @@ -2264,26 +2204,22 @@ Http2Session::WriteSegments(nsAHttpSegmentWriter *writer, mInputFrameBufferUsed += *countWritten; - if (mInputFrameBufferUsed - 8 < numControlBytes) { + if (mInputFrameBufferUsed - 8 < 1) { LOG3(("Http2Session::WriteSegments %p " "BUFFERING DATA FRAME CONTROL PADDING incomplete size=%d", this, mInputFrameBufferUsed - 8)); return rv; } - mInputFrameDataRead += numControlBytes; + ++mInputFrameDataRead; char *control = mInputFrameBuffer + 8; - if (mInputFrameFlags & kFlag_PAD_HIGH) { - mPaddingLength = static_cast(*control) * 256; - ++control; - } - mPaddingLength += static_cast(*control); + mPaddingLength = static_cast(*control); LOG3(("Http2Session::WriteSegments %p stream 0x%X mPaddingLength=%d", this, mInputFrameID, mPaddingLength)); - if (numControlBytes + mPaddingLength == mInputFrameDataSize) { + if (1U + mPaddingLength == mInputFrameDataSize) { // This frame consists entirely of padding, we can just discard it LOG3(("Http2Session::WriteSegments %p stream 0x%X frame with only padding", this, mInputFrameID)); @@ -2460,7 +2396,7 @@ Http2Session::WriteSegments(nsAHttpSegmentWriter *writer, } else { // Section 4.1 requires this to be ignored; though protocol_error would // be better - LOG3(("Http2Session %p unknow frame type %x ignored\n", + LOG3(("Http2Session %p unknown frame type %x ignored\n", this, mInputFrameType)); ResetDownstreamState(); rv = NS_OK; diff --git a/netwerk/protocol/http/Http2Session.h b/netwerk/protocol/http/Http2Session.h index a2af0c304129..27509947631c 100644 --- a/netwerk/protocol/http/Http2Session.h +++ b/netwerk/protocol/http/Http2Session.h @@ -85,9 +85,7 @@ public: FRAME_TYPE_GOAWAY = 7, FRAME_TYPE_WINDOW_UPDATE = 8, FRAME_TYPE_CONTINUATION = 9, - FRAME_TYPE_ALTSVC = 10, - FRAME_TYPE_BLOCKED = 11, - FRAME_TYPE_LAST = 12 + FRAME_TYPE_LAST = 10 }; // NO_ERROR is a macro defined on windows, so we'll name the HTTP2 goaway @@ -115,17 +113,14 @@ public: const static uint8_t kFlag_END_PUSH_PROMISE = 0x04; // push promise const static uint8_t kFlag_ACK = 0x01; // ping and settings const static uint8_t kFlag_END_SEGMENT = 0x02; // data - const static uint8_t kFlag_PAD_LOW = 0x08; // data, headers, push promise, continuation - const static uint8_t kFlag_PAD_HIGH = 0x10; // data, headers, push promise, continuation - const static uint8_t kFlag_COMPRESSED = 0x20; // data + const static uint8_t kFlag_PADDED = 0x08; // data, headers, push promise, continuation const static uint8_t kFlag_PRIORITY = 0x20; // headers enum { SETTINGS_TYPE_HEADER_TABLE_SIZE = 1, // compression table size SETTINGS_TYPE_ENABLE_PUSH = 2, // can be used to disable push SETTINGS_TYPE_MAX_CONCURRENT = 3, // streams recvr allowed to initiate - SETTINGS_TYPE_INITIAL_WINDOW = 4, // bytes for flow control default - SETTINGS_TYPE_COMPRESS_DATA = 5 // whether other side allowes compressed DATA + SETTINGS_TYPE_INITIAL_WINDOW = 4 // bytes for flow control default }; // This should be big enough to hold all of your control packets, @@ -166,8 +161,6 @@ public: static nsresult RecvGoAway(Http2Session *); static nsresult RecvWindowUpdate(Http2Session *); static nsresult RecvContinuation(Http2Session *); - static nsresult RecvAltSvc(Http2Session *); - static nsresult RecvBlocked(Http2Session *); char *EnsureOutputBuffer(uint32_t needed); diff --git a/netwerk/protocol/http/HttpChannelChild.h b/netwerk/protocol/http/HttpChannelChild.h index ed3c623cd7fe..5f2984206c3a 100644 --- a/netwerk/protocol/http/HttpChannelChild.h +++ b/netwerk/protocol/http/HttpChannelChild.h @@ -33,10 +33,6 @@ namespace mozilla { namespace net { -#if defined(_MSC_VER) && defined(__clang__) -// This is needed until http://llvm.org/PR19987 is fixed -class __multiple_inheritance HttpChannelChild; -#endif class HttpChannelChild : public PHttpChannelChild , public HttpBaseChannel , public HttpAsyncAborter diff --git a/netwerk/protocol/http/http2_huffman_table.txt b/netwerk/protocol/http/http2_huffman_table.txt index 5a6e1a077836..bfde068cd915 100644 --- a/netwerk/protocol/http/http2_huffman_table.txt +++ b/netwerk/protocol/http/http2_huffman_table.txt @@ -1,257 +1,257 @@ - ( 0) |11111111|11111111|11101110|10 3ffffba [26] - ( 1) |11111111|11111111|11101110|11 3ffffbb [26] - ( 2) |11111111|11111111|11101111|00 3ffffbc [26] - ( 3) |11111111|11111111|11101111|01 3ffffbd [26] - ( 4) |11111111|11111111|11101111|10 3ffffbe [26] - ( 5) |11111111|11111111|11101111|11 3ffffbf [26] - ( 6) |11111111|11111111|11110000|00 3ffffc0 [26] - ( 7) |11111111|11111111|11110000|01 3ffffc1 [26] - ( 8) |11111111|11111111|11110000|10 3ffffc2 [26] - ( 9) |11111111|11111111|11110000|11 3ffffc3 [26] - ( 10) |11111111|11111111|11110001|00 3ffffc4 [26] - ( 11) |11111111|11111111|11110001|01 3ffffc5 [26] - ( 12) |11111111|11111111|11110001|10 3ffffc6 [26] - ( 13) |11111111|11111111|11110001|11 3ffffc7 [26] - ( 14) |11111111|11111111|11110010|00 3ffffc8 [26] - ( 15) |11111111|11111111|11110010|01 3ffffc9 [26] - ( 16) |11111111|11111111|11110010|10 3ffffca [26] - ( 17) |11111111|11111111|11110010|11 3ffffcb [26] - ( 18) |11111111|11111111|11110011|00 3ffffcc [26] - ( 19) |11111111|11111111|11110011|01 3ffffcd [26] - ( 20) |11111111|11111111|11110011|10 3ffffce [26] - ( 21) |11111111|11111111|11110011|11 3ffffcf [26] - ( 22) |11111111|11111111|11110100|00 3ffffd0 [26] - ( 23) |11111111|11111111|11110100|01 3ffffd1 [26] - ( 24) |11111111|11111111|11110100|10 3ffffd2 [26] - ( 25) |11111111|11111111|11110100|11 3ffffd3 [26] - ( 26) |11111111|11111111|11110101|00 3ffffd4 [26] - ( 27) |11111111|11111111|11110101|01 3ffffd5 [26] - ( 28) |11111111|11111111|11110101|10 3ffffd6 [26] - ( 29) |11111111|11111111|11110101|11 3ffffd7 [26] - ( 30) |11111111|11111111|11110110|00 3ffffd8 [26] - ( 31) |11111111|11111111|11110110|01 3ffffd9 [26] - ' ' ( 32) |00110 6 [ 5] - '!' ( 33) |11111111|11100 1ffc [13] - '"' ( 34) |11111000|0 1f0 [ 9] - '#' ( 35) |11111111|111100 3ffc [14] - '$' ( 36) |11111111|1111100 7ffc [15] - '%' ( 37) |011110 1e [ 6] - '&' ( 38) |1100100 64 [ 7] - ''' ( 39) |11111111|11101 1ffd [13] - '(' ( 40) |11111110|10 3fa [10] - ')' ( 41) |11111000|1 1f1 [ 9] - '*' ( 42) |11111110|11 3fb [10] - '+' ( 43) |11111111|00 3fc [10] - ',' ( 44) |1100101 65 [ 7] - '-' ( 45) |1100110 66 [ 7] - '.' ( 46) |011111 1f [ 6] - '/' ( 47) |00111 7 [ 5] - '0' ( 48) |0000 0 [ 4] - '1' ( 49) |0001 1 [ 4] - '2' ( 50) |0010 2 [ 4] - '3' ( 51) |01000 8 [ 5] - '4' ( 52) |100000 20 [ 6] - '5' ( 53) |100001 21 [ 6] - '6' ( 54) |100010 22 [ 6] - '7' ( 55) |100011 23 [ 6] - '8' ( 56) |100100 24 [ 6] - '9' ( 57) |100101 25 [ 6] - ':' ( 58) |100110 26 [ 6] - ';' ( 59) |11101100| ec [ 8] - '<' ( 60) |11111111|11111110|0 1fffc [17] - '=' ( 61) |100111 27 [ 6] - '>' ( 62) |11111111|1111101 7ffd [15] - '?' ( 63) |11111111|01 3fd [10] - '@' ( 64) |11111111|1111110 7ffe [15] - 'A' ( 65) |1100111 67 [ 7] - 'B' ( 66) |11101101| ed [ 8] - 'C' ( 67) |11101110| ee [ 8] - 'D' ( 68) |1101000 68 [ 7] - 'E' ( 69) |11101111| ef [ 8] - 'F' ( 70) |1101001 69 [ 7] - 'G' ( 71) |1101010 6a [ 7] - 'H' ( 72) |11111001|0 1f2 [ 9] - 'I' ( 73) |11110000| f0 [ 8] - 'J' ( 74) |11111001|1 1f3 [ 9] - 'K' ( 75) |11111010|0 1f4 [ 9] - 'L' ( 76) |11111010|1 1f5 [ 9] - 'M' ( 77) |1101011 6b [ 7] - 'N' ( 78) |1101100 6c [ 7] - 'O' ( 79) |11110001| f1 [ 8] - 'P' ( 80) |11110010| f2 [ 8] - 'Q' ( 81) |11111011|0 1f6 [ 9] - 'R' ( 82) |11111011|1 1f7 [ 9] - 'S' ( 83) |1101101 6d [ 7] - 'T' ( 84) |101000 28 [ 6] - 'U' ( 85) |11110011| f3 [ 8] - 'V' ( 86) |11111100|0 1f8 [ 9] - 'W' ( 87) |11111100|1 1f9 [ 9] - 'X' ( 88) |11110100| f4 [ 8] - 'Y' ( 89) |11111101|0 1fa [ 9] - 'Z' ( 90) |11111101|1 1fb [ 9] - '[' ( 91) |11111111|100 7fc [11] - '\' ( 92) |11111111|11111111|11110110|10 3ffffda [26] - ']' ( 93) |11111111|101 7fd [11] - '^' ( 94) |11111111|111101 3ffd [14] - '_' ( 95) |1101110 6e [ 7] - '`' ( 96) |11111111|11111111|10 3fffe [18] - 'a' ( 97) |01001 9 [ 5] - 'b' ( 98) |1101111 6f [ 7] - 'c' ( 99) |01010 a [ 5] - 'd' (100) |101001 29 [ 6] - 'e' (101) |01011 b [ 5] - 'f' (102) |1110000 70 [ 7] - 'g' (103) |101010 2a [ 6] - 'h' (104) |101011 2b [ 6] - 'i' (105) |01100 c [ 5] - 'j' (106) |11110101| f5 [ 8] - 'k' (107) |11110110| f6 [ 8] - 'l' (108) |101100 2c [ 6] - 'm' (109) |101101 2d [ 6] - 'n' (110) |101110 2e [ 6] - 'o' (111) |01101 d [ 5] - 'p' (112) |101111 2f [ 6] - 'q' (113) |11111110|0 1fc [ 9] - 'r' (114) |110000 30 [ 6] - 's' (115) |110001 31 [ 6] - 't' (116) |01110 e [ 5] - 'u' (117) |1110001 71 [ 7] - 'v' (118) |1110010 72 [ 7] - 'w' (119) |1110011 73 [ 7] - 'x' (120) |1110100 74 [ 7] - 'y' (121) |1110101 75 [ 7] - 'z' (122) |11110111| f7 [ 8] - '{' (123) |11111111|11111110|1 1fffd [17] - '|' (124) |11111111|1100 ffc [12] - '}' (125) |11111111|11111111|0 1fffe [17] - '~' (126) |11111111|1101 ffd [12] - (127) |11111111|11111111|11110110|11 3ffffdb [26] - (128) |11111111|11111111|11110111|00 3ffffdc [26] - (129) |11111111|11111111|11110111|01 3ffffdd [26] - (130) |11111111|11111111|11110111|10 3ffffde [26] - (131) |11111111|11111111|11110111|11 3ffffdf [26] - (132) |11111111|11111111|11111000|00 3ffffe0 [26] - (133) |11111111|11111111|11111000|01 3ffffe1 [26] - (134) |11111111|11111111|11111000|10 3ffffe2 [26] - (135) |11111111|11111111|11111000|11 3ffffe3 [26] - (136) |11111111|11111111|11111001|00 3ffffe4 [26] - (137) |11111111|11111111|11111001|01 3ffffe5 [26] - (138) |11111111|11111111|11111001|10 3ffffe6 [26] - (139) |11111111|11111111|11111001|11 3ffffe7 [26] - (140) |11111111|11111111|11111010|00 3ffffe8 [26] - (141) |11111111|11111111|11111010|01 3ffffe9 [26] - (142) |11111111|11111111|11111010|10 3ffffea [26] - (143) |11111111|11111111|11111010|11 3ffffeb [26] - (144) |11111111|11111111|11111011|00 3ffffec [26] - (145) |11111111|11111111|11111011|01 3ffffed [26] - (146) |11111111|11111111|11111011|10 3ffffee [26] - (147) |11111111|11111111|11111011|11 3ffffef [26] - (148) |11111111|11111111|11111100|00 3fffff0 [26] - (149) |11111111|11111111|11111100|01 3fffff1 [26] - (150) |11111111|11111111|11111100|10 3fffff2 [26] - (151) |11111111|11111111|11111100|11 3fffff3 [26] - (152) |11111111|11111111|11111101|00 3fffff4 [26] - (153) |11111111|11111111|11111101|01 3fffff5 [26] - (154) |11111111|11111111|11111101|10 3fffff6 [26] - (155) |11111111|11111111|11111101|11 3fffff7 [26] - (156) |11111111|11111111|11111110|00 3fffff8 [26] - (157) |11111111|11111111|11111110|01 3fffff9 [26] - (158) |11111111|11111111|11111110|10 3fffffa [26] - (159) |11111111|11111111|11111110|11 3fffffb [26] - (160) |11111111|11111111|11111111|00 3fffffc [26] - (161) |11111111|11111111|11111111|01 3fffffd [26] - (162) |11111111|11111111|11111111|10 3fffffe [26] - (163) |11111111|11111111|11111111|11 3ffffff [26] - (164) |11111111|11111111|11000000|0 1ffff80 [25] - (165) |11111111|11111111|11000000|1 1ffff81 [25] - (166) |11111111|11111111|11000001|0 1ffff82 [25] - (167) |11111111|11111111|11000001|1 1ffff83 [25] - (168) |11111111|11111111|11000010|0 1ffff84 [25] - (169) |11111111|11111111|11000010|1 1ffff85 [25] - (170) |11111111|11111111|11000011|0 1ffff86 [25] - (171) |11111111|11111111|11000011|1 1ffff87 [25] - (172) |11111111|11111111|11000100|0 1ffff88 [25] - (173) |11111111|11111111|11000100|1 1ffff89 [25] - (174) |11111111|11111111|11000101|0 1ffff8a [25] - (175) |11111111|11111111|11000101|1 1ffff8b [25] - (176) |11111111|11111111|11000110|0 1ffff8c [25] - (177) |11111111|11111111|11000110|1 1ffff8d [25] - (178) |11111111|11111111|11000111|0 1ffff8e [25] - (179) |11111111|11111111|11000111|1 1ffff8f [25] - (180) |11111111|11111111|11001000|0 1ffff90 [25] - (181) |11111111|11111111|11001000|1 1ffff91 [25] - (182) |11111111|11111111|11001001|0 1ffff92 [25] - (183) |11111111|11111111|11001001|1 1ffff93 [25] - (184) |11111111|11111111|11001010|0 1ffff94 [25] - (185) |11111111|11111111|11001010|1 1ffff95 [25] - (186) |11111111|11111111|11001011|0 1ffff96 [25] - (187) |11111111|11111111|11001011|1 1ffff97 [25] - (188) |11111111|11111111|11001100|0 1ffff98 [25] - (189) |11111111|11111111|11001100|1 1ffff99 [25] - (190) |11111111|11111111|11001101|0 1ffff9a [25] - (191) |11111111|11111111|11001101|1 1ffff9b [25] - (192) |11111111|11111111|11001110|0 1ffff9c [25] - (193) |11111111|11111111|11001110|1 1ffff9d [25] - (194) |11111111|11111111|11001111|0 1ffff9e [25] - (195) |11111111|11111111|11001111|1 1ffff9f [25] - (196) |11111111|11111111|11010000|0 1ffffa0 [25] - (197) |11111111|11111111|11010000|1 1ffffa1 [25] - (198) |11111111|11111111|11010001|0 1ffffa2 [25] - (199) |11111111|11111111|11010001|1 1ffffa3 [25] - (200) |11111111|11111111|11010010|0 1ffffa4 [25] - (201) |11111111|11111111|11010010|1 1ffffa5 [25] - (202) |11111111|11111111|11010011|0 1ffffa6 [25] - (203) |11111111|11111111|11010011|1 1ffffa7 [25] - (204) |11111111|11111111|11010100|0 1ffffa8 [25] - (205) |11111111|11111111|11010100|1 1ffffa9 [25] - (206) |11111111|11111111|11010101|0 1ffffaa [25] - (207) |11111111|11111111|11010101|1 1ffffab [25] - (208) |11111111|11111111|11010110|0 1ffffac [25] - (209) |11111111|11111111|11010110|1 1ffffad [25] - (210) |11111111|11111111|11010111|0 1ffffae [25] - (211) |11111111|11111111|11010111|1 1ffffaf [25] - (212) |11111111|11111111|11011000|0 1ffffb0 [25] - (213) |11111111|11111111|11011000|1 1ffffb1 [25] - (214) |11111111|11111111|11011001|0 1ffffb2 [25] - (215) |11111111|11111111|11011001|1 1ffffb3 [25] - (216) |11111111|11111111|11011010|0 1ffffb4 [25] - (217) |11111111|11111111|11011010|1 1ffffb5 [25] - (218) |11111111|11111111|11011011|0 1ffffb6 [25] - (219) |11111111|11111111|11011011|1 1ffffb7 [25] - (220) |11111111|11111111|11011100|0 1ffffb8 [25] - (221) |11111111|11111111|11011100|1 1ffffb9 [25] - (222) |11111111|11111111|11011101|0 1ffffba [25] - (223) |11111111|11111111|11011101|1 1ffffbb [25] - (224) |11111111|11111111|11011110|0 1ffffbc [25] - (225) |11111111|11111111|11011110|1 1ffffbd [25] - (226) |11111111|11111111|11011111|0 1ffffbe [25] - (227) |11111111|11111111|11011111|1 1ffffbf [25] - (228) |11111111|11111111|11100000|0 1ffffc0 [25] - (229) |11111111|11111111|11100000|1 1ffffc1 [25] - (230) |11111111|11111111|11100001|0 1ffffc2 [25] - (231) |11111111|11111111|11100001|1 1ffffc3 [25] - (232) |11111111|11111111|11100010|0 1ffffc4 [25] - (233) |11111111|11111111|11100010|1 1ffffc5 [25] - (234) |11111111|11111111|11100011|0 1ffffc6 [25] - (235) |11111111|11111111|11100011|1 1ffffc7 [25] - (236) |11111111|11111111|11100100|0 1ffffc8 [25] - (237) |11111111|11111111|11100100|1 1ffffc9 [25] - (238) |11111111|11111111|11100101|0 1ffffca [25] - (239) |11111111|11111111|11100101|1 1ffffcb [25] - (240) |11111111|11111111|11100110|0 1ffffcc [25] - (241) |11111111|11111111|11100110|1 1ffffcd [25] - (242) |11111111|11111111|11100111|0 1ffffce [25] - (243) |11111111|11111111|11100111|1 1ffffcf [25] - (244) |11111111|11111111|11101000|0 1ffffd0 [25] - (245) |11111111|11111111|11101000|1 1ffffd1 [25] - (246) |11111111|11111111|11101001|0 1ffffd2 [25] - (247) |11111111|11111111|11101001|1 1ffffd3 [25] - (248) |11111111|11111111|11101010|0 1ffffd4 [25] - (249) |11111111|11111111|11101010|1 1ffffd5 [25] - (250) |11111111|11111111|11101011|0 1ffffd6 [25] - (251) |11111111|11111111|11101011|1 1ffffd7 [25] - (252) |11111111|11111111|11101100|0 1ffffd8 [25] - (253) |11111111|11111111|11101100|1 1ffffd9 [25] - (254) |11111111|11111111|11101101|0 1ffffda [25] - (255) |11111111|11111111|11101101|1 1ffffdb [25] - EOS (256) |11111111|11111111|11101110|0 1ffffdc [25] + ( 0) |11111111|11000 1ff8 [13] + ( 1) |11111111|11111111|1011000 7fffd8 [23] + ( 2) |11111111|11111111|11111110|0010 fffffe2 [28] + ( 3) |11111111|11111111|11111110|0011 fffffe3 [28] + ( 4) |11111111|11111111|11111110|0100 fffffe4 [28] + ( 5) |11111111|11111111|11111110|0101 fffffe5 [28] + ( 6) |11111111|11111111|11111110|0110 fffffe6 [28] + ( 7) |11111111|11111111|11111110|0111 fffffe7 [28] + ( 8) |11111111|11111111|11111110|1000 fffffe8 [28] + ( 9) |11111111|11111111|11101010 ffffea [24] + ( 10) |11111111|11111111|11111111|111100 3ffffffc [30] + ( 11) |11111111|11111111|11111110|1001 fffffe9 [28] + ( 12) |11111111|11111111|11111110|1010 fffffea [28] + ( 13) |11111111|11111111|11111111|111101 3ffffffd [30] + ( 14) |11111111|11111111|11111110|1011 fffffeb [28] + ( 15) |11111111|11111111|11111110|1100 fffffec [28] + ( 16) |11111111|11111111|11111110|1101 fffffed [28] + ( 17) |11111111|11111111|11111110|1110 fffffee [28] + ( 18) |11111111|11111111|11111110|1111 fffffef [28] + ( 19) |11111111|11111111|11111111|0000 ffffff0 [28] + ( 20) |11111111|11111111|11111111|0001 ffffff1 [28] + ( 21) |11111111|11111111|11111111|0010 ffffff2 [28] + ( 22) |11111111|11111111|11111111|111110 3ffffffe [30] + ( 23) |11111111|11111111|11111111|0011 ffffff3 [28] + ( 24) |11111111|11111111|11111111|0100 ffffff4 [28] + ( 25) |11111111|11111111|11111111|0101 ffffff5 [28] + ( 26) |11111111|11111111|11111111|0110 ffffff6 [28] + ( 27) |11111111|11111111|11111111|0111 ffffff7 [28] + ( 28) |11111111|11111111|11111111|1000 ffffff8 [28] + ( 29) |11111111|11111111|11111111|1001 ffffff9 [28] + ( 30) |11111111|11111111|11111111|1010 ffffffa [28] + ( 31) |11111111|11111111|11111111|1011 ffffffb [28] + ' ' ( 32) |010100 14 [ 6] + '!' ( 33) |11111110|00 3f8 [10] + '"' ( 34) |11111110|01 3f9 [10] + '#' ( 35) |11111111|1010 ffa [12] + '$' ( 36) |11111111|11001 1ff9 [13] + '%' ( 37) |010101 15 [ 6] + '&' ( 38) |11111000 f8 [ 8] + ''' ( 39) |11111111|010 7fa [11] + '(' ( 40) |11111110|10 3fa [10] + ')' ( 41) |11111110|11 3fb [10] + '*' ( 42) |11111001 f9 [ 8] + '+' ( 43) |11111111|011 7fb [11] + ',' ( 44) |11111010 fa [ 8] + '-' ( 45) |010110 16 [ 6] + '.' ( 46) |010111 17 [ 6] + '/' ( 47) |011000 18 [ 6] + '0' ( 48) |00000 0 [ 5] + '1' ( 49) |00001 1 [ 5] + '2' ( 50) |00010 2 [ 5] + '3' ( 51) |011001 19 [ 6] + '4' ( 52) |011010 1a [ 6] + '5' ( 53) |011011 1b [ 6] + '6' ( 54) |011100 1c [ 6] + '7' ( 55) |011101 1d [ 6] + '8' ( 56) |011110 1e [ 6] + '9' ( 57) |011111 1f [ 6] + ':' ( 58) |1011100 5c [ 7] + ';' ( 59) |11111011 fb [ 8] + '<' ( 60) |11111111|1111100 7ffc [15] + '=' ( 61) |100000 20 [ 6] + '>' ( 62) |11111111|1011 ffb [12] + '?' ( 63) |11111111|00 3fc [10] + '@' ( 64) |11111111|11010 1ffa [13] + 'A' ( 65) |100001 21 [ 6] + 'B' ( 66) |1011101 5d [ 7] + 'C' ( 67) |1011110 5e [ 7] + 'D' ( 68) |1011111 5f [ 7] + 'E' ( 69) |1100000 60 [ 7] + 'F' ( 70) |1100001 61 [ 7] + 'G' ( 71) |1100010 62 [ 7] + 'H' ( 72) |1100011 63 [ 7] + 'I' ( 73) |1100100 64 [ 7] + 'J' ( 74) |1100101 65 [ 7] + 'K' ( 75) |1100110 66 [ 7] + 'L' ( 76) |1100111 67 [ 7] + 'M' ( 77) |1101000 68 [ 7] + 'N' ( 78) |1101001 69 [ 7] + 'O' ( 79) |1101010 6a [ 7] + 'P' ( 80) |1101011 6b [ 7] + 'Q' ( 81) |1101100 6c [ 7] + 'R' ( 82) |1101101 6d [ 7] + 'S' ( 83) |1101110 6e [ 7] + 'T' ( 84) |1101111 6f [ 7] + 'U' ( 85) |1110000 70 [ 7] + 'V' ( 86) |1110001 71 [ 7] + 'W' ( 87) |1110010 72 [ 7] + 'X' ( 88) |11111100 fc [ 8] + 'Y' ( 89) |1110011 73 [ 7] + 'Z' ( 90) |11111101 fd [ 8] + '[' ( 91) |11111111|11011 1ffb [13] + '\' ( 92) |11111111|11111110|000 7fff0 [19] + ']' ( 93) |11111111|11100 1ffc [13] + '^' ( 94) |11111111|111100 3ffc [14] + '_' ( 95) |100010 22 [ 6] + '`' ( 96) |11111111|1111101 7ffd [15] + 'a' ( 97) |00011 3 [ 5] + 'b' ( 98) |100011 23 [ 6] + 'c' ( 99) |00100 4 [ 5] + 'd' (100) |100100 24 [ 6] + 'e' (101) |00101 5 [ 5] + 'f' (102) |100101 25 [ 6] + 'g' (103) |100110 26 [ 6] + 'h' (104) |100111 27 [ 6] + 'i' (105) |00110 6 [ 5] + 'j' (106) |1110100 74 [ 7] + 'k' (107) |1110101 75 [ 7] + 'l' (108) |101000 28 [ 6] + 'm' (109) |101001 29 [ 6] + 'n' (110) |101010 2a [ 6] + 'o' (111) |00111 7 [ 5] + 'p' (112) |101011 2b [ 6] + 'q' (113) |1110110 76 [ 7] + 'r' (114) |101100 2c [ 6] + 's' (115) |01000 8 [ 5] + 't' (116) |01001 9 [ 5] + 'u' (117) |101101 2d [ 6] + 'v' (118) |1110111 77 [ 7] + 'w' (119) |1111000 78 [ 7] + 'x' (120) |1111001 79 [ 7] + 'y' (121) |1111010 7a [ 7] + 'z' (122) |1111011 7b [ 7] + '{' (123) |11111111|1111110 7ffe [15] + '|' (124) |11111111|100 7fc [11] + '}' (125) |11111111|111101 3ffd [14] + '~' (126) |11111111|11101 1ffd [13] + (127) |11111111|11111111|11111111|1100 ffffffc [28] + (128) |11111111|11111110|0110 fffe6 [20] + (129) |11111111|11111111|010010 3fffd2 [22] + (130) |11111111|11111110|0111 fffe7 [20] + (131) |11111111|11111110|1000 fffe8 [20] + (132) |11111111|11111111|010011 3fffd3 [22] + (133) |11111111|11111111|010100 3fffd4 [22] + (134) |11111111|11111111|010101 3fffd5 [22] + (135) |11111111|11111111|1011001 7fffd9 [23] + (136) |11111111|11111111|010110 3fffd6 [22] + (137) |11111111|11111111|1011010 7fffda [23] + (138) |11111111|11111111|1011011 7fffdb [23] + (139) |11111111|11111111|1011100 7fffdc [23] + (140) |11111111|11111111|1011101 7fffdd [23] + (141) |11111111|11111111|1011110 7fffde [23] + (142) |11111111|11111111|11101011 ffffeb [24] + (143) |11111111|11111111|1011111 7fffdf [23] + (144) |11111111|11111111|11101100 ffffec [24] + (145) |11111111|11111111|11101101 ffffed [24] + (146) |11111111|11111111|010111 3fffd7 [22] + (147) |11111111|11111111|1100000 7fffe0 [23] + (148) |11111111|11111111|11101110 ffffee [24] + (149) |11111111|11111111|1100001 7fffe1 [23] + (150) |11111111|11111111|1100010 7fffe2 [23] + (151) |11111111|11111111|1100011 7fffe3 [23] + (152) |11111111|11111111|1100100 7fffe4 [23] + (153) |11111111|11111110|11100 1fffdc [21] + (154) |11111111|11111111|011000 3fffd8 [22] + (155) |11111111|11111111|1100101 7fffe5 [23] + (156) |11111111|11111111|011001 3fffd9 [22] + (157) |11111111|11111111|1100110 7fffe6 [23] + (158) |11111111|11111111|1100111 7fffe7 [23] + (159) |11111111|11111111|11101111 ffffef [24] + (160) |11111111|11111111|011010 3fffda [22] + (161) |11111111|11111110|11101 1fffdd [21] + (162) |11111111|11111110|1001 fffe9 [20] + (163) |11111111|11111111|011011 3fffdb [22] + (164) |11111111|11111111|011100 3fffdc [22] + (165) |11111111|11111111|1101000 7fffe8 [23] + (166) |11111111|11111111|1101001 7fffe9 [23] + (167) |11111111|11111110|11110 1fffde [21] + (168) |11111111|11111111|1101010 7fffea [23] + (169) |11111111|11111111|011101 3fffdd [22] + (170) |11111111|11111111|011110 3fffde [22] + (171) |11111111|11111111|11110000 fffff0 [24] + (172) |11111111|11111110|11111 1fffdf [21] + (173) |11111111|11111111|011111 3fffdf [22] + (174) |11111111|11111111|1101011 7fffeb [23] + (175) |11111111|11111111|1101100 7fffec [23] + (176) |11111111|11111111|00000 1fffe0 [21] + (177) |11111111|11111111|00001 1fffe1 [21] + (178) |11111111|11111111|100000 3fffe0 [22] + (179) |11111111|11111111|00010 1fffe2 [21] + (180) |11111111|11111111|1101101 7fffed [23] + (181) |11111111|11111111|100001 3fffe1 [22] + (182) |11111111|11111111|1101110 7fffee [23] + (183) |11111111|11111111|1101111 7fffef [23] + (184) |11111111|11111110|1010 fffea [20] + (185) |11111111|11111111|100010 3fffe2 [22] + (186) |11111111|11111111|100011 3fffe3 [22] + (187) |11111111|11111111|100100 3fffe4 [22] + (188) |11111111|11111111|1110000 7ffff0 [23] + (189) |11111111|11111111|100101 3fffe5 [22] + (190) |11111111|11111111|100110 3fffe6 [22] + (191) |11111111|11111111|1110001 7ffff1 [23] + (192) |11111111|11111111|11111000|00 3ffffe0 [26] + (193) |11111111|11111111|11111000|01 3ffffe1 [26] + (194) |11111111|11111110|1011 fffeb [20] + (195) |11111111|11111110|001 7fff1 [19] + (196) |11111111|11111111|100111 3fffe7 [22] + (197) |11111111|11111111|1110010 7ffff2 [23] + (198) |11111111|11111111|101000 3fffe8 [22] + (199) |11111111|11111111|11110110|0 1ffffec [25] + (200) |11111111|11111111|11111000|10 3ffffe2 [26] + (201) |11111111|11111111|11111000|11 3ffffe3 [26] + (202) |11111111|11111111|11111001|00 3ffffe4 [26] + (203) |11111111|11111111|11111011|110 7ffffde [27] + (204) |11111111|11111111|11111011|111 7ffffdf [27] + (205) |11111111|11111111|11111001|01 3ffffe5 [26] + (206) |11111111|11111111|11110001 fffff1 [24] + (207) |11111111|11111111|11110110|1 1ffffed [25] + (208) |11111111|11111110|010 7fff2 [19] + (209) |11111111|11111111|00011 1fffe3 [21] + (210) |11111111|11111111|11111001|10 3ffffe6 [26] + (211) |11111111|11111111|11111100|000 7ffffe0 [27] + (212) |11111111|11111111|11111100|001 7ffffe1 [27] + (213) |11111111|11111111|11111001|11 3ffffe7 [26] + (214) |11111111|11111111|11111100|010 7ffffe2 [27] + (215) |11111111|11111111|11110010 fffff2 [24] + (216) |11111111|11111111|00100 1fffe4 [21] + (217) |11111111|11111111|00101 1fffe5 [21] + (218) |11111111|11111111|11111010|00 3ffffe8 [26] + (219) |11111111|11111111|11111010|01 3ffffe9 [26] + (220) |11111111|11111111|11111111|1101 ffffffd [28] + (221) |11111111|11111111|11111100|011 7ffffe3 [27] + (222) |11111111|11111111|11111100|100 7ffffe4 [27] + (223) |11111111|11111111|11111100|101 7ffffe5 [27] + (224) |11111111|11111110|1100 fffec [20] + (225) |11111111|11111111|11110011 fffff3 [24] + (226) |11111111|11111110|1101 fffed [20] + (227) |11111111|11111111|00110 1fffe6 [21] + (228) |11111111|11111111|101001 3fffe9 [22] + (229) |11111111|11111111|00111 1fffe7 [21] + (230) |11111111|11111111|01000 1fffe8 [21] + (231) |11111111|11111111|1110011 7ffff3 [23] + (232) |11111111|11111111|101010 3fffea [22] + (233) |11111111|11111111|101011 3fffeb [22] + (234) |11111111|11111111|11110111|0 1ffffee [25] + (235) |11111111|11111111|11110111|1 1ffffef [25] + (236) |11111111|11111111|11110100 fffff4 [24] + (237) |11111111|11111111|11110101 fffff5 [24] + (238) |11111111|11111111|11111010|10 3ffffea [26] + (239) |11111111|11111111|1110100 7ffff4 [23] + (240) |11111111|11111111|11111010|11 3ffffeb [26] + (241) |11111111|11111111|11111100|110 7ffffe6 [27] + (242) |11111111|11111111|11111011|00 3ffffec [26] + (243) |11111111|11111111|11111011|01 3ffffed [26] + (244) |11111111|11111111|11111100|111 7ffffe7 [27] + (245) |11111111|11111111|11111101|000 7ffffe8 [27] + (246) |11111111|11111111|11111101|001 7ffffe9 [27] + (247) |11111111|11111111|11111101|010 7ffffea [27] + (248) |11111111|11111111|11111101|011 7ffffeb [27] + (249) |11111111|11111111|11111111|1110 ffffffe [28] + (250) |11111111|11111111|11111101|100 7ffffec [27] + (251) |11111111|11111111|11111101|101 7ffffed [27] + (252) |11111111|11111111|11111101|110 7ffffee [27] + (253) |11111111|11111111|11111101|111 7ffffef [27] + (254) |11111111|11111111|11111110|000 7fffff0 [27] + (255) |11111111|11111111|11111011|10 3ffffee [26] + EOS (256) |11111111|11111111|11111111|111111 3fffffff [30] diff --git a/netwerk/protocol/http/nsHttp.h b/netwerk/protocol/http/nsHttp.h index 10d8ce5ac461..f509af37fb5d 100644 --- a/netwerk/protocol/http/nsHttp.h +++ b/netwerk/protocol/http/nsHttp.h @@ -35,13 +35,14 @@ namespace net { // 25 was spdy/4a2 // 26 was http/2-draft08 and http/2-draft07 (they were the same) // 27 was http/2-draft09, h2-10, and h2-11 - HTTP2_VERSION_DRAFT12 = 28 + // 28 was http/2-draft12 + HTTP2_VERSION_DRAFT13 = 29 }; typedef uint8_t nsHttpVersion; -#define NS_HTTP2_DRAFT_VERSION HTTP2_VERSION_DRAFT12 -#define NS_HTTP2_DRAFT_TOKEN "h2-12" +#define NS_HTTP2_DRAFT_VERSION HTTP2_VERSION_DRAFT13 +#define NS_HTTP2_DRAFT_TOKEN "h2-13" //----------------------------------------------------------------------------- // http connection capabilities diff --git a/netwerk/test/unit/test_http2.js b/netwerk/test/unit/test_http2.js index 5a7ab7208bf2..80f64b2f50c7 100644 --- a/netwerk/test/unit/test_http2.js +++ b/netwerk/test/unit/test_http2.js @@ -25,7 +25,7 @@ var bigListenerMD5 = '8f607cfdd2c87d6a7eedb657dafbd836'; function checkIsHttp2(request) { try { - if (request.getResponseHeader("X-Firefox-Spdy") == "h2-12") { + if (request.getResponseHeader("X-Firefox-Spdy") == "h2-13") { if (request.getResponseHeader("X-Connection-Http2") == "yes") { return true; } diff --git a/python/mozbuild/mozbuild/base.py b/python/mozbuild/mozbuild/base.py index 3456617a679c..51e98f3674fd 100644 --- a/python/mozbuild/mozbuild/base.py +++ b/python/mozbuild/mozbuild/base.py @@ -434,9 +434,7 @@ class MozbuildObject(ProcessExecutionMixin): args.append('-s') # Print entering/leaving directory messages. Some consumers look at - # these to measure progress. Ideally, we'd do everything with pymake - # and use hooks in its API. Unfortunately, it doesn't provide that - # feature... yet. + # these to measure progress. if print_directory: args.append('-w') diff --git a/security/build/Makefile.in b/security/build/Makefile.in index 45b0842f22f8..70b9c85dc28a 100644 --- a/security/build/Makefile.in +++ b/security/build/Makefile.in @@ -460,11 +460,6 @@ $(addprefix export-,$(NSS_DIRS)): export-%: private_export-% $(addprefix private_export-,$(NSS_DIRS)): EXTRA_GMAKE_FLAGS = $(addprefix private_export-,$(NSS_DIRS)): private_export-%: -# Work around bug #836228 in pymake -ifdef .PYMAKE -$(foreach p,libs export private_export,$(addprefix $(p)-,$(NSS_DIRS))): *=$(subst $(NULL) $(NULL),-,$(wordlist 2,$(words $(subst -, ,$@)),$(subst -, ,$@))) -endif - $(foreach p,libs export private_export,$(addprefix $(p)-,$(NSS_DIRS))): $(DEFAULT_GMAKE_ENV) $(MAKE) -C $(NSS_SRCDIR)/security/$* $(@:-$*=) $(DEFAULT_GMAKE_FLAGS) diff --git a/security/manager/ssl/tests/unit/test_cert_version.js b/security/manager/ssl/tests/unit/test_cert_version.js index 2a4f80f38966..93c4d1543620 100644 --- a/security/manager/ssl/tests/unit/test_cert_version.js +++ b/security/manager/ssl/tests/unit/test_cert_version.js @@ -85,7 +85,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v1_int-v1_ca.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v1_int-v1_ca.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v1_int-v1_ca.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v1_int-v1_ca.der'), SEC_ERROR_BAD_DER); // v1 intermediate with v3 extensions. CA is invalid. ca_error = SEC_ERROR_EXTENSION_VALUE_INVALID; @@ -97,7 +97,7 @@ function run_test() { check_cert_err(cert_from_file('v2_bc_ee-v1_int_bc-v1_ca.der'), ee_error); check_cert_err(cert_from_file('v3_missing_bc_ee-v1_int_bc-v1_ca.der'), ee_error); check_cert_err(cert_from_file('v3_bc_ee-v1_int_bc-v1_ca.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v1_int_bc-v1_ca.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v1_int_bc-v1_ca.der'), SEC_ERROR_BAD_DER); // A v2 intermediate with a v1 CA ca_error = SEC_ERROR_CA_CERT_INVALID; @@ -110,7 +110,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v2_int-v1_ca.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v2_int-v1_ca.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v2_int-v1_ca.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v2_int-v1_ca.der'), SEC_ERROR_BAD_DER); // A v2 intermediate with basic constraints (not allowed in insanity) ca_error = SEC_ERROR_EXTENSION_VALUE_INVALID; @@ -122,7 +122,7 @@ function run_test() { check_cert_err(cert_from_file('v2_bc_ee-v2_int_bc-v1_ca.der'), ee_error); check_cert_err(cert_from_file('v3_missing_bc_ee-v2_int_bc-v1_ca.der'), ee_error); check_cert_err(cert_from_file('v3_bc_ee-v2_int_bc-v1_ca.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v2_int_bc-v1_ca.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v2_int_bc-v1_ca.der'), SEC_ERROR_BAD_DER); // Section is OK. A x509 v3 CA MUST have bc // http://tools.ietf.org/html/rfc5280#section-4.2.1.9 @@ -136,7 +136,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v3_int_missing_bc-v1_ca.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v3_int_missing_bc-v1_ca.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v3_int_missing_bc-v1_ca.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v3_int_missing_bc-v1_ca.der'), SEC_ERROR_BAD_DER); // It is valid for a v1 ca to sign a v3 intemediate. check_ok_ca(cert_from_file('v3_int-v1_ca.der')); @@ -148,7 +148,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v3_int-v1_ca.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v3_int-v1_ca.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v3_int-v1_ca.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v3_int-v1_ca.der'), SEC_ERROR_BAD_DER); // The next groups change the v1 ca for a v1 ca with base constraints // (invalid trust anchor). The error pattern is the same as the groups @@ -165,7 +165,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v1_int-v1_ca_bc.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v1_int-v1_ca_bc.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v1_int-v1_ca_bc.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v1_int-v1_ca_bc.der'), SEC_ERROR_BAD_DER); // Using a v1 intermediate with v3 extenstions (invalid). ca_error = SEC_ERROR_EXTENSION_VALUE_INVALID; @@ -177,7 +177,7 @@ function run_test() { check_cert_err(cert_from_file('v2_bc_ee-v1_int_bc-v1_ca_bc.der'), ee_error); check_cert_err(cert_from_file('v3_missing_bc_ee-v1_int_bc-v1_ca_bc.der'), ee_error); check_cert_err(cert_from_file('v3_bc_ee-v1_int_bc-v1_ca_bc.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v1_int_bc-v1_ca_bc.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v1_int_bc-v1_ca_bc.der'), SEC_ERROR_BAD_DER); // Using v2 intermediate ca_error = SEC_ERROR_CA_CERT_INVALID; @@ -190,7 +190,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v2_int-v1_ca_bc.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v2_int-v1_ca_bc.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v2_int-v1_ca_bc.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v2_int-v1_ca_bc.der'), SEC_ERROR_BAD_DER); // Using a v2 intermediate with basic constraints (invalid) ca_error = SEC_ERROR_EXTENSION_VALUE_INVALID; @@ -202,7 +202,7 @@ function run_test() { check_cert_err(cert_from_file('v2_bc_ee-v2_int_bc-v1_ca_bc.der'), ee_error); check_cert_err(cert_from_file('v3_missing_bc_ee-v2_int_bc-v1_ca_bc.der'), ee_error); check_cert_err(cert_from_file('v3_bc_ee-v2_int_bc-v1_ca_bc.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v2_int_bc-v1_ca_bc.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v2_int_bc-v1_ca_bc.der'), SEC_ERROR_BAD_DER); // Using a v3 intermediate that is missing basic constraints (invalid) ca_error = SEC_ERROR_CA_CERT_INVALID; @@ -215,7 +215,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v3_int_missing_bc-v1_ca_bc.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v3_int_missing_bc-v1_ca_bc.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v3_int_missing_bc-v1_ca_bc.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v3_int_missing_bc-v1_ca_bc.der'), SEC_ERROR_BAD_DER); // these should pass assuming we are OK with v1 ca signing v3 intermediates ca_error = SEC_ERROR_EXTENSION_VALUE_INVALID; @@ -227,7 +227,7 @@ function run_test() { check_cert_err(cert_from_file('v2_bc_ee-v3_int-v1_ca_bc.der'), ee_error); check_cert_err(cert_from_file('v3_missing_bc_ee-v3_int-v1_ca_bc.der'), ee_error); check_cert_err(cert_from_file('v3_bc_ee-v3_int-v1_ca_bc.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v3_int-v1_ca_bc.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v3_int-v1_ca_bc.der'), SEC_ERROR_BAD_DER); ////////////// @@ -245,7 +245,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v1_int-v2_ca.der'), ee_error) check_cert_err(cert_from_file('v2_bc_ee-v1_int-v2_ca.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v1_int-v2_ca.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v1_int-v2_ca.der'), SEC_ERROR_BAD_DER); // v2 ca, v1 intermediate with basic constraints (invalid) ca_error = SEC_ERROR_EXTENSION_VALUE_INVALID; @@ -257,7 +257,7 @@ function run_test() { check_cert_err(cert_from_file('v2_bc_ee-v1_int_bc-v2_ca.der'), ee_error); check_cert_err(cert_from_file('v3_missing_bc_ee-v1_int_bc-v2_ca.der'), ee_error); check_cert_err(cert_from_file('v3_bc_ee-v1_int_bc-v2_ca.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v1_int_bc-v2_ca.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v1_int_bc-v2_ca.der'), SEC_ERROR_BAD_DER); // v2 ca, v2 intermediate ca_error = SEC_ERROR_CA_CERT_INVALID; @@ -270,7 +270,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v2_int-v2_ca.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v2_int-v2_ca.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v2_int-v2_ca.der'), ee_error) + check_cert_err(cert_from_file('v4_bc_ee-v2_int-v2_ca.der'), SEC_ERROR_BAD_DER); // v2 ca, v2 intermediate with basic constraints (invalid) ca_error = SEC_ERROR_EXTENSION_VALUE_INVALID; @@ -282,7 +282,7 @@ function run_test() { check_cert_err(cert_from_file('v2_bc_ee-v2_int_bc-v2_ca.der'), ee_error); check_cert_err(cert_from_file('v3_missing_bc_ee-v2_int_bc-v2_ca.der'), ee_error); check_cert_err(cert_from_file('v3_bc_ee-v2_int_bc-v2_ca.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v2_int_bc-v2_ca.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v2_int_bc-v2_ca.der'), SEC_ERROR_BAD_DER); // v2 ca, v3 intermediate missing basic constraints ca_error = SEC_ERROR_CA_CERT_INVALID; @@ -295,7 +295,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v3_int_missing_bc-v2_ca.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v3_int_missing_bc-v2_ca.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v3_int_missing_bc-v2_ca.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v3_int_missing_bc-v2_ca.der'), SEC_ERROR_BAD_DER); // v2 ca, v3 intermediate ca_error = SEC_ERROR_CA_CERT_INVALID; @@ -309,7 +309,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v3_int-v2_ca.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v3_int-v2_ca.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v3_int-v2_ca.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v3_int-v2_ca.der'), SEC_ERROR_BAD_DER); // v2 ca, v1 intermediate ca_error = SEC_ERROR_CA_CERT_INVALID; @@ -322,7 +322,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v1_int-v2_ca_bc.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v1_int-v2_ca_bc.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v1_int-v2_ca_bc.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v1_int-v2_ca_bc.der'), SEC_ERROR_BAD_DER); // v2 ca, v1 intermediate with bc (invalid) ca_error = SEC_ERROR_EXTENSION_VALUE_INVALID; @@ -334,7 +334,7 @@ function run_test() { check_cert_err(cert_from_file('v2_bc_ee-v1_int_bc-v2_ca_bc.der'), ee_error); check_cert_err(cert_from_file('v3_missing_bc_ee-v1_int_bc-v2_ca_bc.der'), ee_error); check_cert_err(cert_from_file('v3_bc_ee-v1_int_bc-v2_ca_bc.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v1_int_bc-v2_ca_bc.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v1_int_bc-v2_ca_bc.der'), SEC_ERROR_BAD_DER); // v2 ca, v2 intermediate ca_error = SEC_ERROR_CA_CERT_INVALID; @@ -347,7 +347,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v2_int-v2_ca_bc.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v2_int-v2_ca_bc.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v2_int-v2_ca_bc.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v2_int-v2_ca_bc.der'), SEC_ERROR_BAD_DER); // v2 ca, v2 intermediate with bc (invalid) ca_error = SEC_ERROR_EXTENSION_VALUE_INVALID; @@ -359,7 +359,7 @@ function run_test() { check_cert_err(cert_from_file('v2_bc_ee-v2_int_bc-v2_ca_bc.der'), ee_error); check_cert_err(cert_from_file('v3_missing_bc_ee-v2_int_bc-v2_ca_bc.der'), ee_error); check_cert_err(cert_from_file('v3_bc_ee-v2_int_bc-v2_ca_bc.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v2_int_bc-v2_ca_bc.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v2_int_bc-v2_ca_bc.der'), SEC_ERROR_BAD_DER); // v2 ca, invalid v3 intermediate ca_error = SEC_ERROR_CA_CERT_INVALID; @@ -372,7 +372,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v3_int_missing_bc-v2_ca_bc.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v3_int_missing_bc-v2_ca_bc.der'), ee_error) - check_cert_err(cert_from_file('v4_bc_ee-v3_int_missing_bc-v2_ca_bc.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v3_int_missing_bc-v2_ca_bc.der'), SEC_ERROR_BAD_DER); // v2 ca, valid v3 intermediate (is OK if we use 'classic' semantics) ca_error = SEC_ERROR_EXTENSION_VALUE_INVALID; @@ -384,7 +384,7 @@ function run_test() { check_cert_err(cert_from_file('v2_bc_ee-v3_int-v2_ca_bc.der'), ee_error); check_cert_err(cert_from_file('v3_missing_bc_ee-v3_int-v2_ca_bc.der'), ee_error); check_cert_err(cert_from_file('v3_bc_ee-v3_int-v2_ca_bc.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v3_int-v2_ca_bc.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v3_int-v2_ca_bc.der'), SEC_ERROR_BAD_DER); ////////////// // v3 CA supersection @@ -401,7 +401,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v1_int-v3_ca.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v1_int-v3_ca.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v1_int-v3_ca.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v1_int-v3_ca.der'), SEC_ERROR_BAD_DER); // A v1 intermediate with v3 extensions ca_error = SEC_ERROR_EXTENSION_VALUE_INVALID; @@ -413,7 +413,7 @@ function run_test() { check_cert_err(cert_from_file('v2_bc_ee-v1_int_bc-v3_ca.der'), ee_error); check_cert_err(cert_from_file('v3_missing_bc_ee-v1_int_bc-v3_ca.der'), ee_error); check_cert_err(cert_from_file('v3_bc_ee-v1_int_bc-v3_ca.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v1_int_bc-v3_ca.der'), ee_error) + check_cert_err(cert_from_file('v4_bc_ee-v1_int_bc-v3_ca.der'), SEC_ERROR_BAD_DER); // reject a v2 cert as intermediate ca_error = SEC_ERROR_CA_CERT_INVALID; @@ -426,7 +426,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v2_int-v3_ca.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v2_int-v3_ca.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v2_int-v3_ca.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v2_int-v3_ca.der'), SEC_ERROR_BAD_DER); // v2 intermediate with bc (invalid) ca_error = SEC_ERROR_EXTENSION_VALUE_INVALID; @@ -438,7 +438,7 @@ function run_test() { check_cert_err(cert_from_file('v2_bc_ee-v2_int_bc-v3_ca.der'), ee_error); check_cert_err(cert_from_file('v3_missing_bc_ee-v2_int_bc-v3_ca.der'), ee_error); check_cert_err(cert_from_file('v3_bc_ee-v2_int_bc-v3_ca.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v2_int_bc-v3_ca.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v2_int_bc-v3_ca.der'), SEC_ERROR_BAD_DER); // invalid v3 intermediate ca_error = SEC_ERROR_CA_CERT_INVALID; @@ -451,7 +451,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v3_int_missing_bc-v3_ca.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v3_int_missing_bc-v3_ca.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v3_int_missing_bc-v3_ca.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v3_int_missing_bc-v3_ca.der'), SEC_ERROR_BAD_DER); // I dont think that v3 intermediates should be allowed to sign v1 or v2 // certs, but other thanthat this is what we usually get in the wild. @@ -464,7 +464,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v3_int-v3_ca.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v3_int-v3_ca.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v3_int-v3_ca.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v3_int-v3_ca.der'), SEC_ERROR_BAD_DER); // v3 CA, invalid v3 intermediate ca_error = SEC_ERROR_CA_CERT_INVALID; @@ -477,7 +477,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v1_int-v3_ca_missing_bc.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v1_int-v3_ca_missing_bc.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v1_int-v3_ca_missing_bc.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v1_int-v3_ca_missing_bc.der'), SEC_ERROR_BAD_DER); // Int v1 with BC that is just invalid (classic fail insanity OK) ca_error = SEC_ERROR_EXTENSION_VALUE_INVALID; @@ -489,7 +489,7 @@ function run_test() { check_cert_err(cert_from_file('v2_bc_ee-v1_int_bc-v3_ca_missing_bc.der'), ee_error); check_cert_err(cert_from_file('v3_missing_bc_ee-v1_int_bc-v3_ca_missing_bc.der'), ee_error); check_cert_err(cert_from_file('v3_bc_ee-v1_int_bc-v3_ca_missing_bc.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v1_int_bc-v3_ca_missing_bc.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v1_int_bc-v3_ca_missing_bc.der'), SEC_ERROR_BAD_DER); // Good section (all fail) ca_error = SEC_ERROR_CA_CERT_INVALID; @@ -502,7 +502,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v2_int-v3_ca_missing_bc.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v2_int-v3_ca_missing_bc.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v2_int-v3_ca_missing_bc.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v2_int-v3_ca_missing_bc.der'), SEC_ERROR_BAD_DER); // v2 intermediate (even with basic constraints) is invalid ca_error = SEC_ERROR_EXTENSION_VALUE_INVALID; @@ -514,7 +514,7 @@ function run_test() { check_cert_err(cert_from_file('v2_bc_ee-v2_int_bc-v3_ca_missing_bc.der'), ee_error); check_cert_err(cert_from_file('v3_missing_bc_ee-v2_int_bc-v3_ca_missing_bc.der'), ee_error); check_cert_err(cert_from_file('v3_bc_ee-v2_int_bc-v3_ca_missing_bc.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v2_int_bc-v3_ca_missing_bc.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v2_int_bc-v3_ca_missing_bc.der'), SEC_ERROR_BAD_DER); // v3 intermediate missing basic constraints is invalid ca_error = SEC_ERROR_CA_CERT_INVALID; @@ -527,7 +527,7 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v3_int_missing_bc-v3_ca_missing_bc.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v3_int_missing_bc-v3_ca_missing_bc.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v3_int_missing_bc-v3_ca_missing_bc.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v3_int_missing_bc-v3_ca_missing_bc.der'), SEC_ERROR_BAD_DER); // With a v3 root missing bc and valid v3 intermediate ca_error = SEC_ERROR_CA_CERT_INVALID; @@ -541,5 +541,5 @@ function run_test() { ee_error = SEC_ERROR_EXTENSION_VALUE_INVALID; check_cert_err(cert_from_file('v1_bc_ee-v3_int-v3_ca_missing_bc.der'), ee_error); check_cert_err(cert_from_file('v2_bc_ee-v3_int-v3_ca_missing_bc.der'), ee_error); - check_cert_err(cert_from_file('v4_bc_ee-v3_int-v3_ca_missing_bc.der'), ee_error); + check_cert_err(cert_from_file('v4_bc_ee-v3_int-v3_ca_missing_bc.der'), SEC_ERROR_BAD_DER); } diff --git a/security/pkix/lib/pkixbuild.cpp b/security/pkix/lib/pkixbuild.cpp index 75ceb8003c7b..ee455e1b79ee 100644 --- a/security/pkix/lib/pkixbuild.cpp +++ b/security/pkix/lib/pkixbuild.cpp @@ -52,18 +52,31 @@ BackCert::Init(const SECItem& certDER) return MapSECStatus(SECFailure); } + if (nssCert->version.len == 1 && + nssCert->version.data[0] == static_cast(der::Version::v3)) { + version = der::Version::v3; + } else if (nssCert->version.len == 1 && + nssCert->version.data[0] == static_cast(der::Version::v2)) { + version = der::Version::v2; + } else if (nssCert->version.len == 0) { + version = der::Version::v1; + } else { + // Explicit encoding of v1 is not allowed. We do not support any other + // version except v3. + return Fail(RecoverableError, SEC_ERROR_BAD_DER); + } + const CERTCertExtension* const* exts = nssCert->extensions; if (!exts) { return Success; } - // We only decode v3 extensions for v3 certificates for two reasons. - // 1. They make no sense in non-v3 certs - // 2. An invalid cert can embed a basic constraints extension and the - // check basic constrains will asume that this is valid. Making it - // posible to create chains with v1 and v2 intermediates with is - // not desirable. - if (! (nssCert->version.len == 1 && - nssCert->version.data[0] == mozilla::pkix::der::Version::v3)) { + + // Extensions are only allowed in v3 certificates, not v1 or v2. Also, we + // use presence of the basic constraints extension with isCA==true to decide + // whether to treat a certificate as a CA certificate, and we don't want to + // allow v1 or v2 intermediate CA certificates; this check is part of that + // enforcement as well. + if (version != der::Version::v3) { return Fail(RecoverableError, SEC_ERROR_EXTENSION_VALUE_INVALID); } @@ -128,7 +141,6 @@ BackCert::Init(const SECItem& certDER) return Success; } - Result BackCert::VerifyOwnSignatureWithKey(TrustDomain& trustDomain, const SECItem& subjectPublicKeyInfo) const diff --git a/security/pkix/lib/pkixcheck.cpp b/security/pkix/lib/pkixcheck.cpp index 22aaab11a550..572dc921defc 100644 --- a/security/pkix/lib/pkixcheck.cpp +++ b/security/pkix/lib/pkixcheck.cpp @@ -312,7 +312,7 @@ DecodeBasicConstraints(der::Input& input, /*out*/ bool& isCA, Result CheckBasicConstraints(EndEntityOrCA endEntityOrCA, const SECItem* encodedBasicConstraints, - const der::Version version, TrustLevel trustLevel, + der::Version version, TrustLevel trustLevel, unsigned int subCACount) { bool isCA = false; @@ -635,14 +635,6 @@ CheckIssuerIndependentProperties(TrustDomain& trustDomain, *trustLevelOut = trustLevel; } - // XXX: Good enough for now. There could be an illegal explicit version - // number or one we don't support, but we can safely treat those all as v3 - // for now since processing of v3 certificates is strictly more strict than - // processing of v1 certificates. - der::Version version = (!cert.GetNSSCert()->version.data && - !cert.GetNSSCert()->version.len) ? der::Version::v1 - : der::Version::v3; - // 4.2.1.1. Authority Key Identifier is ignored (see bug 965136). // 4.2.1.2. Subject Key Identifier is ignored (see bug 965136). @@ -675,7 +667,7 @@ CheckIssuerIndependentProperties(TrustDomain& trustDomain, // 4.2.1.9. Basic Constraints. rv = CheckBasicConstraints(endEntityOrCA, cert.encodedBasicConstraints, - version, trustLevel, subCACount); + cert.version, trustLevel, subCACount); if (rv != Success) { return rv; } diff --git a/security/pkix/lib/pkixder.cpp b/security/pkix/lib/pkixder.cpp index 61667edf1bac..894a6ef8b9a7 100644 --- a/security/pkix/lib/pkixder.cpp +++ b/security/pkix/lib/pkixder.cpp @@ -105,9 +105,7 @@ SignedData(Input& input, /*out*/ Input& tbs, /*out*/ CERTSignedData& signedData) return Failure; } - if (Nested(input, SEQUENCE, - bind(AlgorithmIdentifier, _1, ref(signedData.signatureAlgorithm))) - != Success) { + if (AlgorithmIdentifier(input, signedData.signatureAlgorithm) != Success) { return Failure; } diff --git a/security/pkix/lib/pkixder.h b/security/pkix/lib/pkixder.h index d41b1d1e9d22..7e538c91637f 100644 --- a/security/pkix/lib/pkixder.h +++ b/security/pkix/lib/pkixder.h @@ -572,15 +572,21 @@ OID(Input& input, const uint8_t (&expectedOid)[Len]) inline Result AlgorithmIdentifier(Input& input, SECAlgorithmID& algorithmID) { - if (ExpectTagAndGetValue(input, OIDTag, algorithmID.algorithm) != Success) { + Input value; + if (ExpectTagAndGetValue(input, der::SEQUENCE, value) != Success) { + return Failure; + } + if (ExpectTagAndGetValue(value, OIDTag, algorithmID.algorithm) != Success) { return Failure; } algorithmID.parameters.data = nullptr; algorithmID.parameters.len = 0; - if (input.AtEnd()) { - return Success; + if (!value.AtEnd()) { + if (Null(value) != Success) { + return Failure; + } } - return Null(input); + return End(value); } inline Result @@ -622,34 +628,107 @@ CertificateSerialNumber(Input& input, /*out*/ SECItem& value) // x.509 and OCSP both use this same version numbering scheme, though OCSP // only supports v1. -enum Version { v1 = 0, v2 = 1, v3 = 2 }; +MOZILLA_PKIX_ENUM_CLASS Version { v1 = 0, v2 = 1, v3 = 2 }; // X.509 Certificate and OCSP ResponseData both use this // "[0] EXPLICIT Version DEFAULT " construct, but with // different default versions. inline Result -OptionalVersion(Input& input, /*out*/ uint8_t& version) +OptionalVersion(Input& input, /*out*/ Version& version) { - const uint8_t tag = CONTEXT_SPECIFIC | CONSTRUCTED | 0; - if (!input.Peek(tag)) { - version = v1; + static const uint8_t TAG = CONTEXT_SPECIFIC | CONSTRUCTED | 0; + if (!input.Peek(TAG)) { + version = Version::v1; return Success; } - if (ExpectTagAndLength(input, tag, 3) != Success) { + Input value; + if (ExpectTagAndGetValue(input, TAG, value) != Success) { return Failure; } - if (ExpectTagAndLength(input, INTEGER, 1) != Success) { + uint8_t integerValue; + if (Integer(value, integerValue) != Success) { return Failure; } - if (input.Read(version) != Success) { + if (End(value) != Success) { return Failure; } - if (version & 0x80) { // negative - return Fail(SEC_ERROR_BAD_DER); + switch (integerValue) { + case static_cast(Version::v3): version = Version::v3; break; + case static_cast(Version::v2): version = Version::v2; break; + default: + return Fail(SEC_ERROR_BAD_DER); } return Success; } +template +inline Result +OptionalExtensions(Input& input, uint8_t tag, ExtensionHandler extensionHandler) +{ + if (!input.Peek(tag)) { + return Success; + } + + Input extensions; + { + Input tagged; + if (ExpectTagAndGetValue(input, tag, tagged) != Success) { + return Failure; + } + if (ExpectTagAndGetValue(tagged, SEQUENCE, extensions) != Success) { + return Failure; + } + if (End(tagged) != Success) { + return Failure; + } + } + + // Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension + // + // TODO(bug 997994): According to the specification, there should never be + // an empty sequence of extensions but we've found OCSP responses that have + // that (see bug 991898). + while (!extensions.AtEnd()) { + Input extension; + if (ExpectTagAndGetValue(extensions, SEQUENCE, extension) + != Success) { + return Failure; + } + + // Extension ::= SEQUENCE { + // extnID OBJECT IDENTIFIER, + // critical BOOLEAN DEFAULT FALSE, + // extnValue OCTET STRING + // } + Input extnID; + if (ExpectTagAndGetValue(extension, OIDTag, extnID) != Success) { + return Failure; + } + bool critical; + if (OptionalBoolean(extension, false, critical) != Success) { + return Failure; + } + SECItem extnValue; + if (ExpectTagAndGetValue(extension, OCTET_STRING, extnValue) + != Success) { + return Failure; + } + if (End(extension) != Success) { + return Failure; + } + + bool understood = false; + if (extensionHandler(extnID, extnValue, understood) != Success) { + return Failure; + } + if (critical && !understood) { + return Fail(SEC_ERROR_UNKNOWN_CRITICAL_EXTENSION); + } + } + + return Success; +} + // Parses a SEQUENCE into tbs and then parses an AlgorithmIdentifier followed // by a BIT STRING into signedData. This handles the commonality between // parsing the signed/signature fields of certificates and OCSP responses. In diff --git a/security/pkix/lib/pkixocsp.cpp b/security/pkix/lib/pkixocsp.cpp index 2c10723a568b..83140c5bd411 100644 --- a/security/pkix/lib/pkixocsp.cpp +++ b/security/pkix/lib/pkixocsp.cpp @@ -179,7 +179,9 @@ static inline der::Result ResponseData( /*const*/ SECItem* certs, size_t numCerts); static inline der::Result SingleResponse(der::Input& input, Context& context); -static inline der::Result CheckExtensionsForCriticality(der::Input&); +static der::Result ExtensionNotUnderstood(der::Input& extnID, + const SECItem& extnValue, + /*out*/ bool& understood); static inline der::Result CertID(der::Input& input, const Context& context, /*out*/ bool& match); @@ -486,11 +488,11 @@ ResponseData(der::Input& input, Context& context, const CERTSignedData& signedResponseData, /*const*/ SECItem* certs, size_t numCerts) { - uint8_t version; + der::Version version; if (der::OptionalVersion(input, version) != der::Success) { return der::Failure; } - if (version != der::v1) { + if (version != der::Version::v1) { // TODO: more specific error code for bad version? return der::Fail(SEC_ERROR_BAD_DER); } @@ -531,14 +533,9 @@ ResponseData(der::Input& input, Context& context, return der::Failure; } - if (!input.AtEnd()) { - if (der::Nested(input, der::CONTEXT_SPECIFIC | der::CONSTRUCTED | 1, - CheckExtensionsForCriticality) != der::Success) { - return der::Failure; - } - } - - return der::Success; + return der::OptionalExtensions(input, + der::CONTEXT_SPECIFIC | der::CONSTRUCTED | 1, + ExtensionNotUnderstood); } // SingleResponse ::= SEQUENCE { @@ -656,11 +653,11 @@ SingleResponse(der::Input& input, Context& context) context.expired = true; } - if (!input.AtEnd()) { - if (der::Nested(input, der::CONTEXT_SPECIFIC | der::CONSTRUCTED | 1, - CheckExtensionsForCriticality) != der::Success) { - return der::Failure; - } + if (der::OptionalExtensions(input, + der::CONTEXT_SPECIFIC | der::CONSTRUCTED | 1, + ExtensionNotUnderstood) + != der::Success) { + return der::Failure; } if (context.thisUpdate) { @@ -684,9 +681,7 @@ CertID(der::Input& input, const Context& context, /*out*/ bool& match) match = false; SECAlgorithmID hashAlgorithm; - if (der::Nested(input, der::SEQUENCE, - bind(der::AlgorithmIdentifier, _1, ref(hashAlgorithm))) - != der::Success) { + if (der::AlgorithmIdentifier(input, hashAlgorithm) != der::Success) { return der::Failure; } @@ -838,41 +833,14 @@ KeyHash(const SECItem& subjectPublicKeyInfo, /*out*/ uint8_t* hashBuf, return Success; } -// Extension ::= SEQUENCE { -// extnID OBJECT IDENTIFIER, -// critical BOOLEAN DEFAULT FALSE, -// extnValue OCTET STRING -// } -static der::Result -CheckExtensionForCriticality(der::Input& input) +der::Result +ExtensionNotUnderstood(der::Input& /*extnID*/, const SECItem& /*extnValue*/, + /*out*/ bool& understood) { - // TODO: maybe we should check the syntax of the OID value - if (ExpectTagAndSkipValue(input, der::OIDTag) != der::Success) { - return der::Failure; - } - - // The only valid explicit encoding of the value is TRUE, so don't even - // bother parsing it, since we're going to fail either way. - if (input.Peek(der::BOOLEAN)) { - return der::Fail(SEC_ERROR_UNKNOWN_CRITICAL_EXTENSION); - } - - input.SkipToEnd(); - + understood = false; return der::Success; } -// Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension -static der::Result -CheckExtensionsForCriticality(der::Input& input) -{ - // TODO(bug 997994): some responders include an empty SEQUENCE OF - // Extension, which is invalid (der::MayBeEmpty should really be - // der::MustNotBeEmpty). - return der::NestedOf(input, der::SEQUENCE, der::SEQUENCE, - der::EmptyAllowed::Yes, CheckExtensionForCriticality); -} - // 1. The certificate identified in a received response corresponds to // the certificate that was identified in the corresponding request; // 2. The signature on the response is valid; diff --git a/security/pkix/lib/pkixutil.h b/security/pkix/lib/pkixutil.h index 84ad23550d69..d98695ec20db 100644 --- a/security/pkix/lib/pkixutil.h +++ b/security/pkix/lib/pkixutil.h @@ -27,6 +27,7 @@ #include "pkix/enumclass.h" #include "pkix/pkixtypes.h" +#include "pkixder.h" #include "prerror.h" #include "seccomon.h" #include "secerr.h" @@ -123,6 +124,8 @@ public: Result VerifyOwnSignatureWithKey(TrustDomain& trustDomain, const SECItem& subjectPublicKeyInfo) const; + der::Version version; + const SECItem* encodedAuthorityInfoAccess; const SECItem* encodedBasicConstraints; const SECItem* encodedCertificatePolicies; diff --git a/security/pkix/test/gtest/pkixder_pki_types_tests.cpp b/security/pkix/test/gtest/pkixder_pki_types_tests.cpp index ebb486656910..ca581ed1e72e 100644 --- a/security/pkix/test/gtest/pkixder_pki_types_tests.cpp +++ b/security/pkix/test/gtest/pkixder_pki_types_tests.cpp @@ -45,6 +45,7 @@ protected: TEST_F(pkixder_pki_types_tests, AlgorithmIdentifierNoParams) { const uint8_t DER_ALGORITHM_IDENTIFIER_NO_PARAMS[] = { + 0x30/*SEQUENCE*/, 0x06/*LENGTH*/, 0x06, 0x04, 0xde, 0xad, 0xbe, 0xef // OID }; @@ -79,15 +80,12 @@ TEST_F(pkixder_pki_types_tests, AlgorithmIdentifierNullParams) ASSERT_EQ(Success, input.Init(DER_ALGORITHM_IDENTIFIER_NULL_PARAMS, sizeof DER_ALGORITHM_IDENTIFIER_NULL_PARAMS)); - Input nested; - ASSERT_EQ(Success, ExpectTagAndGetValue(input, SEQUENCE, nested)); - const uint8_t expectedAlgorithmID[] = { 0xde, 0xad, 0xbe, 0xef }; SECAlgorithmID algorithmID; - ASSERT_EQ(Success, AlgorithmIdentifier(nested, algorithmID)); + ASSERT_EQ(Success, AlgorithmIdentifier(input, algorithmID)); ASSERT_EQ(sizeof expectedAlgorithmID, algorithmID.algorithm.len); ASSERT_TRUE(memcmp(algorithmID.algorithm.data, expectedAlgorithmID, @@ -169,7 +167,7 @@ TEST_F(pkixder_pki_types_tests, CertificateSerialNumberZeroLength) ASSERT_EQ(SEC_ERROR_BAD_DER, PR_GetError()); } -TEST_F(pkixder_pki_types_tests, OptionalVersionV1) +TEST_F(pkixder_pki_types_tests, OptionalVersionV1ExplicitEncodingNotAllowed) { const uint8_t DER_OPTIONAL_VERSION_V1[] = { 0xa0, 0x03, // context specific 0 @@ -180,11 +178,9 @@ TEST_F(pkixder_pki_types_tests, OptionalVersionV1) ASSERT_EQ(Success, input.Init(DER_OPTIONAL_VERSION_V1, sizeof DER_OPTIONAL_VERSION_V1)); - uint8_t version = 99; - // TODO(bug 982783): An explicit value of 1 is not allowed, because it is not - // the shortest possible encoding! - ASSERT_EQ(Success, OptionalVersion(input, version)); - ASSERT_EQ(v1, version); + Version version; + ASSERT_EQ(Failure, OptionalVersion(input, version)); + ASSERT_EQ(SEC_ERROR_BAD_DER, PR_GetError()); } TEST_F(pkixder_pki_types_tests, OptionalVersionV2) @@ -198,9 +194,9 @@ TEST_F(pkixder_pki_types_tests, OptionalVersionV2) ASSERT_EQ(Success, input.Init(DER_OPTIONAL_VERSION_V2, sizeof DER_OPTIONAL_VERSION_V2)); - uint8_t version = 99; + Version version = Version::v1; ASSERT_EQ(Success, OptionalVersion(input, version)); - ASSERT_EQ(v2, version); + ASSERT_EQ(Version::v2, version); } TEST_F(pkixder_pki_types_tests, OptionalVersionV3) @@ -214,9 +210,9 @@ TEST_F(pkixder_pki_types_tests, OptionalVersionV3) ASSERT_EQ(Success, input.Init(DER_OPTIONAL_VERSION_V3, sizeof DER_OPTIONAL_VERSION_V3)); - uint8_t version = 99; + Version version = Version::v1; ASSERT_EQ(Success, OptionalVersion(input, version)); - ASSERT_EQ(v3, version); + ASSERT_EQ(Version::v3, version); } TEST_F(pkixder_pki_types_tests, OptionalVersionUnknown) @@ -230,9 +226,9 @@ TEST_F(pkixder_pki_types_tests, OptionalVersionUnknown) ASSERT_EQ(Success, input.Init(DER_OPTIONAL_VERSION_INVALID, sizeof DER_OPTIONAL_VERSION_INVALID)); - uint8_t version = 99; - ASSERT_EQ(Success, OptionalVersion(input, version)); - ASSERT_EQ(0x42, version); + Version version = Version::v1; + ASSERT_EQ(Failure, OptionalVersion(input, version)); + ASSERT_EQ(SEC_ERROR_BAD_DER, PR_GetError()); } TEST_F(pkixder_pki_types_tests, OptionalVersionInvalidTooLong) @@ -246,7 +242,7 @@ TEST_F(pkixder_pki_types_tests, OptionalVersionInvalidTooLong) ASSERT_EQ(Success, input.Init(DER_OPTIONAL_VERSION_INVALID_TOO_LONG, sizeof DER_OPTIONAL_VERSION_INVALID_TOO_LONG)); - uint8_t version = 99; + Version version; ASSERT_EQ(Failure, OptionalVersion(input, version)); ASSERT_EQ(SEC_ERROR_BAD_DER, PR_GetError()); } @@ -261,8 +257,8 @@ TEST_F(pkixder_pki_types_tests, OptionalVersionMissing) ASSERT_EQ(Success, input.Init(DER_OPTIONAL_VERSION_MISSING, sizeof DER_OPTIONAL_VERSION_MISSING)); - uint8_t version = 99; + Version version = Version::v3; ASSERT_EQ(Success, OptionalVersion(input, version)); - ASSERT_EQ(v1, version); + ASSERT_EQ(Version::v1, version); } } // unnamed namespace diff --git a/security/pkix/test/lib/pkixtestutil.cpp b/security/pkix/test/lib/pkixtestutil.cpp index 246bd3461d1b..6c9f2a5c2092 100644 --- a/security/pkix/test/lib/pkixtestutil.cpp +++ b/security/pkix/test/lib/pkixtestutil.cpp @@ -722,7 +722,7 @@ TBSCertificate(PLArenaPool* arena, long versionValue, Output output; - if (versionValue != der::v1) { + if (versionValue != static_cast(der::Version::v1)) { SECItem* versionInteger(Integer(arena, versionValue)); if (!versionInteger) { return nullptr; diff --git a/services/healthreport/docs/dataformat.rst b/services/healthreport/docs/dataformat.rst index 5f9770d0a3a4..37452dbfa478 100644 --- a/services/healthreport/docs/dataformat.rst +++ b/services/healthreport/docs/dataformat.rst @@ -1402,6 +1402,36 @@ Example "google.urlbar": 7 }, +org.mozilla.searches.engines +---------------------------- + +This measurement contains information about search engines. + +Version 1 +^^^^^^^^^ + +This version debuted with Firefox 31 on desktop. It contains the +following properties: + +default + Daily string identifier or name of the default search engine provider. + + This field will only be collected if Telemetry is enabled. If + Telemetry is enabled and then later disabled, this field may + disappear from future days in the payload. + + The special value ``NONE`` could occur if there is no default search + engine. + + The special value ``UNDEFINED`` could occur if a default search + engine exists but its identifier could not be determined. + + This field's contents are + ``Services.search.defaultEngine.identifier`` (if defined) or + ``"other-"`` + ``Services.search.defaultEngine.name`` if not. + In other words, search engines without an ``.identifier`` + are prefixed with ``other-``. + org.mozilla.sync.sync --------------------- @@ -1639,13 +1669,22 @@ lastActive ID of the final Telemetry Experiment that is active on a given day, if any. +Version 2 +^^^^^^^^^ + +Adds an additional optional property: + +lastActiveBranch + If the experiment uses branches, the branch identifier string. + Example ^^^^^^^ :: "org.mozilla.experiments.info": { - "_v": 1, - "lastActive": "some.experiment.id" + "_v": 2, + "lastActive": "some.experiment.id", + "lastActiveBranch": "control" } diff --git a/services/healthreport/providers.jsm b/services/healthreport/providers.jsm index a01a70ea3a8c..acb6e71856ab 100644 --- a/services/healthreport/providers.jsm +++ b/services/healthreport/providers.jsm @@ -55,10 +55,15 @@ const LAST_NUMERIC_FIELD = {type: Metrics.Storage.FIELD_LAST_NUMERIC}; const LAST_TEXT_FIELD = {type: Metrics.Storage.FIELD_LAST_TEXT}; const DAILY_DISCRETE_NUMERIC_FIELD = {type: Metrics.Storage.FIELD_DAILY_DISCRETE_NUMERIC}; const DAILY_LAST_NUMERIC_FIELD = {type: Metrics.Storage.FIELD_DAILY_LAST_NUMERIC}; +const DAILY_LAST_TEXT_FIELD = {type: Metrics.Storage.FIELD_DAILY_LAST_TEXT}; const DAILY_COUNTER_FIELD = {type: Metrics.Storage.FIELD_DAILY_COUNTER}; const TELEMETRY_PREF = "toolkit.telemetry.enabled"; +function isTelemetryEnabled(prefs) { + return prefs.get(TELEMETRY_PREF, false); +} + /** * Represents basic application state. * @@ -353,7 +358,7 @@ AppInfoProvider.prototype = Object.freeze({ }, _recordIsTelemetryEnabled: function (m) { - let enabled = TELEMETRY_PREF && this._prefs.get(TELEMETRY_PREF, false); + let enabled = isTelemetryEnabled(this._prefs); this._log.debug("Recording telemetry enabled (" + TELEMETRY_PREF + "): " + enabled); yield m.setDailyLastNumeric("isTelemetryEnabled", enabled ? 1 : 0); }, @@ -1282,8 +1287,25 @@ SearchCountMeasurement3.prototype = Object.freeze({ }, }); +function SearchEnginesMeasurement1() { + Metrics.Measurement.call(this); +} + +SearchEnginesMeasurement1.prototype = Object.freeze({ + __proto__: Metrics.Measurement.prototype, + + name: "engines", + version: 1, + + fields: { + default: DAILY_LAST_TEXT_FIELD, + }, +}); + this.SearchesProvider = function () { Metrics.Provider.call(this); + + this._prefs = new Preferences({defaultBranch: null}); }; this.SearchesProvider.prototype = Object.freeze({ @@ -1294,6 +1316,7 @@ this.SearchesProvider.prototype = Object.freeze({ SearchCountMeasurement1, SearchCountMeasurement2, SearchCountMeasurement3, + SearchEnginesMeasurement1, ], /** @@ -1308,6 +1331,36 @@ this.SearchesProvider.prototype = Object.freeze({ return deferred.promise; }, + collectDailyData: function () { + return this.storage.enqueueTransaction(function getDaily() { + // We currently only record this if Telemetry is enabled. + if (!isTelemetryEnabled(this._prefs)) { + return; + } + + let m = this.getMeasurement(SearchEnginesMeasurement1.prototype.name, + SearchEnginesMeasurement1.prototype.version); + + let engine; + try { + engine = Services.search.defaultEngine; + } catch (e) {} + let name; + + if (!engine) { + name = "NONE"; + } else if (engine.identifier) { + name = engine.identifier; + } else if (engine.name) { + name = "other-" + engine.name; + } else { + name = "UNDEFINED"; + } + + yield m.setDailyLastText("default", name); + }.bind(this)); + }, + /** * Record that a search occurred. * diff --git a/services/healthreport/tests/xpcshell/test_provider_searches.js b/services/healthreport/tests/xpcshell/test_provider_searches.js index 0cdf1bb52d0d..54aa9dde908a 100644 --- a/services/healthreport/tests/xpcshell/test_provider_searches.js +++ b/services/healthreport/tests/xpcshell/test_provider_searches.js @@ -6,6 +6,7 @@ const {utils: Cu} = Components; Cu.import("resource://gre/modules/Metrics.jsm"); +Cu.import("resource://gre/modules/Services.jsm"); let bsp = Cu.import("resource://gre/modules/services/healthreport/providers.jsm"); const DEFAULT_ENGINES = [ @@ -41,7 +42,7 @@ add_test(function test_constructor() { run_next_test(); }); -add_task(function test_record() { +add_task(function* test_record() { let storage = yield Metrics.Storage("record"); let provider = new MockSearchesProvider(); @@ -104,7 +105,7 @@ add_task(function test_record() { yield storage.close(); }); -add_task(function test_includes_other_fields() { +add_task(function* test_includes_other_fields() { let storage = yield Metrics.Storage("includes_other_fields"); let provider = new MockSearchesProvider(); @@ -134,3 +135,50 @@ add_task(function test_includes_other_fields() { yield storage.close(); }); + +add_task(function* test_default_search_engine() { + let storage = yield Metrics.Storage("default_search_engine"); + let provider = new SearchesProvider(); + yield provider.init(storage); + + let m = provider.getMeasurement("engines", 1); + + // Ensure no collection if Telemetry not enabled. + Services.prefs.setBoolPref("toolkit.telemetry.enabled", false); + + let now = new Date(); + yield provider.collectDailyData(); + + let data = yield m.getValues(); + Assert.equal(data.days.hasDay(now), false); + + // Now enable telemetry and ensure we populate. + Services.prefs.setBoolPref("toolkit.telemetry.enabled", true); + + yield provider.collectDailyData(); + data = yield m.getValues(); + Assert.ok(data.days.hasDay(now)); + + let day = data.days.getDay(now); + Assert.equal(day.size, 1); + Assert.ok(day.has("default")); + + // test environment doesn't have a default engine. + Assert.equal(day.get("default"), "NONE"); + + Services.search.addEngineWithDetails("testdefault", + "http://localhost/icon.png", + null, + "test description", + "GET", + "http://localhost/search/%s"); + let engine1 = Services.search.getEngineByName("testdefault"); + Assert.ok(engine1); + Services.search.defaultEngine = engine1; + + yield provider.collectDailyData(); + data = yield m.getValues(); + Assert.equal(data.days.getDay(now).get("default"), "other-testdefault"); + + yield storage.close(); +}); diff --git a/testing/gtest/Makefile.in b/testing/gtest/Makefile.in index 925ebd49ebaf..523ea17ab8f1 100644 --- a/testing/gtest/Makefile.in +++ b/testing/gtest/Makefile.in @@ -9,9 +9,7 @@ include $(topsrcdir)/config/rules.mk # Bug 1028035: Linking xul-gtest.dll takes too long, so we disable GTest on # Windows PGO builds. -# Bug 1029469: fix_stack_using_bpsyms.py doesn't know how to deal with the -# second xul.pdb file that linking xul-gtest.dll creates. -ifeq (WINNT,$(OS_ARCH)) +ifeq (1_WINNT,$(MOZ_PGO)_$(OS_ARCH)) SKIP_GTEST_DURING_MAKE_CHECK ?= 1 endif diff --git a/testing/mochitest/android23.json b/testing/mochitest/android23.json index d4f4f371bbc1..d97f45fcc799 100644 --- a/testing/mochitest/android23.json +++ b/testing/mochitest/android23.json @@ -5,6 +5,9 @@ "content/canvas/test/webgl-conformance": "bug 865443 - separate suite -- mochitest-gl", "content/media/test": "Android 2.3 only; bug 981898", "content/media/webaudio/test": "Android 2.3 only; bug 981889", - "dom/media/tests/mochitest":"Android 2.3 only; bug 981881" + "docshell/test/navigation/test_reserved.html": "too slow on Android 2.3 aws only; bug 1030403", + "dom/media/tests/mochitest": "Android 2.3 only; bug 981881", + "layout/style/test/test_media_queries.html": "Android 2.3 aws only; bug 1030419", + "layout/style/test/test_transitions_cancel_near_end.html": "Android 2.3 aws only; bug 1030432" } } diff --git a/testing/mozbase/docs/mozdevice.rst b/testing/mozbase/docs/mozdevice.rst index 6e10cb990edd..c716896bdc0d 100644 --- a/testing/mozbase/docs/mozdevice.rst +++ b/testing/mozbase/docs/mozdevice.rst @@ -1,11 +1,19 @@ :mod:`mozdevice` --- Interact with remote devices ================================================= -Mozdevice provides an interface to interact with a remote device such -as an Android- or FirefoxOS-based phone connected to a -host machine. Currently there are two implementations of the interface: one -uses a custom TCP-based protocol to communicate with a server running -on the device, another uses Android's adb utility. +Mozdevice provides several interfaces to interact with a remote device +such as an Android- or FirefoxOS-based phone. It allows you to push +files to these types of devices, launch processes, and more. There are +currently two available interfaces: + +* DeviceManager: an interface to a device that works either via ADB or + a custom TCP protocol (the latter requires an agent application + running on the device). +* ADB: a similar interface that uses Android Debugger Protocol + explicitly + +In general, new code should use the ADB abstraction where possible as +it is simpler and more reliable. .. automodule:: mozdevice @@ -119,3 +127,109 @@ and DeviceManagerSUT. Here is the interface for DroidADB: .. automethod:: mozdevice.DroidADB.getInstalledApps These methods are also found in the DroidSUT class. + +ADB Interface +------------- + +The following classes provide a basic interface to interact with the +Android Debug Tool (adb) and Android-based devices. It is intended to +provide the basis for a replacement for DeviceManager and +DeviceManagerADB. + +ADBCommand +`````````` + +.. autoclass:: mozdevice.ADBCommand + +.. automethod:: ADBCommand.command(self, cmds, timeout=None) +.. automethod:: ADBCommand.command_output(self, cmds, timeout=None) + +ADBHost +``````` +.. autoclass:: mozdevice.ADBHost + +.. automethod:: ADBHost.command(self, cmds, timeout=None) +.. automethod:: ADBHost.command_output(self, cmds, timeout=None) +.. automethod:: ADBHost.start_server(self, timeout=None) +.. automethod:: ADBHost.kill_server(self, cmds, timeout=None) +.. automethod:: ADBHost.devices(self, timeout=None) + +ADBDevice +````````` +.. autoclass:: mozdevice.ADBDevice + +Host Command methods +++++++++++++++++++++ +.. automethod:: ADBDevice.command(self, cmds, timeout=None) +.. automethod:: ADBDevice.command_output(self, cmds, timeout=None) + +Device Shell methods +++++++++++++++++++++ +.. automethod:: ADBDevice.shell(self, cmd, env=None, cwd=None, timeout=None, root=False) +.. automethod:: ADBDevice.shell_bool(self, cmd, env=None, cwd=None, timeout=None, root=False) +.. automethod:: ADBDevice.shell_output(self, cmd, env=None, cwd=None, timeout=None, root=False) + +Informational methods ++++++++++++++++++++++ +.. automethod:: ADBDevice.clear_logcat(self, timeout=None) +.. automethod:: ADBDevice.get_logcat(self, filterSpecs=["dalvikvm:I", "ConnectivityService:S", "WifiMonitor:S", "WifiStateTracker:S", "wpa_supplicant:S", "NetworkStateTracker:S"], format="time", filter_out_regexps=[], timeout=None) +.. automethod:: ADBDevice.get_prop(self, prop, timeout=None) +.. automethod:: ADBDevice.get_state(self, timeout=None) + +File management methods ++++++++++++++++++++++++ +.. automethod:: ADBDevice.chmod(self, path, recursive=False, mask="777", timeout=None, root=False) +.. automethod:: ADBDevice.exists(self, path, timeout=None, root=False) +.. automethod:: ADBDevice.is_dir(self, path, timeout=None, root=False) +.. automethod:: ADBDevice.is_file(self, path, timeout=None, root=False) +.. automethod:: ADBDevice.list_files(self, path, timeout=None, root=False) +.. automethod:: ADBDevice.mkdir(self, path, parents=False, timeout=None, root=False) +.. automethod:: ADBDevice.push(self, local, remote, timeout=None) +.. automethod:: ADBDevice.rm(self, path, recursive=False, force=False, timeout=None, root=False) +.. automethod:: ADBDevice.rmdir(self, path, timeout=None, root=False) + +Process management methods +++++++++++++++++++++++++++ +.. automethod:: ADBDevice.get_process_list(self, timeout=None) +.. automethod:: ADBDevice.kill(self, pids, sig=None, attempts=3, wait=5, timeout=None, root=False) +.. automethod:: ADBDevice.pkill(self, appname, sig=None, attempts=3, wait=5, timeout=None, root=False) +.. automethod:: ADBDevice.process_exist(self, process_name, timeout=None) + + +ADBAndroid +`````````` +.. autoclass:: ADBAndroid + +System control methods +++++++++++++++++++++++ +.. automethod:: ADBAndroid.is_device_ready(self, timeout=None) +.. automethod:: ADBAndroid.power_on(self, timeout=None) +.. automethod:: ADBAndroid.reboot(self, timeout=None) + +Application management methods +++++++++++++++++++++++++++++++ +.. automethod:: ADBAndroid.install_app(self, apk_path, timeout=None) +.. automethod:: ADBAndroid.is_app_installed(self, app_name, timeout=None) +.. automethod:: ADBAndroid.launch_application(self, app_name, activity_name, intent, url=None, extras=None, wait=True, fail_if_running=True, timeout=None) +.. automethod:: ADBAndroid.launch_fennec(self, app_name, intent="android.intent.action.VIEW", moz_env=None, extra_args=None, url=None, wait=True, fail_if_running=True, timeout=None) +.. automethod:: ADBAndroid.stop_application(self, app_name, timeout=None, root=False) +.. automethod:: ADBAndroid.uninstall_app(self, app_name, reboot=False, timeout=None) +.. automethod:: ADBAndroid.update_app(self, apk_path, timeout=None) + + +ADBProcess +`````````` +.. autoclass:: mozdevice.ADBProcess + +ADBError +```````` +.. autoexception:: mozdevice.ADBError + +ADBRootError +```````````` +.. autoexception:: mozdevice.ADBRootError + +ADBTimeoutError +``````````````` +.. autoexception:: mozdevice.ADBTimeoutError + diff --git a/testing/mozbase/mozdevice/mozdevice/__init__.py b/testing/mozbase/mozdevice/mozdevice/__init__.py index ea11ab985b7b..a33bad2c9fc3 100644 --- a/testing/mozbase/mozdevice/mozdevice/__init__.py +++ b/testing/mozbase/mozdevice/mozdevice/__init__.py @@ -2,6 +2,8 @@ # 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 adb import ADBError, ADBRootError, ADBTimeoutError, ADBProcess, ADBCommand, ADBHost, ADBDevice +from adb_android import ADBAndroid from devicemanager import DeviceManager, DMError, ZeroconfListener from devicemanagerADB import DeviceManagerADB from devicemanagerSUT import DeviceManagerSUT diff --git a/testing/mozbase/mozdevice/mozdevice/adb.py b/testing/mozbase/mozdevice/mozdevice/adb.py new file mode 100644 index 000000000000..49623d3a8077 --- /dev/null +++ b/testing/mozbase/mozdevice/mozdevice/adb.py @@ -0,0 +1,1387 @@ +# 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 logging +import os +import posixpath +import re +import subprocess +import tempfile +import time + +class ADBProcess(object): + """ADBProcess encapsulates the data related to executing the adb process. + + """ + def __init__(self, args): + #: command argument argument list. + self.args = args + #: Temporary file handle to be used for stdout. + self.stdout_file = tempfile.TemporaryFile() + #: Temporary file handle to be used for stderr. + self.stderr_file = tempfile.TemporaryFile() + #: boolean indicating if the command timed out. + self.timedout = None + #: exitcode of the process. + self.exitcode = None + #: subprocess Process object used to execute the command. + self.proc = subprocess.Popen(args, + stdout=self.stdout_file, + stderr=self.stderr_file) + + @property + def stdout(self): + """Return the contents of stdout.""" + if not self.stdout_file or self.stdout_file.closed: + content = "" + else: + self.stdout_file.seek(0, os.SEEK_SET) + content = self.stdout_file.read().rstrip() + return content + + @property + def stderr(self): + """Return the contents of stderr.""" + if not self.stderr_file or self.stderr_file.closed: + content = "" + else: + self.stderr_file.seek(0, os.SEEK_SET) + content = self.stderr_file.read().rstrip() + return content + + def __str__(self): + return ('args: %s, exitcode: %s, stdout: %s, stderr: %s' % ( + ' '.join(self.args), self.exitcode, self.stdout, self.stderr)) + +# ADBError, ADBRootError, and ADBTimeoutError are treated +# differently in order that unhandled ADBRootErrors and +# ADBTimeoutErrors can be handled distinctly from ADBErrors. + +class ADBError(Exception): + """ADBError is raised in situations where a command executed on a + device either exited with a non-zero exitcode or when an + unexpected error condition has occurred. Generally, ADBErrors can + be handled and the device can continue to be used. + + """ + pass + +class ADBRootError(Exception): + """ADBRootError is raised when a shell command is to be executed as + root but the device does not support it. This error is fatal since + there is no recovery possible by the script. You must either root + your device or change your scripts to not require running as root. + + """ + pass + +class ADBTimeoutError(Exception): + """ADBTimeoutError is raised when either a host command or shell + command takes longer than the specified timeout to execute. The + timeout value is set in the ADBCommand constructor and is 300 seconds by + default. This error is typically fatal since the host is having + problems communicating with the device. You may be able to recover + by rebooting, but this is not guaranteed. + + Recovery options are: + + * Killing and restarting the adb server via + :: + + adb kill-server; adb start-server + + * Rebooting the device manually. + * Rebooting the host. + + """ + pass + + +class ADBCommand(object): + """ADBCommand provides a basic interface to adb commands. + + :: + + from mozdevice import ADBCommand + + adbcommand = ADBCommand(...) + print adbcommand.command_output(["devices"]) + + + """ + + def __init__(self, + adb='adb', + logger_name='adb', + log_level=logging.INFO, + timeout=300): + """Initializes the ADBCommand object. + + :param adb: path to adb executable. Defaults to 'adb'. + :param logger_name: logging logger name. Defaults to 'adb'. + :param log_level: logging level. Defaults to logging.INFO. + + :raises: * ADBError + * ADBTimeoutError + + """ + self._logger = logging.getLogger(logger_name) + self._adb_path = adb + self._log_level = log_level + self._timeout = timeout + self._polling_interval = 0.1 + + self._logger.debug("ADBCommand: %s" % self.__dict__) + + # Host Command methods + + def command(self, cmds, device_serial=None, timeout=None): + """Executes an adb command on the host. + + :param cmds: list containing the command and its arguments to be + executed. + :param device_serial: optional string specifying the device' + serial number if the adb command is to be executed against + a specific device. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. This timeout is per adb call. The + total time spent may exceed this value. If it is not + specified, the value set in the ADBCommand constructor is used. + :returns: :class:`mozdevice.ADBProcess` + + command() provides a low level interface for executing + commands on the host via adb. + + For commands targeting specific devices, ADBDevice.command is + preferred. To execute shell commands on specific devices, + ADBDevice.shell is preferred. + + The caller provides a list containing commands, as well as a + timeout period in seconds. + + A subprocess is spawned to execute adb with stdout and stderr + directed to named temporary files. If the process takes longer + than the specified timeout, the process is terminated. + + It is the caller's responsibilty to clean up by closing + the stdout and stderr temporary files. + + """ + args = [self._adb_path] + if device_serial: + args.extend(['-s', device_serial, 'wait-for-device']) + args.extend(cmds) + + adb_process = ADBProcess(args) + + if timeout is None: + timeout = self._timeout + + timeout = int(timeout) + start_time = time.time() + adb_process.exitcode = adb_process.proc.poll() + while ((time.time() - start_time) <= timeout and + adb_process.exitcode == None): + time.sleep(self._polling_interval) + adb_process.exitcode = adb_process.proc.poll() + if adb_process.exitcode == None: + adb_process.proc.kill() + adb_process.timedout = True + adb_process.exitcode = adb_process.proc.poll() + + adb_process.stdout_file.seek(0, os.SEEK_SET) + adb_process.stderr_file.seek(0, os.SEEK_SET) + + return adb_process + + def command_output(self, cmds, device_serial=None, timeout=None): + """Executes an adb command on the host returning stdout. + + :param cmds: list containing the command and its arguments to be + executed. + :param device_serial: optional string specifying the device' + serial number if the adb command is to be executed against + a specific device. + :param timeout: optional integer specifying the maximum time in seconds + for any spawned adb process to complete before throwing + an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADBCommand constructor is used. + :returns: string - content of stdout. + + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBError - raised if the command exits with a + non-zero exit code. + + """ + adb_process = None + try: + # Need to force the use of the ADBCommand class's command + # since ADBDevice will redefine command and call its + # own version otherwise. + adb_process = ADBCommand.command(self, cmds, + device_serial=device_serial, + timeout=timeout) + if adb_process.timedout: + raise ADBTimeoutError("%s" % adb_process) + elif adb_process.exitcode: + raise ADBError("%s" % adb_process) + output = adb_process.stdout_file.read().rstrip() + self._logger.debug('command_output: %s, ' + 'timeout: %s, ' + 'timedout: %s, ' + 'exitcode: %s, output: %s' % + (' '.join(adb_process.args), + timeout, + adb_process.timedout, + adb_process.exitcode, + output)) + return output + finally: + if adb_process and isinstance(adb_process.stdout_file, file): + adb_process.stdout_file.close() + adb_process.stderr_file.close() + + +class ADBHost(ADBCommand): + """ADBHost provides a basic interface to adb host commands. + + :: + + from mozdevice import ADBHost + + adbhost = ADBHost(...) + adbhost.start_server() + + """ + def start_server(self, timeout=None): + """Starts the adb server. + + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. This timeout is per adb call. The + total time spent may exceed this value. If it is not + specified, the value set in the ADBHost constructor is used. + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBError - raised if the command exits with a + non-zero exit code. + + """ + self.command_output(["start-server"], timeout=timeout) + + def kill_server(self, timeout=None): + """Kills the adb server. + + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. This timeout is per adb call. The + total time spent may exceed this value. If it is not + specified, the value set in the ADBHost constructor is used. + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBError - raised if the command exits with a + non-zero exit code. + + """ + self.command_output(["kill-server"], timeout=timeout) + + def devices(self, timeout=None): + """Executes adb devices -l and returns a list of objects describing attached devices. + + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. This timeout is per adb call. The + total time spent may exceed this value. If it is not + specified, the value set in the ADBHost constructor is used. + :returns: an object contain + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBError - raised if the command exits with a + non-zero exit code. + + The output of adb devices -l :: + + $ adb devices -l + List of devices attached + b313b945 device usb:1-7 product:d2vzw model:SCH_I535 device:d2vzw + + is parsed and placed into an object as in + + [{'device_serial': 'b313b945', 'state': 'device', 'product': 'd2vzw', + 'usb': '1-7', 'device': 'd2vzw', 'model': 'SCH_I535' }] + + """ + # b313b945 device usb:1-7 product:d2vzw model:SCH_I535 device:d2vzw + # from Android system/core/adb/transport.c statename() + re_device_info = re.compile(r'([^\s]+)\s+(offline|bootloader|device|host|recovery|sideload|no permissions|unauthorized|unknown)') + devices = [] + lines = self.command_output(["devices", "-l"], timeout=timeout).split('\n') + for line in lines: + if line == 'List of devices attached ': + continue + match = re_device_info.match(line) + if match: + device = { + 'device_serial': match.group(1), + 'state': match.group(2) + } + remainder = line[match.end(2):].strip() + if remainder: + try: + device.update(dict([j.split(':') + for j in remainder.split(' ')])) + except ValueError: + self._logger.warning('devices: Unable to parse ' + 'remainder for device %s' % line) + devices.append(device) + return devices + +class ADBDevice(ADBCommand): + """ADBDevice provides methods which can be used to interact with + Android-based devices. + + Android specific features such as Application management are not + included but are provided via the ADBAndroid interface. + + :: + + from mozdevice import ADBDevice + + adbdevice = ADBDevice(...) + print adbdevice.list_files("/mnt/sdcard") + if adbdevice.process_exist("org.mozilla.fennec"): + print "Fennec is running" + + """ + + def __init__(self, device_serial, + adb='adb', + test_root='', + logger_name='adb', + log_level=logging.INFO, + timeout=300, + device_ready_retry_wait=20, + device_ready_retry_attempts=3): + """Initializes the ADBDevice object. + + :param device_serial: adb serial number of the device. + :param adb: path to adb executable. Defaults to 'adb'. + :param logger_name: logging logger name. Defaults to 'adb'. + :param log_level: logging level. Defaults to logging.INFO. + :param device_ready_retry_wait: number of seconds to wait + between attempts to check if the device is ready after a + reboot. + :param device_ready_retry_attempts: number of attempts when + checking if a device is ready. + + :raises: * ADBError + * ADBTimeoutError + + """ + ADBCommand.__init__(self, adb=adb, logger_name=logger_name, + log_level=log_level, + timeout=timeout) + self._device_serial = device_serial + self.test_root = test_root + self._device_ready_retry_wait = device_ready_retry_wait + self._device_ready_retry_attempts = device_ready_retry_attempts + self._have_root_shell = False + self._have_su = False + self._have_android_su = False + + uid = 'uid=0' + cmd_id = 'LD_LIBRARY_PATH=/vendor/lib:/system/lib id' + # Is shell already running as root? + # Catch exceptions due to the potential for segfaults + # calling su when using an improperly rooted device. + try: + if self.shell_output("id").find(uid) != -1: + self._have_root_shell = True + except ADBError: + self._logger.exception('ADBDevice.__init__: id') + # Do we have a 'Superuser' sh like su? + try: + if self.shell_output("su -c '%s'" % cmd_id).find(uid) != -1: + self._have_su = True + except ADBError: + self._logger.exception('ADBDevice.__init__: id') + # Do we have Android's su? + try: + if self.shell_output("su 0 id").find(uid) != -1: + self._have_android_su = True + except ADBError: + self._logger.exception('ADBDevice.__init__: id') + + self._mkdir_p = None + # Force the use of /system/bin/ls or /system/xbin/ls in case + # there is /sbin/ls which embeds ansi escape codes to colorize + # the output. Detect if we are using busybox ls. We want each + # entry on a single line and we don't want . or .. + if self.shell_bool("/system/bin/ls /"): + self._ls = "/system/bin/ls" + elif self.shell_bool("/system/xbin/ls /"): + self._ls = "/system/xbin/ls" + else: + raise ADBError("ADBDevice.__init__: ls not found") + try: + self.shell_output("%s -1A /" % self._ls) + self._ls += " -1A" + except ADBError: + self._ls += " -a" + + self._logger.debug("ADBDevice: %s" % self.__dict__) + + self._setup_test_root() + + @staticmethod + def _escape_command_line(cmd): + """Utility function to return escaped and quoted version of command + line. + + """ + quoted_cmd = [] + + for arg in cmd: + arg.replace('&', '\&') + + needs_quoting = False + for char in [' ', '(', ')', '"', '&']: + if arg.find(char) >= 0: + needs_quoting = True + break + if needs_quoting: + arg = "'%s'" % arg + + quoted_cmd.append(arg) + + return " ".join(quoted_cmd) + + @staticmethod + def _get_exitcode(file_obj): + """Get the exitcode from the last line of the file_obj for shell + commands. + + """ + file_obj.seek(0, os.SEEK_END) + + line = '' + length = file_obj.tell() + offset = 1 + while length - offset >= 0: + file_obj.seek(-offset, os.SEEK_END) + char = file_obj.read(1) + if not char: + break + if char != '\r' and char != '\n': + line = char + line + elif line: + # we have collected everything up to the beginning of the line + break + offset += 1 + + match = re.match(r'rc=([0-9]+)', line) + if match: + exitcode = int(match.group(1)) + file_obj.seek(-1, os.SEEK_CUR) + file_obj.truncate() + else: + exitcode = None + + return exitcode + + def _setup_test_root(self, timeout=None, root=False): + """setup the device root and cache its value + + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADBDevice constructor is used. + :param root: optional boolean specifying if the command should + be executed as root. + :raises: * ADBTimeoutError + * ADBRootError - raised if root is requested but the + device is not rooted. + * ADBError + + """ + # In order to catch situations where the file + # system is temporily read only, attempt to + # remove the old test root if it exists, then + # recreate it. + if self.test_root: + for attempt in range(3): + try: + if self.is_dir(self.test_root, timeout=timeout, root=root): + self.rm(self.test_root, recursive=True, timeout=timeout, root=root) + self.mkdir(self.test_root, timeout=timeout, root=root) + return + except: + self._logger.exception("Attempt %d of 3 failed to create device root %s" % + (attempt+1, self.test_root)) + time.sleep(20) + raise ADBError('Unable to set test root to %s' % self.test_root) + + paths = [('/mnt/sdcard', 'tests'), + ('/data/local', 'tests')] + for (base_path, sub_path) in paths: + if self.is_dir(base_path, timeout=timeout, root=root): + test_root = os.path.join(base_path, sub_path) + for attempt in range(3): + try: + if self.is_dir(test_root): + self.rm(test_root, recursive=True, timeout=timeout, root=root) + self.mkdir(test_root, timeout=timeout, root=root) + self.test_root = test_root + return + except: + self._logger.exception('_setup_test_root: ' + 'Attempt %d of 3 failed to set test_root to %s' % + (attempt+1, test_root)) + time.sleep(20) + + raise ADBError("Unable to set up device root using paths: [%s]" + % ", ".join(["'%s'" % os.path.join(b, s) + for b, s in paths])) + + # Host Command methods + + def command(self, cmds, timeout=None): + """Executes an adb command on the host. + + :param cmds: list containing the command and its arguments to be + executed. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. This timeout is per adb call. The + total time spent may exceed this value. If it is not + specified, the value set in the ADBDevice constructor is used. + :returns: :class:`mozdevice.ADBProcess` + + command() provides a low level interface for executing + commands on the host via adb. For executing shell commands on + the device, use ADBDevice.shell(). The caller provides a list + containing commands, as well as a timeout period in seconds. + + A subprocess is spawned to execute adb for the device with + stdout and stderr directed to named temporary files. If the + process takes longer than the specified timeout, the process + is terminated. + + It is the caller's responsibilty to clean up by closing + the stdout and stderr temporary files. + + """ + + return ADBCommand.command(self, cmds, + device_serial=self._device_serial, + timeout=timeout) + + def command_output(self, cmds, timeout=None): + """Executes an adb command on the host returning stdout. + + + :param cmds: list containing the command and its arguments to be + executed. + :param timeout: optional integer specifying the maximum time in seconds + for any spawned adb process to complete before throwing + an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADBDevice constructor is used. + :returns: string - content of stdout. + + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBError - raised if the command exits with a + non-zero exit code. + + """ + return ADBCommand.command_output(self, cmds, + device_serial=self._device_serial, + timeout=timeout) + + # Device Shell methods + + def shell(self, cmd, env=None, cwd=None, timeout=None, root=False): + """Executes a shell command on the device. + + :param cmd: string containing the command to be executed. + :param env: optional dictionary of environment variables and + their values. + :param cwd: optional string containing the directory from which + to execute. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. This timeout is per adb call. The + total time spent may exceed this value. If it is not + specified, the value set in the ADBDevice constructor is used. + :param root: optional boolean specifying if the command should + be executed as root. + :returns: :class:`mozdevice.ADBProcess` + :raises: ADBRootError - raised if root is requested but the + device is not rooted. + + shell() provides a low level interface for executing commands + on the device via adb shell. the caller provides a flag + indicating if the command is to be executed as root, a string + for any requested working directory, a hash defining the + environment, a string containing shell commands, as well as a + timeout period in seconds. + + The command line to be executed is created to set the current + directory, set the required environment variables, optionally + execute the command using su and to output the return code of + the command to stdout. The command list is created as a + command sequence separated by && which will terminate the + command sequence on the first command which returns a non-zero + exit code. + + A subprocess is spawned to execute adb shell for the device + with stdout and stderr directed to temporary files. If the + process takes longer than the specified timeout, the process + is terminated. The return code is extracted from the stdout + and is then removed from the file. + + It is the caller's responsibilty to clean up by closing + the stdout and stderr temporary files. + """ + if root: + ld_library_path='LD_LIBRARY_PATH=/vendor/lib:/system/lib' + cmd = '%s %s' % (ld_library_path, cmd) + if self._have_root_shell: + pass + elif self._have_su: + cmd = "su -c \"%s\"" % cmd + elif self._have_android_su: + cmd = "su 0 \"%s\"" % cmd + else: + raise ADBRootError('Can not run command %s as root!' % cmd) + + # prepend cwd and env to command if necessary + if cwd: + cmd = "cd %s && %s" % (cwd, cmd) + if env: + envstr = '&& '.join(map(lambda x: 'export %s=%s' % + (x[0], x[1]), env.iteritems())) + cmd = envstr + "&& " + cmd + cmd += "; echo rc=$?" + + args = [self._adb_path] + if self._device_serial: + args.extend(['-s', self._device_serial]) + args.extend(["wait-for-device", "shell", cmd]) + + adb_process = ADBProcess(args) + + if timeout is None: + timeout = self._timeout + + timeout = int(timeout) + start_time = time.time() + exitcode = adb_process.proc.poll() + while ((time.time() - start_time) <= timeout) and exitcode == None: + time.sleep(self._polling_interval) + exitcode = adb_process.proc.poll() + if exitcode == None: + adb_process.proc.kill() + adb_process.timedout = True + adb_process.exitcode = adb_process.proc.poll() + else: + adb_process.exitcode = self._get_exitcode(adb_process.stdout_file) + + adb_process.stdout_file.seek(0, os.SEEK_SET) + adb_process.stderr_file.seek(0, os.SEEK_SET) + + return adb_process + + def shell_bool(self, cmd, env=None, cwd=None, timeout=None, root=False): + """Executes a shell command on the device returning True on success + and False on failure. + + :param cmd: string containing the command to be executed. + :param env: optional dictionary of environment variables and + their values. + :param cwd: optional string containing the directory from which + to execute. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADBDevice constructor is used. + :param root: optional boolean specifying if the command should + be executed as root. + :returns: boolean + + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBRootError - raised if root is requested but the + device is not rooted. + + """ + adb_process = None + try: + adb_process = self.shell(cmd, env=env, cwd=cwd, + timeout=timeout, root=root) + if adb_process.timedout: + raise ADBTimeoutError("%s" % adb_process) + return adb_process.exitcode == 0 + finally: + if adb_process: + adb_process.stdout_file.close() + adb_process.stderr_file.close() + + def shell_output(self, cmd, env=None, cwd=None, timeout=None, root=False): + """Executes an adb shell on the device returning stdout. + + :param cmd: string containing the command to be executed. + :param env: optional dictionary of environment variables and + their values. + :param cwd: optional string containing the directory from which + to execute. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. This timeout is per + adb call. The total time spent may exceed this + value. If it is not specified, the value set + in the ADBDevice constructor is used. :param root: + optional boolean specifying if the command + should be executed as root. + :returns: string - content of stdout. + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBRootError - raised if root is requested but the + device is not rooted. + * ADBError - raised if the command exits with a + non-zero exit code. + + """ + adb_process = None + try: + adb_process = self.shell(cmd, env=env, cwd=cwd, + timeout=timeout, root=root) + if adb_process.timedout: + raise ADBTimeoutError("%s" % adb_process) + elif adb_process.exitcode: + raise ADBError("%s" % adb_process) + output = adb_process.stdout_file.read().rstrip() + self._logger.debug('shell_output: %s, ' + 'timeout: %s, ' + 'root: %s, ' + 'timedout: %s, ' + 'exitcode: %s, ' + 'output: %s' % + (' '.join(adb_process.args), + timeout, + root, + adb_process.timedout, + adb_process.exitcode, + output)) + return output + finally: + if adb_process and isinstance(adb_process.stdout_file, file): + adb_process.stdout_file.close() + adb_process.stderr_file.close() + + # Informational methods + + def clear_logcat(self, timeout=None): + """Clears logcat via adb logcat -c. + + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. This timeout is per + adb call. The total time spent may exceed this + value. If it is not specified, the value set + in the ADBDevice constructor is used. + :raises: * ADBTimeoutError - raised if adb logcat takes longer than + timeout seconds. + * ADBError - raised if adb logcat exits with a non-zero + exit code. + + """ + self.command_output(["logcat", "-c"], timeout=timeout) + + def get_logcat(self, + filter_specs=[ + "dalvikvm:I", + "ConnectivityService:S", + "WifiMonitor:S", + "WifiStateTracker:S", + "wpa_supplicant:S", + "NetworkStateTracker:S"], + format="time", + filter_out_regexps=[], + timeout=None): + """Returns the contents of the logcat file as a list of strings. + + :param filter_specs: optional list containing logcat messages to + be included. + :param format: optional logcat format. + :param filterOutRexps: optional list of logcat messages to be + excluded. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADBDevice constructor is used. + :returns: list of lines logcat output. + :raises: * ADBTimeoutError - raised if adb logcat takes longer than + timeout seconds. + * ADBError - raised if adb logcat exits with a non-zero + exit code. + + """ + cmds = ["logcat", "-v", format, "-d"] + filter_specs + lines = self.command_output(cmds, timeout=timeout).split('\r') + + for regex in filter_out_regexps: + lines = [line for line in lines if not re.search(regex, line)] + + return lines + + def get_prop(self, prop, timeout=None): + """Gets value of a property from the device via adb shell getprop. + + :param prop: string containing the propery name. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADBDevice constructor is used. + :returns: string value of property. + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBError - raised if adb shell getprop exits with a + non-zero exit code. + + """ + output = self.shell_output('getprop %s' % prop, timeout=timeout) + return output + + def get_state(self, timeout=None): + """Returns the device's state via adb get-state. + + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before throwing + an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADBDevice constructor is used. + :returns: string value of adb get-state. + :raises: * ADBTimeoutError - raised if adb get-state takes longer + than timeout seconds. + * ADBError - raised if adb get-state exits with a + non-zero exit code. + + """ + output = self.command_output(["get-state"], timeout=timeout).strip() + return output + + # File management methods + + def chmod(self, path, recursive=False, mask="777", timeout=None, root=False): + """Recursively changes the permissions of a directory on the + device. + + :param path: string containing the directory name on the device. + :param recursive: boolean specifying if the command should be + executed recursively. + :param mask: optional string containing the octal permissions. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before throwing + an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADBDevice constructor is used. + :param root: optional boolean specifying if the command should + be executed as root. + :raises: * ADBTimeoutError - raised if any of the adb commands takes + longer than timeout seconds. + * ADBRootError - raised if root is requested but the + device is not rooted. + * ADBError - raised if any of the adb commands raises + an uncaught ADBError. + + """ + path = posixpath.normpath(path.strip()) + self._logger.debug('chmod: path=%s, recursive=%s, mask=%s, root=%s' % + (path, recursive, mask, root)) + self.shell_output("chmod %s %s" % (mask, path), + timeout=timeout, root=root) + if recursive and self.is_dir(path, timeout=timeout, root=root): + files = self.list_files(path, timeout=timeout, root=root) + for f in files: + entry = path + "/" + f + self._logger.debug('chmod: entry=%s' % entry) + if self.is_dir(entry, timeout=timeout, root=root): + self._logger.debug('chmod: recursion entry=%s' % entry) + self.chmod(entry, recursive=recursive, mask=mask, + timeout=timeout, root=root) + elif self.is_file(entry, timeout=timeout, root=root): + try: + self.shell_output("chmod %s %s" % (mask, entry), + timeout=timeout, root=root) + self._logger.debug('chmod: file entry=%s' % entry) + except ADBError, e: + if e.message.find('No such file or directory'): + # some kind of race condition is causing files + # to disappear. Catch and report the error here. + self._logger.warning('chmod: File %s vanished!: %s' % + (entry, e)) + else: + self._logger.warning('chmod: entry %s does not exist' % + entry) + + def exists(self, path, timeout=None, root=False): + """Returns True if the path exists on the device. + + :param path: string containing the directory name on the device. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADBDevice constructor is used. + :param root: optional boolean specifying if the command should be + executed as root. + :returns: boolean - True if path exists. + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBRootError - raised if root is requested but the + device is not rooted. + + """ + path = posixpath.normpath(path) + return self.shell_bool('ls -a %s' % path, timeout=timeout, root=root) + + def is_dir(self, path, timeout=None, root=False): + """Returns True if path is an existing directory on the device. + + :param path: string containing the path on the device. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADBDevice constructor is used. + :param root: optional boolean specifying if the command should + be executed as root. + :returns: boolean - True if path exists on the device and is a + directory. + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBRootError - raised if root is requested but the + device is not rooted. + + """ + path = posixpath.normpath(path) + return self.shell_bool('ls -a %s/' % path, timeout=timeout, root=root) + + def is_file(self, path, timeout=None, root=False): + """Returns True if path is an existing file on the device. + + :param path: string containing the file name on the device. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADBDevice constructor is used. + :param root: optional boolean specifying if the command should + be executed as root. + :returns: boolean - True if path exists on the device and is a + file. + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBRootError - raised if root is requested but the + device is not rooted. + + """ + path = posixpath.normpath(path) + return ( + self.exists(path, timeout=timeout, root=root) and + not self.is_dir(path, timeout=timeout, root=root)) + + def list_files(self, path, timeout=None, root=False): + """Return a list of files/directories contained in a directory + on the device. + + :param path: string containing the directory name on the device. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADBDevice constructor is used. + :param root: optional boolean specifying if the command should + be executed as root. + :returns: list of files/directories contained in the directory. + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBRootError - raised if root is requested but the + device is not rooted. + + """ + path = posixpath.normpath(path.strip()) + data = [] + if self.is_dir(path, timeout=timeout, root=root): + try: + data = self.shell_output("%s %s" % (self._ls, path), + timeout=timeout, + root=root).split('\r\n') + self._logger.debug('list_files: data: %s' % data) + except ADBError: + self._logger.exception('Ignoring exception in ADBDevice.list_files') + pass + data[:] = [item for item in data if item] + self._logger.debug('list_files: %s' % data) + return data + + def mkdir(self, path, parents=False, timeout=None, root=False): + """Create a directory on the device. + + :param path: string containing the directory name on the device + to be created. + :param parents: boolean indicating if the parent directories are + also to be created. Think mkdir -p path. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADBDevice constructor is used. + :param root: optional boolean specifying if the command should + be executed as root. + :raises: * ADBTimeoutError - raised if any adb command takes longer + than timeout seconds. + * ADBRootError - raised if root is requested but the + device is not rooted. + * ADBError - raised if adb shell mkdir exits with a + non-zero exit code or if the directory is not + created. + + """ + path = posixpath.normpath(path) + if parents: + if self._mkdir_p is None or self._mkdir_p: + # Use shell_bool to catch the possible + # non-zero exitcode if -p is not supported. + if self.shell_bool('mkdir -p %s' % path, timeout=timeout): + self._mkdir_p = True + return + # mkdir -p is not supported. create the parent + # directories individually. + if not self.is_dir(posixpath.dirname(path)): + parts = path.split('/') + name = "/" + for part in parts[:-1]: + if part != "": + name = posixpath.join(name, part) + if not self.is_dir(name): + # Use shell_output to allow any non-zero + # exitcode to raise an ADBError. + self.shell_output('mkdir %s' % name, + timeout=timeout, root=root) + self.shell_output('mkdir %s' % path, timeout=timeout, root=root) + if not self.is_dir(path, timeout=timeout, root=root): + raise ADBError('mkdir %s Failed' % path) + + def push(self, local, remote, timeout=None): + """Pushes a file or directory to the device. + + :param local: string containing the name of the local file or + directory name. + :param remote: string containing the name of the remote file or + directory name. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADBDevice constructor is used. + :raises: * ADBTimeoutError - raised if the adb push takes longer than + timeout seconds. + * ADBError - raised if the adb push exits with a + non-zero exit code. + + """ + self.command_output(["push", os.path.realpath(local), remote], + timeout=timeout) + + def rm(self, path, recursive=False, force=False, timeout=None, root=False): + """Delete files or directories on the device. + + :param path: string containing the file name on the device. + :param recursive: optional boolean specifying if the command is + to be applied recursively to the target. Default is False. + :param force: optional boolean which if True will not raise an + error when attempting to delete a non-existent file. Default + is False. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADBDevice constructor is used. + :param root: optional boolean specifying if the command should + be executed as root. + :raises: * ADBTimeoutError - raised if any of the adb commands takes + longer than timeout seconds. + * ADBRootError - raised if root is requested but the + device is not rooted. + * ADBError - raised if the adb shell rm command exits + with a non-zero exit code or if the file is not + removed, or if force was not specified and the + file did not exist. + + """ + cmd = "rm" + if recursive: + cmd += " -r" + try: + self.shell_output("%s %s" % (cmd, path), timeout=timeout, root=root) + if self.is_file(path, timeout=timeout, root=root): + raise ADBError('rm("%s") failed to remove file.' % path) + except ADBError, e: + if not force and 'No such file or directory' in e.message: + raise + + def rmdir(self, path, timeout=None, root=False): + """Delete empty directory on the device. + + :param path: string containing the directory name on the device. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADBDevice constructor is used. + :param root: optional boolean specifying if the command should + be executed as root. + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBRootError - raised if root is requested but the + device is not rooted. + * ADBError - raised if the adb shell rmdir command + exits with a non-zero exit code or if the + directory was not removed.. + + """ + self.shell_output("rmdir %s" % path, timeout=timeout, root=root) + if self.is_dir(path, timeout=timeout, root=root): + raise ADBError('rmdir("%s") failed to remove directory.' % path) + + # Process management methods + + def get_process_list(self, timeout=None): + """Returns list of tuples (pid, name, user) for running + processes on device. + + :param timeout: optional integer specifying the maximum time + in seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, + the value set in the ADBDevice constructor is used. + :returns: list of (pid, name, user) tuples for running processes + on the device. + :raises: * ADBTimeoutError - raised if the adb shell ps command + takes longer than timeout seconds. + * ADBError - raised if the adb shell ps command exits + with a non-zero exit code or if the ps output + is not in the expected format. + + """ + adb_process = None + try: + adb_process = self.shell("ps", timeout=timeout) + if adb_process.timedout: + raise ADBTimeoutError("%s" % adb_process) + elif adb_process.exitcode: + raise ADBError("%s" % adb_process) + # first line is the headers + header = adb_process.stdout_file.readline() + pid_i = -1 + user_i = -1 + els = header.split() + for i in range(len(els)): + item = els[i].lower() + if item == 'user': + user_i = i + elif item == 'pid': + pid_i = i + if user_i == -1 or pid_i == -1: + self._logger.error('get_process_list: %s' % header) + raise ADBError('get_process_list: Unknown format: %s: %s' % ( + header, adb_process)) + ret = [] + line = adb_process.stdout_file.readline() + while line: + els = line.split() + try: + ret.append([int(els[pid_i]), els[-1], els[user_i]]) + except ValueError: + self._logger.exception('get_process_list: %s %s' % ( + header, line)) + raise ADBError('get_process_list: %s: %s: %s' % ( + header, line, adb_process)) + line = adb_process.stdout_file.readline() + self._logger.debug('get_process_list: %s' % ret) + return ret + finally: + if adb_process and isinstance(adb_process.stdout_file, file): + adb_process.stdout_file.close() + adb_process.stderr_file.close() + + def kill(self, pids, sig=None, attempts=3, wait=5, + timeout=None, root=False): + """Kills processes on the device given a list of process ids. + + :param pids: list of process ids to be killed. + :param sig: optional signal to be sent to the process. + :param attempts: number of attempts to try to kill the processes. + :param wait: number of seconds to wait after each attempt. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADBDevice constructor is used. + :param root: optional boolean specifying if the command should + be executed as root. + :raises: * ADBTimeoutError - raised if adb shell kill takes longer + than timeout seconds. + * ADBRootError - raised if root is requested but the + device is not rooted. + * ADBError - raised if adb shell kill exits with a + non-zero exit code or not all of the processes have + been killed. + + """ + pid_list = [str(pid) for pid in pids] + for attempt in range(attempts): + args = ["kill"] + if sig: + args.append("-%d" % sig) + args.extend(pid_list) + try: + self.shell_output(' '.join(args), timeout=timeout, root=root) + except ADBError, e: + if 'No such process' not in e.message: + raise + pid_set = set(pid_list) + current_pid_set = set([str(proc[0]) for proc in + self.get_process_list(timeout=timeout)]) + pid_list = list(pid_set.intersection(current_pid_set)) + if not pid_list: + break + self._logger.debug("Attempt %d of %d to kill processes %s failed" % + (attempt+1, attempts, pid_list)) + time.sleep(wait) + + if pid_list: + raise ADBError('kill: processes %s not killed' % pid_list) + + def pkill(self, appname, sig=None, attempts=3, wait=5, + timeout=None, root=False): + """Kills a processes on the device matching a name. + + :param appname: string containing the app name of the process to + be killed. Note that only the first 75 characters of the + process name are significant. + :param sig: optional signal to be sent to the process. + :param attempts: number of attempts to try to kill the processes. + :param wait: number of seconds to wait after each attempt. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADBDevice constructor is used. + :param root: optional boolean specifying if the command should + be executed as root. + + :raises: * ADBTimeoutError - raised if any of the adb commands takes + longer than timeout seconds. + * ADBRootError - raised if root is requested but the + device is not rooted. + * ADBError - raised if any of the adb commands raises + ADBError or if the process is not killed. + + """ + procs = self.get_process_list(timeout=timeout) + # limit the comparion to the first 75 characters due to a + # limitation in processname length in android. + pids = [proc[0] for proc in procs if proc[1] == appname[:75]] + if not pids: + return + + try: + self.kill(pids, sig, attempts=attempts, wait=wait, + timeout=timeout, root=root) + except ADBError, e: + if self.process_exist(appname, timeout=timeout): + raise e + + def process_exist(self, process_name, timeout=None): + """Returns True if process with name process_name is running on + device. + + :param process_name: string containing the name of the process + to check. Note that only the first 75 characters of the + process name are significant. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADBDevice constructor is used. + :returns: boolean - True if process exists. + + :raises: * ADBTimeoutError - raised if any of the adb commands takes + longer than timeout seconds. + * ADBError - raised if the adb shell ps command exits + with a non-zero exit code or if the ps output is + not in the expected format. + + """ + if not isinstance(process_name, basestring): + raise ADBError("Process name %s is not a string" % process_name) + + pid = None + + # Filter out extra spaces. + parts = [x for x in process_name.split(' ') if x != ''] + process_name = ' '.join(parts) + + # Filter out the quoted env string if it exists + # ex: '"name=value;name2=value2;etc=..." process args' -> 'process args' + parts = process_name.split('"') + if len(parts) > 2: + process_name = ' '.join(parts[2:]).strip() + + pieces = process_name.split(' ') + parts = pieces[0].split('/') + app = parts[-1] + + proc_list = self.get_process_list(timeout=timeout) + if not proc_list: + return False + + for proc in proc_list: + proc_name = proc[1].split('/')[-1] + # limit the comparion to the first 75 characters due to a + # limitation in processname length in android. + if proc_name == app[:75]: + return True + return False diff --git a/testing/mozbase/mozdevice/mozdevice/adb_android.py b/testing/mozbase/mozdevice/mozdevice/adb_android.py new file mode 100644 index 000000000000..5c76161d6360 --- /dev/null +++ b/testing/mozbase/mozdevice/mozdevice/adb_android.py @@ -0,0 +1,379 @@ +# 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 os +import time + +from adb import ADBDevice, ADBError +from distutils.version import StrictVersion + + +class ADBAndroidMixin(object): + """Mixin to extend ADB with Android-specific functionality""" + + # System control methods + + def is_device_ready(self, timeout=None): + """Checks if a device is ready for testing. + + This method uses the android only package manager to check for + readiness. + + :param timeout: optional integer specifying the maximum time + in seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADB constructor is used. + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBError - raised if the wait-for-device command fails. + + """ + self.command_output(["wait-for-device"], timeout=timeout) + pm_error_string = "Error: Could not access the Package Manager" + pm_list_commands = ["packages", "permission-groups", "permissions", + "instrumentation", "features", "libraries"] + ready_path = os.path.join(self.test_root, "ready") + for attempt in range(self._device_ready_retry_attempts): + success = True + try: + if self.get_state(timeout=timeout) != 'device': + success = False + else: + if self.is_dir(ready_path, timeout=timeout): + self.rmdir(ready_path, timeout=timeout) + self.mkdir(ready_path, timeout=timeout) + self.rmdir(ready_path, timeout=timeout) + # Invoke the pm list commands to see if it is up and + # running. + for pm_list_cmd in pm_list_commands: + data = self.shell_output("pm list %s" % pm_list_cmd, + timeout=timeout) + if pm_error_string in data: + success = False + break + except ADBError, e: + success = False + data = e.message + + if not success: + self._logger.debug('Attempt %s of %s device not ready: %s' % ( + attempt+1, self._device_ready_retry_attempts, + data)) + time.sleep(self._device_ready_retry_wait) + + return success + + def power_on(self, timeout=None): + """Sets the device's power stayon value. + + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADB constructor is used. + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBError - raised if the command exits with a + non-zero exit code. + + """ + try: + self.shell_output('svc power stayon true', timeout=timeout) + except ADBError, e: + # Executing this via adb shell errors, but not interactively. + # Any other exitcode is a real error. + if 'exitcode: 137' not in e.message: + raise + self._logger.warning('Unable to set power stayon true: %s' % e) + + def reboot(self, timeout=None): + """Reboots the device. + + This method uses the Android only package manager to determine + if the device is ready after the reboot. + + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADB constructor is used. + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBError - raised if the command exits with a + non-zero exit code. + + reboot() reboots the device, issues an adb wait-for-device in order to + wait for the device to complete rebooting, then calls is_device_ready() + to determine if the device has completed booting. + + """ + self.command_output(["reboot"], timeout=timeout) + self.command_output(["wait-for-device"], timeout=timeout) + return self.is_device_ready(timeout=timeout) + + # Application management methods + + def install_app(self, apk_path, timeout=None): + """Installs an app on the device. + + :param apk_path: string containing the apk file name to be + installed. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADB constructor is used. + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBError - raised if the command exits with a + non-zero exit code. + + """ + data = self.command_output(["install", apk_path], timeout=timeout) + if data.find('Success') == -1: + raise ADBError("install failed for %s. Got: %s" % + (apk_path, data)) + + def is_app_installed(self, app_name, timeout=None): + """Returns True if an app is installed on the device. + + :param app_name: string containing the name of the app to be + checked. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADB constructor is used. + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBError - raised if the command exits with a + non-zero exit code. + + """ + pm_error_string = 'Error: Could not access the Package Manager' + data = self.shell_output("pm list package %s" % app_name, timeout=timeout) + if pm_error_string in data: + raise ADBError(pm_error_string) + if app_name not in data: + return False + return True + + def launch_application(self, app_name, activity_name, intent, url=None, + extras=None, wait=True, fail_if_running=True, + timeout=None): + """Launches an Android application + + :param app_name: Name of application (e.g. `com.android.chrome`) + :param activity_name: Name of activity to launch (e.g. `.Main`) + :param intent: Intent to launch application with + :param url: URL to open + :param extras: Dictionary of extra arguments for application. + :param wait: If True, wait for application to start before + returning. + :param fail_if_running: Raise an exception if instance of + application is already running. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADB constructor is used. + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBError - raised if the command exits with a + non-zero exit code. + + """ + # If fail_if_running is True, we throw an exception here. Only one + # instance of an application can be running at once on Android, + # starting a new instance may not be what we want depending on what + # we want to do + if fail_if_running and self.process_exist(app_name, timeout=timeout): + raise ADBError("Only one instance of an application may be running " + "at once") + + acmd = [ "am", "start" ] + \ + ["-W" if wait else '', "-n", "%s/%s" % (app_name, activity_name)] + + if intent: + acmd.extend(["-a", intent]) + + if extras: + for (key, val) in extras.iteritems(): + if type(val) is int: + extra_type_param = "--ei" + elif type(val) is bool: + extra_type_param = "--ez" + else: + extra_type_param = "--es" + acmd.extend([extra_type_param, str(key), str(val)]) + + if url: + acmd.extend(["-d", url]) + + cmd = self._escape_command_line(acmd) + self.shell_output(cmd, timeout=timeout) + + def launch_fennec(self, app_name, intent="android.intent.action.VIEW", + moz_env=None, extra_args=None, url=None, wait=True, + fail_if_running=True, timeout=None): + """Convenience method to launch Fennec on Android with various + debugging arguments + + :param app_name: Name of fennec application (e.g. + `org.mozilla.fennec`) + :param intent: Intent to launch application. + :param moz_env: Mozilla specific environment to pass into + application. + :param extra_args: Extra arguments to be parsed by fennec. + :param url: URL to open + :param wait: If True, wait for application to start before + returning + :param fail_if_running: Raise an exception if instance of + application is already running + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADB constructor is used. + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBError - raised if the command exits with a + non-zero exit code. + + """ + extras = {} + + if moz_env: + # moz_env is expected to be a dictionary of environment variables: + # Fennec itself will set them when launched + for (env_count, (env_key, env_val)) in enumerate(moz_env.iteritems()): + extras["env" + str(env_count)] = env_key + "=" + env_val + + # Additional command line arguments that fennec will read and use (e.g. + # with a custom profile) + if extra_args: + extras['args'] = " ".join(extra_args) + + self.launch_application(app_name, ".App", intent, url=url, extras=extras, + wait=wait, fail_if_running=fail_if_running, + timeout=timeout) + + def stop_application(self, app_name, timeout=None, root=False): + """Stops the specified application + + For Android 3.0+, we use the "am force-stop" to do this, which + is reliable and does not require root. For earlier versions of + Android, we simply try to manually kill the processes started + by the app repeatedly until none is around any more. This is + less reliable and does require root. + + :param app_name: Name of application (e.g. `com.android.chrome`) + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADB constructor is used. + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBError - raised if the command exits with a + non-zero exit code. + + """ + version = self.shell_output("getprop ro.build.version.release", + timeout=timeout, root=root) + if StrictVersion(version) >= StrictVersion('3.0'): + self.shell_output("am force-stop %s" % app_name, + timeout=timeout, root=root) + else: + num_tries = 0 + max_tries = 5 + while self.process_exist(app_name, timeout=timeout): + if num_tries > max_tries: + raise ADBError("Couldn't successfully kill %s after %s " + "tries" % (app_name, max_tries)) + self.pkill(app_name, timeout=timeout, root=root) + num_tries += 1 + + # sleep for a short duration to make sure there are no + # additional processes in the process of being launched + # (this is not 100% guaranteed to work since it is inherently + # racey, but it's the best we can do) + time.sleep(1) + + def uninstall_app(self, app_name, reboot=False, timeout=None): + """Uninstalls an app on the device. + + :param app_name: string containing the name of the app to be + uninstalled. + :param reboot: boolean flag indicating that the device should + be rebooted after the app is uninstalled. No reboot occurs + if the app is not installed. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADB constructor is used. + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBError - raised if the command exits with a + non-zero exit code. + + """ + if self.is_app_installed(app_name, timeout=timeout): + data = self.command_output(["uninstall", app_name], timeout=timeout) + if data.find('Success') == -1: + self._logger.debug('uninstall_app failed: %s' % data) + raise ADBError("uninstall failed for %s. Got: %s" % (app_name, data)) + if reboot: + self.reboot(timeout=timeout) + + def update_app(self, apk_path, timeout=None): + """Updates an app on the device and reboots. + + :param apk_path: string containing the apk file name to be + updated. + :param timeout: optional integer specifying the maximum time in + seconds for any spawned adb process to complete before + throwing an ADBTimeoutError. + This timeout is per adb call. The total time spent + may exceed this value. If it is not specified, the value + set in the ADB constructor is used. + :raises: * ADBTimeoutError - raised if the command takes longer than + timeout seconds. + * ADBError - raised if the command exits with a + non-zero exit code. + + """ + output = self.command_output(["install", "-r", apk_path], + timeout=timeout) + self.reboot(timeout=timeout) + return output + + +class ADBAndroid(ADBDevice, ADBAndroidMixin): + """ADBAndroid provides all of the methods of :class:`mozdevice.ADB` with + Android specific extensions useful for that platform. + + :: + + from mozdevice import ADBAndroid as ADBDevice + + adb = ADBDevice(...) + + if adb.is_device_ready(): + adb.install_app("/tmp/build.apk") + adb.launch_fennec("org.mozilla.fennec") + + """ + pass diff --git a/testing/xpcshell/node-http2/HISTORY.md b/testing/xpcshell/node-http2/HISTORY.md index 10c4c20e775c..d1ac0bb4cdb6 100644 --- a/testing/xpcshell/node-http2/HISTORY.md +++ b/testing/xpcshell/node-http2/HISTORY.md @@ -1,6 +1,25 @@ Version history =============== +### 2.6.0 (2014-06-18) ### + +* Upgrade to the latest draft: [draft-ietf-httpbis-http2-13] + +[draft-ietf-httpbis-http2-13]: http://tools.ietf.org/html/draft-ietf-httpbis-http2-13 + +### 2.5.3 (2014-06-15) ### + +* Exposing API to send ALTSVC frames + +### 2.5.2 (2014-05-25) ### + +* Fix a bug that occurs when the ALPN negotiation is unsuccessful + +### 2.5.1 (2014-05-25) ### + +* Support for node 0.11.x +* New cipher suite priority list with comformant ciphers on the top (only available in node >=0.11.x) + ### 2.5.0 (2014-04-24) ### * Upgrade to the latest draft: [draft-ietf-httpbis-http2-12] diff --git a/testing/xpcshell/node-http2/README.md b/testing/xpcshell/node-http2/README.md index fbd1d5b4724b..e4a5a908663c 100644 --- a/testing/xpcshell/node-http2/README.md +++ b/testing/xpcshell/node-http2/README.md @@ -1,7 +1,7 @@ node-http2 ========== -An HTTP/2 ([draft-ietf-httpbis-http2-12](http://tools.ietf.org/html/draft-ietf-httpbis-http2-12)) +An HTTP/2 ([draft-ietf-httpbis-http2-13](http://tools.ietf.org/html/draft-ietf-httpbis-http2-13)) client and server implementation for node.js. Installation @@ -114,12 +114,12 @@ point to understand the code. ### Test coverage ### To generate a code coverage report, run `npm test --coverage` (which runs very slowly, be patient). -Code coverage summary as of version 2.4.0: +Code coverage summary as of version 2.5.3: ``` -Statements : 93.19% ( 397/426 ) -Branches : 79.88% ( 131/164 ) -Functions : 93.75% ( 60/64 ) -Lines : 93.19% ( 397/426 ) +Statements : 92.64% ( 403/435 ) +Branches : 79.41% ( 135/170 ) +Functions : 92.31% ( 60/65 ) +Lines : 92.64% ( 403/435 ) ``` There's a hosted version of the detailed (line-by-line) coverage report diff --git a/testing/xpcshell/node-http2/lib/http.js b/testing/xpcshell/node-http2/lib/http.js index 7e8afc4c5db5..28da75e4a7a3 100644 --- a/testing/xpcshell/node-http2/lib/http.js +++ b/testing/xpcshell/node-http2/lib/http.js @@ -121,7 +121,7 @@ // // [1]: http://nodejs.org/api/https.html // [2]: http://nodejs.org/api/http.html -// [3]: http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-8.1.3.2 +// [3]: http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-8.1.3.2 // [expect-continue]: https://github.com/http2/http2-spec/issues/18 // [connect]: https://github.com/http2/http2-spec/issues/230 @@ -143,6 +143,7 @@ var https = require('https'); exports.STATUS_CODES = http.STATUS_CODES; exports.IncomingMessage = IncomingMessage; exports.OutgoingMessage = OutgoingMessage; +exports.PROTOCOL_VERSION = implementedVersion; var deprecatedHeaders = [ 'connection', @@ -157,6 +158,47 @@ var deprecatedHeaders = [ // When doing NPN/ALPN negotiation, HTTP/1.1 is used as fallback var supportedProtocols = [implementedVersion, 'http/1.1', 'http/1.0']; +// Ciphersuite list based on the recommendations of http://wiki.mozilla.org/Security/Server_Side_TLS +// The only modification is that kEDH+AESGCM were placed after DHE and ECDHE suites +var cipherSuites = [ + 'ECDHE-RSA-AES128-GCM-SHA256', + 'ECDHE-ECDSA-AES128-GCM-SHA256', + 'ECDHE-RSA-AES256-GCM-SHA384', + 'ECDHE-ECDSA-AES256-GCM-SHA384', + 'DHE-RSA-AES128-GCM-SHA256', + 'DHE-DSS-AES128-GCM-SHA256', + 'ECDHE-RSA-AES128-SHA256', + 'ECDHE-ECDSA-AES128-SHA256', + 'ECDHE-RSA-AES128-SHA', + 'ECDHE-ECDSA-AES128-SHA', + 'ECDHE-RSA-AES256-SHA384', + 'ECDHE-ECDSA-AES256-SHA384', + 'ECDHE-RSA-AES256-SHA', + 'ECDHE-ECDSA-AES256-SHA', + 'DHE-RSA-AES128-SHA256', + 'DHE-RSA-AES128-SHA', + 'DHE-DSS-AES128-SHA256', + 'DHE-RSA-AES256-SHA256', + 'DHE-DSS-AES256-SHA', + 'DHE-RSA-AES256-SHA', + 'kEDH+AESGCM', + 'AES128-GCM-SHA256', + 'AES256-GCM-SHA384', + 'ECDHE-RSA-RC4-SHA', + 'ECDHE-ECDSA-RC4-SHA', + 'AES128', + 'AES256', + 'RC4-SHA', + 'HIGH', + '!aNULL', + '!eNULL', + '!EXPORT', + '!DES', + '!3DES', + '!MD5', + '!PSK' +].join(':'); + // Logging // ------- @@ -204,7 +246,7 @@ function IncomingMessage(stream) { } IncomingMessage.prototype = Object.create(PassThrough.prototype, { constructor: { value: IncomingMessage } }); -// [Request Header Fields](http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-8.1.3.1) +// [Request Header Fields](http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-8.1.3.1) // * `headers` argument: HTTP/2.0 request and response header fields carry information as a series // of key-value pairs. This includes the target URI for the request, the status code for the // response, as well as HTTP header fields. @@ -368,6 +410,8 @@ function Server(options) { this._mode = 'tls'; options.ALPNProtocols = supportedProtocols; options.NPNProtocols = supportedProtocols; + options.ciphers = options.ciphers || cipherSuites; + options.honorCipherOrder = (options.honorCipherOrder != false); this._server = https.createServer(options); this._originalSocketListeners = this._server.listeners('secureConnection'); this._server.removeAllListeners('secureConnection'); @@ -516,7 +560,7 @@ function IncomingRequest(stream) { } IncomingRequest.prototype = Object.create(IncomingMessage.prototype, { constructor: { value: IncomingRequest } }); -// [Request Header Fields](http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-8.1.3.1) +// [Request Header Fields](http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-8.1.3.1) // * `headers` argument: HTTP/2.0 request and response header fields carry information as a series // of key-value pairs. This includes the target URI for the request, the status code for the // response, as well as HTTP header fields. @@ -633,6 +677,13 @@ OutgoingResponse.prototype.push = function push(options) { return new OutgoingResponse(pushStream); }; +OutgoingResponse.prototype.altsvc = function altsvc(host, port, protocolID, maxAge, origin) { + if (origin === undefined) { + origin = ""; + } + this.stream.altsvc(host, port, protocolID, maxAge, origin); +}; + // Overriding `EventEmitter`'s `on(event, listener)` method to forward certain subscriptions to // `request`. See `Server.prototype.on` for explanation. OutgoingResponse.prototype.on = function on(event, listener) { @@ -739,12 +790,13 @@ Agent.prototype.request = function request(options, callback) { options.NPNProtocols = supportedProtocols; options.servername = options.host; // Server Name Indication options.agent = this._httpsAgent; + options.ciphers = options.ciphers || cipherSuites; var httpsRequest = https.request(options); httpsRequest.on('socket', function(socket) { var negotiatedProtocol = socket.alpnProtocol || socket.npnProtocol; - if (negotiatedProtocol !== undefined) { - negotiated(); + if (negotiatedProtocol != null) { // null in >=0.11.0, undefined in <0.11.0 + negotiated() } else { socket.on('secureConnect', negotiated); } @@ -947,7 +999,7 @@ function IncomingResponse(stream) { } IncomingResponse.prototype = Object.create(IncomingMessage.prototype, { constructor: { value: IncomingResponse } }); -// [Response Header Fields](http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-8.1.3.2) +// [Response Header Fields](http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-8.1.3.2) // * `headers` argument: HTTP/2.0 request and response header fields carry information as a series // of key-value pairs. This includes the target URI for the request, the status code for the // response, as well as HTTP header fields. diff --git a/testing/xpcshell/node-http2/lib/index.js b/testing/xpcshell/node-http2/lib/index.js index f7cd9e78eff0..83da56feecbc 100644 --- a/testing/xpcshell/node-http2/lib/index.js +++ b/testing/xpcshell/node-http2/lib/index.js @@ -1,4 +1,4 @@ -// [node-http2][homepage] is an [HTTP/2 (draft 12)][http2] implementation for [node.js][node]. +// [node-http2][homepage] is an [HTTP/2 (draft 13)][http2] implementation for [node.js][node]. // // The core of the protocol is implemented by the [http2-protocol] module. This module provides // two important features on top of http2-protocol: @@ -11,7 +11,7 @@ // // [homepage]: https://github.com/molnarg/node-http2 // [http2-protocol]: https://github.com/molnarg/node-http2-protocol -// [http2]: http://tools.ietf.org/html/draft-ietf-httpbis-http2-12 +// [http2]: http://tools.ietf.org/html/draft-ietf-httpbis-http2-13 // [node]: http://nodejs.org/ // [node-https]: http://nodejs.org/api/https.html // [node-http]: http://nodejs.org/api/http.html diff --git a/testing/xpcshell/node-http2/node_modules/http2-protocol/HISTORY.md b/testing/xpcshell/node-http2/node_modules/http2-protocol/HISTORY.md index fd71b83e5f54..61dd53bbe06c 100644 --- a/testing/xpcshell/node-http2/node_modules/http2-protocol/HISTORY.md +++ b/testing/xpcshell/node-http2/node_modules/http2-protocol/HISTORY.md @@ -1,6 +1,24 @@ Version history =============== +### 0.13.0 (2014-06-18) ### + +* Upgrade to the latest draft: [draft-ietf-httpbis-http2-13][draft-13] + +[draft-13]: http://tools.ietf.org/html/draft-ietf-httpbis-http2-13 + +### 0.12.3 (2014-06-15) ### + +* Exposing API to send ALTSVC frames + +### 0.12.2 (2014-05-25) ### + +* Support for node 0.11.x + +### 0.12.1 (2014-04-26) ### + +* Support for sending BLOCKED frame + ### 0.12.0 (2014-04-24) ### * Upgrade to the latest draft: [draft-ietf-httpbis-http2-12][draft-12] diff --git a/testing/xpcshell/node-http2/node_modules/http2-protocol/README.md b/testing/xpcshell/node-http2/node_modules/http2-protocol/README.md index f8635dd231ea..d9e7492a1dcd 100644 --- a/testing/xpcshell/node-http2/node_modules/http2-protocol/README.md +++ b/testing/xpcshell/node-http2/node_modules/http2-protocol/README.md @@ -1,7 +1,7 @@ node-http2-protocol =================== -An HTTP/2 ([draft-ietf-httpbis-http2-12](http://tools.ietf.org/html/draft-ietf-httpbis-http2-12)) +An HTTP/2 ([draft-ietf-httpbis-http2-13](http://tools.ietf.org/html/draft-ietf-httpbis-http2-13)) framing layer implementaion for node.js. Installation @@ -50,12 +50,12 @@ point to understand the code. ### Test coverage ### To generate a code coverage report, run `npm test --coverage` (it may be slow, be patient). -Code coverage summary as of version 0.12.0: +Code coverage summary as of version 0.13.0: ``` -Statements : 91.6% ( 1352/1476 ) -Branches : 85.15% ( 562/660 ) -Functions : 92.5% ( 148/160 ) -Lines : 91.69% ( 1346/1468 ) +Statements : 92.23% ( 1341/1454 ) +Branches : 86% ( 553/643 ) +Functions : 91.93% ( 148/161 ) +Lines : 92.32% ( 1335/1446 ) ``` There's a hosted version of the detailed (line-by-line) coverage report diff --git a/testing/xpcshell/node-http2/node_modules/http2-protocol/lib/compressor.js b/testing/xpcshell/node-http2/node_modules/http2-protocol/lib/compressor.js index 68ca5d0d8dbd..49da77b9f69d 100644 --- a/testing/xpcshell/node-http2/node_modules/http2-protocol/lib/compressor.js +++ b/testing/xpcshell/node-http2/node_modules/http2-protocol/lib/compressor.js @@ -170,7 +170,7 @@ HeaderTable.staticTable = [ [ ':status' , '404' ], [ ':status' , '500' ], [ 'accept-charset' , '' ], - [ 'accept-encoding' , '' ], + [ 'accept-encoding' , 'gzip, deflate'], [ 'accept-language' , '' ], [ 'accept-ranges' , '' ], [ 'accept' , '' ], @@ -708,263 +708,263 @@ HuffmanTable.prototype.decode = function decode(buffer) { // sed -e "s/^.* [|]//g" -e "s/|//g" -e "s/ .*//g" -e "s/^/ '/g" -e "s/$/',/g" HuffmanTable.huffmanTable = new HuffmanTable([ - '11111111111111111110111010', - '11111111111111111110111011', - '11111111111111111110111100', - '11111111111111111110111101', - '11111111111111111110111110', - '11111111111111111110111111', - '11111111111111111111000000', - '11111111111111111111000001', - '11111111111111111111000010', - '11111111111111111111000011', - '11111111111111111111000100', - '11111111111111111111000101', - '11111111111111111111000110', - '11111111111111111111000111', - '11111111111111111111001000', - '11111111111111111111001001', - '11111111111111111111001010', - '11111111111111111111001011', - '11111111111111111111001100', - '11111111111111111111001101', - '11111111111111111111001110', - '11111111111111111111001111', - '11111111111111111111010000', - '11111111111111111111010001', - '11111111111111111111010010', - '11111111111111111111010011', - '11111111111111111111010100', - '11111111111111111111010101', - '11111111111111111111010110', - '11111111111111111111010111', - '11111111111111111111011000', - '11111111111111111111011001', - '00110', - '1111111111100', - '111110000', - '11111111111100', - '111111111111100', - '011110', - '1100100', - '1111111111101', + '1111111111000', + '11111111111111111011000', + '1111111111111111111111100010', + '1111111111111111111111100011', + '1111111111111111111111100100', + '1111111111111111111111100101', + '1111111111111111111111100110', + '1111111111111111111111100111', + '1111111111111111111111101000', + '111111111111111111101010', + '111111111111111111111111111100', + '1111111111111111111111101001', + '1111111111111111111111101010', + '111111111111111111111111111101', + '1111111111111111111111101011', + '1111111111111111111111101100', + '1111111111111111111111101101', + '1111111111111111111111101110', + '1111111111111111111111101111', + '1111111111111111111111110000', + '1111111111111111111111110001', + '1111111111111111111111110010', + '111111111111111111111111111110', + '1111111111111111111111110011', + '1111111111111111111111110100', + '1111111111111111111111110101', + '1111111111111111111111110110', + '1111111111111111111111110111', + '1111111111111111111111111000', + '1111111111111111111111111001', + '1111111111111111111111111010', + '1111111111111111111111111011', + '010100', + '1111111000', + '1111111001', + '111111111010', + '1111111111001', + '010101', + '11111000', + '11111111010', '1111111010', - '111110001', '1111111011', + '11111001', + '11111111011', + '11111010', + '010110', + '010111', + '011000', + '00000', + '00001', + '00010', + '011001', + '011010', + '011011', + '011100', + '011101', + '011110', + '011111', + '1011100', + '11111011', + '111111111111100', + '100000', + '111111111011', '1111111100', + '1111111111010', + '100001', + '1011101', + '1011110', + '1011111', + '1100000', + '1100001', + '1100010', + '1100011', + '1100100', '1100101', '1100110', - '011111', - '00111', - '0000', - '0001', - '0010', - '01000', - '100000', - '100001', - '100010', - '100011', - '100100', - '100101', - '100110', - '11101100', - '11111111111111100', - '100111', - '111111111111101', - '1111111101', - '111111111111110', '1100111', - '11101101', - '11101110', '1101000', - '11101111', '1101001', '1101010', - '111110010', - '11110000', - '111110011', - '111110100', - '111110101', '1101011', '1101100', - '11110001', - '11110010', - '111110110', - '111110111', '1101101', - '101000', - '11110011', - '111111000', - '111111001', - '11110100', - '111111010', - '111111011', - '11111111100', - '11111111111111111111011010', - '11111111101', - '11111111111101', '1101110', - '111111111111111110', - '01001', '1101111', - '01010', - '101001', - '01011', '1110000', - '101010', - '101011', - '01100', - '11110101', - '11110110', - '101100', - '101101', - '101110', - '01101', - '101111', - '111111100', - '110000', - '110001', - '01110', '1110001', '1110010', + '11111100', '1110011', + '11111101', + '1111111111011', + '1111111111111110000', + '1111111111100', + '11111111111100', + '100010', + '111111111111101', + '00011', + '100011', + '00100', + '100100', + '00101', + '100101', + '100110', + '100111', + '00110', '1110100', '1110101', - '11110111', - '11111111111111101', - '111111111100', - '11111111111111110', - '111111111101', - '11111111111111111111011011', - '11111111111111111111011100', - '11111111111111111111011101', - '11111111111111111111011110', - '11111111111111111111011111', + '101000', + '101001', + '101010', + '00111', + '101011', + '1110110', + '101100', + '01000', + '01001', + '101101', + '1110111', + '1111000', + '1111001', + '1111010', + '1111011', + '111111111111110', + '11111111100', + '11111111111101', + '1111111111101', + '1111111111111111111111111100', + '11111111111111100110', + '1111111111111111010010', + '11111111111111100111', + '11111111111111101000', + '1111111111111111010011', + '1111111111111111010100', + '1111111111111111010101', + '11111111111111111011001', + '1111111111111111010110', + '11111111111111111011010', + '11111111111111111011011', + '11111111111111111011100', + '11111111111111111011101', + '11111111111111111011110', + '111111111111111111101011', + '11111111111111111011111', + '111111111111111111101100', + '111111111111111111101101', + '1111111111111111010111', + '11111111111111111100000', + '111111111111111111101110', + '11111111111111111100001', + '11111111111111111100010', + '11111111111111111100011', + '11111111111111111100100', + '111111111111111011100', + '1111111111111111011000', + '11111111111111111100101', + '1111111111111111011001', + '11111111111111111100110', + '11111111111111111100111', + '111111111111111111101111', + '1111111111111111011010', + '111111111111111011101', + '11111111111111101001', + '1111111111111111011011', + '1111111111111111011100', + '11111111111111111101000', + '11111111111111111101001', + '111111111111111011110', + '11111111111111111101010', + '1111111111111111011101', + '1111111111111111011110', + '111111111111111111110000', + '111111111111111011111', + '1111111111111111011111', + '11111111111111111101011', + '11111111111111111101100', + '111111111111111100000', + '111111111111111100001', + '1111111111111111100000', + '111111111111111100010', + '11111111111111111101101', + '1111111111111111100001', + '11111111111111111101110', + '11111111111111111101111', + '11111111111111101010', + '1111111111111111100010', + '1111111111111111100011', + '1111111111111111100100', + '11111111111111111110000', + '1111111111111111100101', + '1111111111111111100110', + '11111111111111111110001', '11111111111111111111100000', '11111111111111111111100001', + '11111111111111101011', + '1111111111111110001', + '1111111111111111100111', + '11111111111111111110010', + '1111111111111111101000', + '1111111111111111111101100', '11111111111111111111100010', '11111111111111111111100011', '11111111111111111111100100', + '111111111111111111111011110', + '111111111111111111111011111', '11111111111111111111100101', + '111111111111111111110001', + '1111111111111111111101101', + '1111111111111110010', + '111111111111111100011', '11111111111111111111100110', + '111111111111111111111100000', + '111111111111111111111100001', '11111111111111111111100111', + '111111111111111111111100010', + '111111111111111111110010', + '111111111111111100100', + '111111111111111100101', '11111111111111111111101000', '11111111111111111111101001', + '1111111111111111111111111101', + '111111111111111111111100011', + '111111111111111111111100100', + '111111111111111111111100101', + '11111111111111101100', + '111111111111111111110011', + '11111111111111101101', + '111111111111111100110', + '1111111111111111101001', + '111111111111111100111', + '111111111111111101000', + '11111111111111111110011', + '1111111111111111101010', + '1111111111111111101011', + '1111111111111111111101110', + '1111111111111111111101111', + '111111111111111111110100', + '111111111111111111110101', '11111111111111111111101010', + '11111111111111111110100', '11111111111111111111101011', + '111111111111111111111100110', '11111111111111111111101100', '11111111111111111111101101', + '111111111111111111111100111', + '111111111111111111111101000', + '111111111111111111111101001', + '111111111111111111111101010', + '111111111111111111111101011', + '1111111111111111111111111110', + '111111111111111111111101100', + '111111111111111111111101101', + '111111111111111111111101110', + '111111111111111111111101111', + '111111111111111111111110000', '11111111111111111111101110', - '11111111111111111111101111', - '11111111111111111111110000', - '11111111111111111111110001', - '11111111111111111111110010', - '11111111111111111111110011', - '11111111111111111111110100', - '11111111111111111111110101', - '11111111111111111111110110', - '11111111111111111111110111', - '11111111111111111111111000', - '11111111111111111111111001', - '11111111111111111111111010', - '11111111111111111111111011', - '11111111111111111111111100', - '11111111111111111111111101', - '11111111111111111111111110', - '11111111111111111111111111', - '1111111111111111110000000', - '1111111111111111110000001', - '1111111111111111110000010', - '1111111111111111110000011', - '1111111111111111110000100', - '1111111111111111110000101', - '1111111111111111110000110', - '1111111111111111110000111', - '1111111111111111110001000', - '1111111111111111110001001', - '1111111111111111110001010', - '1111111111111111110001011', - '1111111111111111110001100', - '1111111111111111110001101', - '1111111111111111110001110', - '1111111111111111110001111', - '1111111111111111110010000', - '1111111111111111110010001', - '1111111111111111110010010', - '1111111111111111110010011', - '1111111111111111110010100', - '1111111111111111110010101', - '1111111111111111110010110', - '1111111111111111110010111', - '1111111111111111110011000', - '1111111111111111110011001', - '1111111111111111110011010', - '1111111111111111110011011', - '1111111111111111110011100', - '1111111111111111110011101', - '1111111111111111110011110', - '1111111111111111110011111', - '1111111111111111110100000', - '1111111111111111110100001', - '1111111111111111110100010', - '1111111111111111110100011', - '1111111111111111110100100', - '1111111111111111110100101', - '1111111111111111110100110', - '1111111111111111110100111', - '1111111111111111110101000', - '1111111111111111110101001', - '1111111111111111110101010', - '1111111111111111110101011', - '1111111111111111110101100', - '1111111111111111110101101', - '1111111111111111110101110', - '1111111111111111110101111', - '1111111111111111110110000', - '1111111111111111110110001', - '1111111111111111110110010', - '1111111111111111110110011', - '1111111111111111110110100', - '1111111111111111110110101', - '1111111111111111110110110', - '1111111111111111110110111', - '1111111111111111110111000', - '1111111111111111110111001', - '1111111111111111110111010', - '1111111111111111110111011', - '1111111111111111110111100', - '1111111111111111110111101', - '1111111111111111110111110', - '1111111111111111110111111', - '1111111111111111111000000', - '1111111111111111111000001', - '1111111111111111111000010', - '1111111111111111111000011', - '1111111111111111111000100', - '1111111111111111111000101', - '1111111111111111111000110', - '1111111111111111111000111', - '1111111111111111111001000', - '1111111111111111111001001', - '1111111111111111111001010', - '1111111111111111111001011', - '1111111111111111111001100', - '1111111111111111111001101', - '1111111111111111111001110', - '1111111111111111111001111', - '1111111111111111111010000', - '1111111111111111111010001', - '1111111111111111111010010', - '1111111111111111111010011', - '1111111111111111111010100', - '1111111111111111111010101', - '1111111111111111111010110', - '1111111111111111111010111', - '1111111111111111111011000', - '1111111111111111111011001', - '1111111111111111111011010', - '1111111111111111111011011', - '1111111111111111111011100' + '111111111111111111111111111111' ]); // ### String literal representation ### diff --git a/testing/xpcshell/node-http2/node_modules/http2-protocol/lib/flow.js b/testing/xpcshell/node-http2/node_modules/http2-protocol/lib/flow.js index 141eb77d21b3..c326b6bd2110 100644 --- a/testing/xpcshell/node-http2/node_modules/http2-protocol/lib/flow.js +++ b/testing/xpcshell/node-http2/node_modules/http2-protocol/lib/flow.js @@ -19,7 +19,7 @@ exports.Flow = Flow; // * **setInitialWindow(size)**: the initial flow control window size can be changed *any time* // ([as described in the standard][1]) using this method // -// [1]: http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-6.9.2 +// [1]: http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-6.9.2 // API for child classes // --------------------- @@ -64,6 +64,7 @@ function Flow(flowControlId) { this._queue = []; this._ended = false; this._received = 0; + this._blocked = false; } Flow.prototype = Object.create(Duplex.prototype, { constructor: { value: Flow } }); @@ -106,6 +107,7 @@ Flow.prototype._write = function _write(frame, encoding, callback) { // `_restoreWindow` basically acknowledges the DATA frames received since it's last call. It sends // a WINDOW_UPDATE that restores the flow control window of the remote end. +// TODO: push this directly into the output queue. No need to wait for DATA frames in the queue. Flow.prototype._restoreWindow = function _restoreWindow() { delete this._restoreWindowTimer; if (!this._ended && (this._received > 0)) { @@ -154,6 +156,7 @@ Flow.prototype._read = function _read() { // * if there are items in the flow control queue, then let's put them into the output queue (to // the extent it is possible with respect to the window size and output queue feedback) else if (this._window > 0) { + this._blocked = false; this._readableState.sync = true; // to avoid reentrant calls do { var moreNeeded = this._push(this._queue[0]); @@ -169,8 +172,14 @@ Flow.prototype._read = function _read() { } // * otherwise, come back when the flow control window is positive - else { + else if (!this._blocked) { + this._parentPush({ + type: 'BLOCKED', + flags: {}, + stream: this._flowControlId + }) this.once('window_update', this._read); + this._blocked = true; } }; @@ -188,41 +197,26 @@ Flow.prototype.read = function read(limit) { limit = MAX_PAYLOAD_SIZE; } - // * Looking at the first frame in the queue without pulling it out if possible. This will save - // a costly unshift if the frame proves to be too large to return. - var firstInQueue = this._readableState.buffer[0]; - var frame = firstInQueue || Duplex.prototype.read.call(this); - - if ((frame === null) || (frame.type !== 'DATA') || (frame.data.length <= limit)) { - if (firstInQueue) { - Duplex.prototype.read.call(this); - } - return frame; + // * Looking at the first frame in the queue without pulling it out if possible. + var frame = this._readableState.buffer[0]; + if (!frame && !this._readableState.ended) { + this._read(); + frame = this._readableState.buffer[0]; } - else if (limit <= 0) { - if (!firstInQueue) { - this.unshift(frame); - } - return null; - } - - else { + if (frame && (frame.type === 'DATA') && limit && (frame.data.length > limit)) { this._log.trace({ frame: frame, size: frame.data.length, forwardable: limit }, 'Splitting out forwardable part of a DATA frame.'); - var forwardable = { + this.unshift({ type: 'DATA', flags: {}, stream: frame.stream, data: frame.data.slice(0, limit) - }; + }); frame.data = frame.data.slice(limit); - - if (!firstInQueue) { - this.unshift(frame); - } - return forwardable; } + + return Duplex.prototype.read.call(this); }; // `_parentPush` pushes the given `frame` into the output queue diff --git a/testing/xpcshell/node-http2/node_modules/http2-protocol/lib/framer.js b/testing/xpcshell/node-http2/node_modules/http2-protocol/lib/framer.js index 0c64bb910d84..e6362fee3941 100644 --- a/testing/xpcshell/node-http2/node_modules/http2-protocol/lib/framer.js +++ b/testing/xpcshell/node-http2/node_modules/http2-protocol/lib/framer.js @@ -139,7 +139,7 @@ Deserializer.prototype._transform = function _transform(chunk, encoding, done) { } } else { this._log.error('Unknown type incoming frame'); - this.emit('error', 'PROTOCOL_ERROR'); + // Ignore it other than logging } this._next(COMMON_HEADER_SIZE); } @@ -148,7 +148,7 @@ Deserializer.prototype._transform = function _transform(chunk, encoding, done) { done(); }; -// [Frame Header](http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-4.1) +// [Frame Header](http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-4.1) // -------------------------------------------------------------- // // HTTP/2.0 frames share a common base format consisting of an 8-byte header followed by 0 to 65535 @@ -239,6 +239,10 @@ Deserializer.commonHeader = function readCommonHeader(buffer, frame) { var length = buffer.readUInt16BE(0); frame.type = frameTypes[buffer.readUInt8(2)]; + if (!frame.type) { + // We are required to ignore unknown frame types + return length; + } frame.flags = {}; var flagByte = buffer.readUInt8(3); @@ -262,7 +266,7 @@ Deserializer.commonHeader = function readCommonHeader(buffer, frame) { // * `typeSpecificAttributes`: a register of frame specific frame object attributes (used by // logging code and also serves as documentation for frame objects) -// [DATA Frames](http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-6.1) +// [DATA Frames](http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-6.1) // ------------------------------------------------------------ // // DATA frames (type=0x0) convey arbitrary, variable-length sequences of octets associated with a @@ -277,18 +281,12 @@ Deserializer.commonHeader = function readCommonHeader(buffer, frame) { // Bit 2 being set indicates that this frame is the last for the current segment. Intermediaries // MUST NOT coalesce frames across a segment boundary and MUST preserve segment boundaries when // forwarding frames. -// * PAD_LOW (0x08): -// Bit 4 being set indicates that the Pad Low field is present. -// * PAD_HIGH (0x10): -// Bit 5 being set indicates that the Pad High field is present. This bit MUST NOT be set unless -// the PAD_LOW flag is also set. Endpoints that receive a frame with PAD_HIGH set and PAD_LOW -// cleared MUST treat this as a connection error of type PROTOCOL_ERROR. -// * COMPRESSED (0x20): -// Bit 6 being set indicates that the data in the frame has been compressed with GZIP compression. +// * PADDED (0x08): +// Bit 4 being set indicates that the Pad Length field is present. frameTypes[0x0] = 'DATA'; -frameFlags.DATA = ['END_STREAM', 'END_SEGMENT', 'RESERVED4', 'PAD_LOW', 'PAD_HIGH', 'COMPRESSED']; +frameFlags.DATA = ['END_STREAM', 'END_SEGMENT', 'RESERVED4', 'PADDED']; typeSpecificAttributes.DATA = ['data']; @@ -299,19 +297,9 @@ Serializer.DATA = function writeData(frame, buffers) { Deserializer.DATA = function readData(buffer, frame) { var dataOffset = 0; var paddingLength = 0; - if (frame.flags.PAD_LOW) { - if (frame.flags.PAD_HIGH) { - paddingLength = (buffer.readUInt8(dataOffset) & 0xff) * 256; - dataOffset += 1; - } - paddingLength += (buffer.readUInt8(dataOffset) & 0xff); - dataOffset += 1; - } else if (frame.flags.PAD_HIGH) { - return 'DATA frame got PAD_HIGH without PAD_LOW'; - } - - if (frame.flags.COMPRESSED) { - return 'DATA frame received COMPRESSED data (unsupported)'; + if (frame.flags.PADDED) { + paddingLength = (buffer.readUInt8(dataOffset) & 0xff); + dataOffset = 1; } if (paddingLength) { @@ -321,7 +309,7 @@ Deserializer.DATA = function readData(buffer, frame) { } }; -// [HEADERS](http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-6.2) +// [HEADERS](http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-6.2) // -------------------------------------------------------------- // // The HEADERS frame (type=0x1) allows the sender to create a stream. @@ -338,23 +326,22 @@ Deserializer.DATA = function readData(buffer, frame) { // * END_HEADERS (0x4): // The END_HEADERS bit indicates that this frame contains the entire payload necessary to provide // a complete set of headers. -// * PAD_LOW (0x08): -// Bit 5 being set indicates that the Pad Low field is present. -// * PAD_HIGH (0x10): -// Bit 6 being set indicates that the Pad High field is present. This bit MUST NOT be set unless -// the PAD_LOW flag is also set. Endpoints that receive a frame with PAD_HIGH set and PAD_LOW -// cleared MUST treat this as a connection error of type PROTOCOL_ERROR. +// * PADDED (0x08): +// Bit 4 being set indicates that the Pad Length field is present. +// * PRIORITY (0x20): +// Bit 6 being set indicates that the Exlusive Flag (E), Stream Dependency, and Weight fields are +// present. frameTypes[0x1] = 'HEADERS'; -frameFlags.HEADERS = ['END_STREAM', 'END_SEGMENT', 'END_HEADERS', 'PAD_LOW', 'PAD_HIGH', 'PRIORITY']; +frameFlags.HEADERS = ['END_STREAM', 'END_SEGMENT', 'END_HEADERS', 'PADDED', 'RESERVED5', 'PRIORITY']; typeSpecificAttributes.HEADERS = ['priorityDependency', 'priorityWeight', 'exclusiveDependency', 'headers', 'data']; // 0 1 2 3 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | Pad High? (8) | Pad Low? (8) | +// |Pad Length? (8)| // +-+-------------+---------------+-------------------------------+ // |E| Stream Dependency? (31) | // +-+-------------+-----------------------------------------------+ @@ -385,15 +372,9 @@ Serializer.HEADERS = function writeHeadersPriority(frame, buffers) { Deserializer.HEADERS = function readHeadersPriority(buffer, frame) { var dataOffset = 0; var paddingLength = 0; - if (frame.flags.PAD_LOW) { - if (frame.flags.PAD_HIGH) { - paddingLength = (buffer.readUInt8(dataOffset) & 0xff) * 256; - dataOffset += 1; - } - paddingLength += (buffer.readUInt8(dataOffset) & 0xff); - dataOffset += 1; - } else if (frame.flags.PAD_HIGH) { - return 'HEADERS frame got PAD_HIGH without PAD_LOW'; + if (frame.flags.PADDED) { + paddingLength = (buffer.readUInt8(dataOffset) & 0xff); + dataOffset = 1; } if (frame.flags.PRIORITY) { @@ -414,7 +395,7 @@ Deserializer.HEADERS = function readHeadersPriority(buffer, frame) { } }; -// [PRIORITY](http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-6.3) +// [PRIORITY](http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-6.3) // ------------------------------------------------------- // // The PRIORITY frame (type=0x2) specifies the sender-advised priority of a stream. @@ -459,7 +440,7 @@ Deserializer.PRIORITY = function readPriority(buffer, frame) { frame.priorityWeight = buffer.readUInt8(4); }; -// [RST_STREAM](http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-6.4) +// [RST_STREAM](http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-6.4) // ----------------------------------------------------------- // // The RST_STREAM frame (type=0x3) allows for abnormal termination of a stream. @@ -491,9 +472,13 @@ Serializer.RST_STREAM = function writeRstStream(frame, buffers) { Deserializer.RST_STREAM = function readRstStream(buffer, frame) { frame.error = errorCodes[buffer.readUInt32BE(0)]; + if (!frame.error) { + // Unknown error codes are considered equivalent to INTERNAL_ERROR + frame.error = 'INTERNAL_ERROR'; + } }; -// [SETTINGS](http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-6.5) +// [SETTINGS](http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-6.5) // ------------------------------------------------------- // // The SETTINGS frame (type=0x4) conveys configuration parameters that affect how endpoints @@ -510,16 +495,16 @@ frameFlags.SETTINGS = ['ACK']; typeSpecificAttributes.SETTINGS = ['settings']; -// The payload of a SETTINGS frame consists of zero or more settings. Each setting consists of an -// 8-bit identifier, and an unsigned 32-bit value. +// The payload of a SETTINGS frame consists of zero or more settings. Each setting consists of a +// 16-bit identifier, and an unsigned 32-bit value. // // 0 1 2 3 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | Identifier(8) | Value (32) | +// | Identifier(16) | Value (32) | // +-----------------+---------------------------------------------+ -// ...Value | -// +-----------------+ +// ...Value | +// +---------------------------------+ // // Each setting in a SETTINGS frame replaces the existing value for that setting. Settings are // processed in the order in which they appear, and a receiver of a SETTINGS frame does not need to @@ -539,10 +524,10 @@ Serializer.SETTINGS = function writeSettings(frame, buffers) { }); assert(settingsLeft.length === 0, 'Unknown settings: ' + settingsLeft.join(', ')); - var buffer = new Buffer(settings.length * 5); + var buffer = new Buffer(settings.length * 6); for (var i = 0; i < settings.length; i++) { - buffer.writeUInt8(settings[i].id & 0xff, i*5); - buffer.writeUInt32BE(settings[i].value, i*5 + 1); + buffer.writeUInt16BE(settings[i].id & 0xffff, i*6); + buffer.writeUInt32BE(settings[i].value, i*6 + 2); } buffers.push(buffer); @@ -550,7 +535,7 @@ Serializer.SETTINGS = function writeSettings(frame, buffers) { Deserializer.SETTINGS = function readSettings(buffer, frame, role) { frame.settings = {}; - + // Receipt of a SETTINGS frame with the ACK flag set and a length // field value other than 0 MUST be treated as a connection error // (Section 5.4.1) of type FRAME_SIZE_ERROR. @@ -558,21 +543,18 @@ Deserializer.SETTINGS = function readSettings(buffer, frame, role) { return 'FRAME_SIZE_ERROR'; } - if (buffer.length % 5 !== 0) { + if (buffer.length % 6 !== 0) { return 'PROTOCOL_ERROR'; } - for (var i = 0; i < buffer.length / 5; i++) { - var id = buffer.readUInt8(i*5) & 0xff; + for (var i = 0; i < buffer.length / 6; i++) { + var id = buffer.readUInt16BE(i*6) & 0xffff; var setting = definedSettings[id]; if (setting) { if (role == 'CLIENT' && setting.name == 'SETTINGS_ENABLE_PUSH') { return 'SETTINGS frame on client got SETTINGS_ENABLE_PUSH'; } - var value = buffer.readUInt32BE(i*5 + 1); + var value = buffer.readUInt32BE(i*6 + 2); frame.settings[setting.name] = setting.flag ? Boolean(value & 0x1) : value; - } else { - /* Unknown setting, protocol error */ - return 'SETTINGS frame got unknown setting type'; } } }; @@ -599,13 +581,7 @@ definedSettings[3] = { name: 'SETTINGS_MAX_CONCURRENT_STREAMS', flag: false }; // indicates the sender's initial stream window size (in bytes) for new streams. definedSettings[4] = { name: 'SETTINGS_INITIAL_WINDOW_SIZE', flag: false }; -// * SETTINGS_COMPRESS_DATA (5): -// this setting is used to enable GZip compression of DATA frames. A value of 1 indicates that -// DATA frames MAY be compressed. A value of 0 indicates that compression is not permitted. -// The initial value is 0. -definedSettings[5] = { name: 'SETTINGS_COMPRESS_DATA', flag: true }; - -// [PUSH_PROMISE](http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-6.6) +// [PUSH_PROMISE](http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-6.6) // --------------------------------------------------------------- // // The PUSH_PROMISE frame (type=0x5) is used to notify the peer endpoint in advance of streams the @@ -619,16 +595,20 @@ definedSettings[5] = { name: 'SETTINGS_COMPRESS_DATA', flag: true }; frameTypes[0x5] = 'PUSH_PROMISE'; -frameFlags.PUSH_PROMISE = ['RESERVED1', 'RESERVED2', 'END_PUSH_PROMISE', 'PAD_LOW', 'PAD_HIGH']; +frameFlags.PUSH_PROMISE = ['RESERVED1', 'RESERVED2', 'END_PUSH_PROMISE', 'PADDED']; typeSpecificAttributes.PUSH_PROMISE = ['promised_stream', 'headers', 'data']; // 0 1 2 3 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// |Pad Length? (8)| +// +-+-------------+-----------------------------------------------+ // |X| Promised-Stream-ID (31) | // +-+-------------------------------------------------------------+ -// | Header Block (*) ... +// | Header Block Fragment (*) ... +// +---------------------------------------------------------------+ +// | Padding (*) ... // +---------------------------------------------------------------+ // // The PUSH_PROMISE frame includes the unsigned 31-bit identifier of @@ -649,15 +629,9 @@ Serializer.PUSH_PROMISE = function writePushPromise(frame, buffers) { Deserializer.PUSH_PROMISE = function readPushPromise(buffer, frame) { var dataOffset = 0; var paddingLength = 0; - if (frame.flags.PAD_LOW) { - if (frame.flags.PAD_HIGH) { - paddingLength = (buffer.readUInt8(dataOffset) & 0xff) * 256; - dataOffset += 1; - } - paddingLength += (buffer.readUInt8(dataOffset) & 0xff); - dataOffset += 1; - } else if (frame.flags.PAD_HIGH) { - return 'PUSH_PROMISE frame got PAD_HIGH without PAD_LOW'; + if (frame.flags.PADDED) { + paddingLength = (buffer.readUInt8(dataOffset) & 0xff); + dataOffset = 1; } frame.promised_stream = buffer.readUInt32BE(dataOffset) & 0x7fffffff; dataOffset += 4; @@ -668,7 +642,7 @@ Deserializer.PUSH_PROMISE = function readPushPromise(buffer, frame) { } }; -// [PING](http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-6.7) +// [PING](http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-6.7) // ----------------------------------------------- // // The PING frame (type=0x6) is a mechanism for measuring a minimal round-trip time from the @@ -698,7 +672,7 @@ Deserializer.PING = function readPing(buffer, frame) { frame.data = buffer; }; -// [GOAWAY](http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-6.8) +// [GOAWAY](http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-6.8) // --------------------------------------------------- // // The GOAWAY frame (type=0x7) informs the remote peer to stop creating streams on this connection. @@ -743,9 +717,13 @@ Serializer.GOAWAY = function writeGoaway(frame, buffers) { Deserializer.GOAWAY = function readGoaway(buffer, frame) { frame.last_stream = buffer.readUInt32BE(0) & 0x7fffffff; frame.error = errorCodes[buffer.readUInt32BE(4)]; + if (!frame.error) { + // Unknown error types are to be considered equivalent to INTERNAL ERROR + frame.error = 'INTERNAL_ERROR'; + } }; -// [WINDOW_UPDATE](http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-6.9) +// [WINDOW_UPDATE](http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-6.9) // ----------------------------------------------------------------- // // The WINDOW_UPDATE frame (type=0x8) is used to implement flow control. @@ -780,7 +758,7 @@ Deserializer.WINDOW_UPDATE = function readWindowUpdate(buffer, frame) { frame.window_size = buffer.readUInt32BE(0) & 0x7fffffff; }; -// [CONTINUATION](http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-6.10) +// [CONTINUATION](http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-6.10) // ------------------------------------------------------------ // // The CONTINUATION frame (type=0x9) is used to continue a sequence of header block fragments. @@ -790,16 +768,10 @@ Deserializer.WINDOW_UPDATE = function readWindowUpdate(buffer, frame) { // * END_HEADERS (0x4): // The END_HEADERS bit indicates that this frame ends the sequence of header block fragments // necessary to provide a complete set of headers. -// * PAD_LOW (0x08): -// Bit 5 being set indicates that the Pad Low field is present. -// * PAD_HIGH (0x10): -// Bit 6 being set indicates that the Pad High field is present. This bit MUST NOT be set unless -// the PAD_LOW flag is also set. Endpoints that receive a frame with PAD_HIGH set and PAD_LOW -// cleared MUST treat this as a connection error of type PROTOCOL_ERROR. frameTypes[0x9] = 'CONTINUATION'; -frameFlags.CONTINUATION = ['RESERVED1', 'RESERVED2', 'END_HEADERS', 'PAD_LOW', 'PAD_HIGH']; +frameFlags.CONTINUATION = ['RESERVED1', 'RESERVED2', 'END_HEADERS']; typeSpecificAttributes.CONTINUATION = ['headers', 'data']; @@ -808,26 +780,10 @@ Serializer.CONTINUATION = function writeContinuation(frame, buffers) { }; Deserializer.CONTINUATION = function readContinuation(buffer, frame) { - var dataOffset = 0; - var paddingLength = 0; - if (frame.flags.PAD_LOW) { - if (frame.flags.PAD_HIGH) { - paddingLength = (buffer.readUInt8(dataOffset) & 0xff) * 256; - dataOffset += 1; - } - paddingLength += (buffer.readUInt8(dataOffset) & 0xff); - dataOffset += 1; - } else if (frame.flags.PAD_HIGH) { - return 'CONTINUATION frame got PAD_HIGH without PAD_LOW'; - } - if (paddingLength) { - frame.data = buffer.slice(dataOffset, -1 * paddingLength); - } else { - frame.data = buffer.slice(dataOffset); - } + frame.data = buffer; }; -// [ALTSVC](http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-6.11) +// [ALTSVC](http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-6.11) // ------------------------------------------------------------ // // The ALTSVC frame (type=0xA) advertises the availability of an alternative service to the client. @@ -916,7 +872,7 @@ Deserializer.ALTSVC = function readAltSvc(buffer, frame) { frame.origin = buffer.toString('ascii', 9 + pidLength + hostLength); }; -// [BLOCKED](http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-6.12) +// [BLOCKED](http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-6.12) // ------------------------------------------------------------ // // The BLOCKED frame (type=0xB) indicates that the sender is unable to send data @@ -936,7 +892,7 @@ Serializer.BLOCKED = function writeBlocked(frame, buffers) { Deserializer.BLOCKED = function readBlocked(buffer, frame) { }; -// [Error Codes](http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-7) +// [Error Codes](http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-7) // ------------------------------------------------------------ var errorCodes = [ diff --git a/testing/xpcshell/node-http2/node_modules/http2-protocol/lib/index.js b/testing/xpcshell/node-http2/node_modules/http2-protocol/lib/index.js index 8dad77a60a2e..c98cc31f9db2 100644 --- a/testing/xpcshell/node-http2/node_modules/http2-protocol/lib/index.js +++ b/testing/xpcshell/node-http2/node_modules/http2-protocol/lib/index.js @@ -1,4 +1,4 @@ -// [node-http2-protocol][homepage] is an implementation of the [HTTP/2 (draft 12)][http2] +// [node-http2-protocol][homepage] is an implementation of the [HTTP/2 (draft 13)][http2] // framing layer for [node.js][node]. // // The main building blocks are [node.js streams][node-stream] that are connected through pipes. @@ -28,16 +28,16 @@ // between the binary and the JavaScript object representation of HTTP/2 frames // // [homepage]: https://github.com/molnarg/node-http2 -// [http2]: http://tools.ietf.org/html/draft-ietf-httpbis-http2-12 -// [http2-connheader]: http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-3.5 -// [http2-stream]: http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-5 -// [http2-streamstate]: http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-5.1 +// [http2]: http://tools.ietf.org/html/draft-ietf-httpbis-http2-13 +// [http2-connheader]: http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-3.5 +// [http2-stream]: http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-5 +// [http2-streamstate]: http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-5.1 // [node]: http://nodejs.org/ // [node-stream]: http://nodejs.org/api/stream.html // [node-https]: http://nodejs.org/api/https.html // [node-http]: http://nodejs.org/api/http.html -exports.ImplementedVersion = 'h2-12'; +exports.ImplementedVersion = 'h2-13'; exports.Endpoint = require('./endpoint').Endpoint; diff --git a/testing/xpcshell/node-http2/node_modules/http2-protocol/lib/stream.js b/testing/xpcshell/node-http2/node_modules/http2-protocol/lib/stream.js index 9cbb45c8d71d..0dc06fefc77e 100644 --- a/testing/xpcshell/node-http2/node_modules/http2-protocol/lib/stream.js +++ b/testing/xpcshell/node-http2/node_modules/http2-protocol/lib/stream.js @@ -153,6 +153,26 @@ Stream.prototype.reset = function reset(error) { } }; +// Specify an alternate service for the origin of this stream +Stream.prototype.altsvc = function altsvc(host, port, protocolID, maxAge, origin) { + var stream; + if (origin) { + stream = 0; + } else { + stream = this.id; + } + this._pushUpstream({ + type: 'ALTSVC', + flags: {}, + stream: stream, + host: host, + port: port, + protocolID: protocolID, + origin: origin, + maxAge: maxAge + }); +}; + // Data flow // --------- @@ -326,7 +346,7 @@ Stream.prototype._finishing = function _finishing() { } }; -// [Stream States](http://tools.ietf.org/html/draft-ietf-httpbis-http2-12#section-5.1) +// [Stream States](http://tools.ietf.org/html/draft-ietf-httpbis-http2-13#section-5.1) // ---------------- // // +--------+ diff --git a/testing/xpcshell/node-http2/node_modules/http2-protocol/package.json b/testing/xpcshell/node-http2/node_modules/http2-protocol/package.json index b32f657cd899..15c3053e2dc7 100644 --- a/testing/xpcshell/node-http2/node_modules/http2-protocol/package.json +++ b/testing/xpcshell/node-http2/node_modules/http2-protocol/package.json @@ -1,10 +1,10 @@ { "name": "http2-protocol", - "version": "0.12.0", + "version": "0.13.0", "description": "A JavaScript implementation of the HTTP/2 framing layer", "main": "lib/index.js", "engines" : { - "node" : "0.10.x" + "node" : ">=0.10.0" }, "devDependencies": { "istanbul": "*", diff --git a/testing/xpcshell/node-http2/node_modules/http2-protocol/test/compressor.js b/testing/xpcshell/node-http2/node_modules/http2-protocol/test/compressor.js index 84e996621415..c2e976ea2d1f 100644 --- a/testing/xpcshell/node-http2/node_modules/http2-protocol/test/compressor.js +++ b/testing/xpcshell/node-http2/node_modules/http2-protocol/test/compressor.js @@ -29,34 +29,34 @@ var test_integers = [{ var test_strings = [{ string: 'www.foo.com', - buffer: new Buffer('89e7cf9bfc1ad7d4db7f', 'hex') + buffer: new Buffer('89f1e3c2f29ceb90f4ff', 'hex') }, { string: 'éáűőúöüó€', buffer: new Buffer('13c3a9c3a1c5b1c591c3bac3b6c3bcc3b3e282ac', 'hex') }]; test_huffman_request = { - 'GET': 'd5df47', - 'http': 'adcebf', - '/': '3f', - 'www.foo.com': 'e7cf9bfc1ad7d4db7f', - 'https': 'adcebf1f', - 'www.bar.com': 'e7cf9bfbd383ea6dbf', - 'no-cache': 'b9b9949556bf', - '/custom-path.css': '3ab8e2e6db9af4bab7d58e3f', - 'custom-key': '571c5cdb737b2faf', - 'custom-value': '571c5cdb73724d9c57' + 'GET': 'c5837f', + 'http': '9d29af', + '/': '63', + 'www.foo.com': 'f1e3c2f29ceb90f4ff', + 'https': '9d29ad1f', + 'www.bar.com': 'f1e3c2f18ec5c87a7f', + 'no-cache': 'a8eb10649cbf', + '/custom-path.css': '6096a127a56ac699d72211', + 'custom-key': '25a849e95ba97d7f', + 'custom-value': '25a849e95bb8e8b4bf' }; test_huffman_response = { - '302': '4017', - 'private': 'bf06724b97', - 'Mon, 21 OCt 2013 20:13:21 GMT': 'd6dbb29884de3dce3100a0c4130a262136ad747f', - ': https://www.bar.com': '98d5b9d7e331cfcf9f37f7a707d4db7f', - '200': '200f', - 'Mon, 21 OCt 2013 20:13:22 GMT': 'd6dbb29884de3dce3100a0c4130a262236ad747f', - 'https://www.bar.com': 'adcebf198e7e7cf9bfbd383ea6db', - 'gzip': 'abdd97ff', + '302': '6402', + 'private': 'aec3771a4b', + 'Mon, 21 OCt 2013 20:13:21 GMT': 'd07abe941054d5792a0801654102e059b820a98b46ff', + ': https://www.bar.com': 'b8a4e94d68b8c31e3c785e31d8b90f4f', + '200': '1001', + 'Mon, 21 OCt 2013 20:13:22 GMT': 'd07abe941054d5792a0801654102e059b821298b46ff', + 'https://www.bar.com': '9d29ad171863c78f0bc63b1721e9', + 'gzip': '9bd9ab', 'foo=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ AAAAAAAAAAAAAAAAAAAAAAAAAALASDJKHQKBZXOQWEOPIUAXQWEOIUAXLJKHQWOEIUAL\ QWEOIUAXLQEUAXLLKJASDQWEOUIAXN1234LASDJKHQKBZXOQWEOPIUAXQWEOIUAXLJKH\ @@ -64,7 +64,7 @@ QWOEIUALQWEOIUAXLQEUAXLLKJASDQWEOUIAXN1234LASDJKHQKBZXOQWEOPIUAXQWEO\ IUAXLJKHQWOEIUALQWEOIUAXLQEUAXLLKJASDQWEOUIAXN1234LASDJKHQKBZXOQWEOP\ IUAXQWEOIUAXLJKHQWOEIUALQWEOIUAXLQEUAXLLKJASDQWEOUIAXN1234ZZZZZZZZZZ\ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ1234 m\ -ax-age=3600; version=1': 'e0d6cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cff5cfb747cfe9f2fb7d3b7f7e9e3f6fcf7f8f97879e7f4fb7e7bfc7c3cf3fa7d7e7f4f97dbf3e3dfe1e79febf6fcf7f8f879e7f4fafdbbfcf3fa7d7ebf4f9e7dba3edf9eff1f3f0cfe9b049107d73edd1f3fa7cbedf4edfdfa78fdbf3dfe3e5e1e79fd3edf9eff1f0f3cfe9f5f9fd3e5f6fcf8f7f879e7fafdbf3dfe3e1e79fd3ebf6eff3cfe9f5fafd3e79f6e8fb7e7bfc7cfc33fa6c12441f5cfb747cfe9f2fb7d3b7f7e9e3f6fcf7f8f97879e7f4fb7e7bfc7c3cf3fa7d7e7f4f97dbf3e3dfe1e79febf6fcf7f8f879e7f4fafdbbfcf3fa7d7ebf4f9e7dba3edf9eff1f3f0cfe9b049107d73edd1f3fa7cbedf4edfdfa78fdbf3dfe3e5e1e79fd3edf9eff1f0f3cfe9f5f9fd3e5f6fcf8f7f879e7fafdbf3dfe3e1e79fd3ebf6eff3cfe9f5fafd3e79f6e8fb7e7bfc7cfc33fa6c12441fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff624880d6a7a664d4b9d1100761b92f0c58dba71', +ax-age=3600; version=1': '94e7821861861861861861861861861861861861861861861861861861861861861861861861861861861861861861861861861861861861873c3bafe5cd8f666bbfbf9ab672c1ab5e4e10fe6ce583564e10fe67cb9b1ece5ab064e10e7d9cb06ac9c21fccfb307087f33e7cd961dd7f672c1ab86487f34844cb59e1dd7f2e6c7b335dfdfcd5b3960d5af27087f3672c1ab27087f33e5cd8f672d583270873ece583564e10fe67d983843f99f3e6cb0eebfb3960d5c3243f9a42265acf0eebf97363d99aefefe6ad9cb06ad793843f9b3960d593843f99f2e6c7b396ac1938439f672c1ab27087f33ecc1c21fccf9f3658775fd9cb06ae1921fcd21132d678775fcb9b1eccd77f7f356ce58356bc9c21fcd9cb06ac9c21fccf97363d9cb560c9c21cfb3960d593843f99f660e10fe67cf9b2c3bafece583570c90fe6908996bf7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f42265a5291f9587316065c003ed4ee5b1063d5007f', 'foo=ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\ ZZZZZZZZZZZZZZZZZZZZZZZZZZLASDJKHQKBZXOQWEOPIUAXQWEOIUAXLJKHQWOEIUAL\ QWEOIUAXLQEUAXLLKJASDQWEOUIAXN1234LASDJKHQKBZXOQWEOPIUAXQWEOIUAXLJKH\ @@ -72,7 +72,7 @@ QWOEIUALQWEOIUAXLQEUAXLLKJASDQWEOUIAXN1234LASDJKHQKBZXOQWEOPIUAXQWEO\ IUAXLJKHQWOEIUALQWEOIUAXLQEUAXLLKJASDQWEOUIAXN1234LASDJKHQKBZXOQWEOP\ IUAXQWEOIUAXLJKHQWOEIUALQWEOIUAXLQEUAXLLKJASDQWEOUIAXN1234AAAAAAAAAA\ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1234 m\ -ax-age=3600; version=1': 'e0d6cffbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7fbfdfeff7f5cfb747cfe9f2fb7d3b7f7e9e3f6fcf7f8f97879e7f4fb7e7bfc7c3cf3fa7d7e7f4f97dbf3e3dfe1e79febf6fcf7f8f879e7f4fafdbbfcf3fa7d7ebf4f9e7dba3edf9eff1f3f0cfe9b049107d73edd1f3fa7cbedf4edfdfa78fdbf3dfe3e5e1e79fd3edf9eff1f0f3cfe9f5f9fd3e5f6fcf8f7f879e7fafdbf3dfe3e1e79fd3ebf6eff3cfe9f5fafd3e79f6e8fb7e7bfc7cfc33fa6c12441f5cfb747cfe9f2fb7d3b7f7e9e3f6fcf7f8f97879e7f4fb7e7bfc7c3cf3fa7d7e7f4f97dbf3e3dfe1e79febf6fcf7f8f879e7f4fafdbbfcf3fa7d7ebf4f9e7dba3edf9eff1f3f0cfe9b049107d73edd1f3fa7cbedf4edfdfa78fdbf3dfe3e5e1e79fd3edf9eff1f0f3cfe9f5f9fd3e5f6fcf8f7f879e7fafdbf3dfe3e1e79fd3ebf6eff3cfe9f5fafd3e79f6e8fb7e7bfc7cfc33fa6c124419f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7cf9f3e7ce24880d6a7a664d4b9d1100761b92f0c58dba71' +ax-age=3600; version=1': '94e783f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f73c3bafe5cd8f666bbfbf9ab672c1ab5e4e10fe6ce583564e10fe67cb9b1ece5ab064e10e7d9cb06ac9c21fccfb307087f33e7cd961dd7f672c1ab86487f34844cb59e1dd7f2e6c7b335dfdfcd5b3960d5af27087f3672c1ab27087f33e5cd8f672d583270873ece583564e10fe67d983843f99f3e6cb0eebfb3960d5c3243f9a42265acf0eebf97363d99aefefe6ad9cb06ad793843f9b3960d593843f99f2e6c7b396ac1938439f672c1ab27087f33ecc1c21fccf9f3658775fd9cb06ae1921fcd21132d678775fcb9b1eccd77f7f356ce58356bc9c21fcd9cb06ac9c21fccf97363d9cb560c9c21cfb3960d593843f99f660e10fe67cf9b2c3bafece583570c90fe6908996a1861861861861861861861861861861861861861861861861861861861861861861861861861861861861861861861861861861861842265a5291f9587316065c003ed4ee5b1063d5007f' }; var test_headers = [{ @@ -98,7 +98,7 @@ var test_headers = [{ clearReferenceSet: false, newMaxSize: 0 }, - buffer: new Buffer('47' + '83ADCEBF', 'hex') + buffer: new Buffer('47' + '839d29af', 'hex') }, { // literal w/index, name index header: { @@ -122,7 +122,7 @@ var test_headers = [{ clearReferenceSet: false, newMaxSize: 0 }, - buffer: new Buffer('44' + '89E7CF9BFC1AD7D4DB7F', 'hex') + buffer: new Buffer('44' + '89f1e3c2f29ceb90f4ff', 'hex') }, { // literal w/index, name index header: { @@ -134,7 +134,7 @@ var test_headers = [{ clearReferenceSet: false, newMaxSize: 0 }, - buffer: new Buffer('43' + '84ADCEBF1F', 'hex') + buffer: new Buffer('43' + '849d29ad1f', 'hex') }, { // literal w/index, name index header: { @@ -146,7 +146,7 @@ var test_headers = [{ clearReferenceSet: false, newMaxSize: 0 }, - buffer: new Buffer('42' + '89E7CF9BFBD383EA6DBF', 'hex') + buffer: new Buffer('42' + '89f1e3c2f18ec5c87a7f', 'hex') }, { // literal w/index, name index header: { @@ -158,7 +158,7 @@ var test_headers = [{ clearReferenceSet: false, newMaxSize: 0 }, - buffer: new Buffer('5e' + '86B9B9949556BF', 'hex') + buffer: new Buffer('5e' + '86a8eb10649cbf', 'hex') }, { // indexed header: { @@ -194,7 +194,7 @@ var test_headers = [{ clearReferenceSet: false, newMaxSize: 0 }, - buffer: new Buffer('45' + '8C3AB8E2E6DB9AF4BAB7D58E3F', 'hex') + buffer: new Buffer('45' + '8b6096a127a56ac699d72211', 'hex') }, { // literal w/index, new name & value header: { @@ -206,7 +206,7 @@ var test_headers = [{ clearReferenceSet: false, newMaxSize: 0 }, - buffer: new Buffer('40' + '88571C5CDB737B2FAF' + '89571C5CDB73724D9C57', 'hex') + buffer: new Buffer('40' + '8825a849e95ba97d7f' + '8925a849e95bb8e8b4bf', 'hex') }, { // indexed header: { @@ -242,7 +242,7 @@ var test_headers = [{ clearReferenceSet: false, newMaxSize: 0 }, - buffer: new Buffer('07' + '86E75A5CBE4BC3', 'hex') + buffer: new Buffer('07' + '86f138d25ee5b3', 'hex') }, { // Literal w/o index, new name & value header: { @@ -254,7 +254,7 @@ var test_headers = [{ clearReferenceSet: false, newMaxSize: 0 }, - buffer: new Buffer('00' + '03666F6F' + '03626172', 'hex') + buffer: new Buffer('00' + '8294e7' + '03626172', 'hex') }, { // Literal never indexed, name index header: { @@ -266,7 +266,7 @@ var test_headers = [{ clearReferenceSet: false, newMaxSize: 0 }, - buffer: new Buffer('17' + '86E75A5CBE4BC3', 'hex') + buffer: new Buffer('17' + '86f138d25ee5b3', 'hex') }, { // Literal never indexed, new name & value header: { @@ -278,7 +278,7 @@ var test_headers = [{ clearReferenceSet: false, newMaxSize: 0 }, - buffer: new Buffer('10' + '03666F6F' + '03626172', 'hex') + buffer: new Buffer('10' + '8294e7' + '03626172', 'hex') }, { header: { name: -1, diff --git a/testing/xpcshell/node-http2/node_modules/http2-protocol/test/connection.js b/testing/xpcshell/node-http2/node_modules/http2-protocol/test/connection.js index 7347d518bf0f..be8df5025c06 100644 --- a/testing/xpcshell/node-http2/node_modules/http2-protocol/test/connection.js +++ b/testing/xpcshell/node-http2/node_modules/http2-protocol/test/connection.js @@ -128,10 +128,10 @@ describe('connection.js', function() { expect(headers).to.deep.equal(response_headers); done(); }); - client_stream.on('readable', function() { - expect(client_stream.read()).to.deep.equal(response_data); + client_stream.on('data', function(data) { + expect(data).to.deep.equal(response_data); done(); - }); + }) }); }); describe('server push', function() { @@ -162,8 +162,8 @@ describe('connection.js', function() { expect(headers).to.deep.equal(response_headers); done(); }); - request.on('readable', function() { - expect(request.read()).to.deep.equal(response_content); + request.on('data', function(data) { + expect(data).to.deep.equal(response_content); done(); }); request.on('promise', function(pushed, headers) { @@ -172,13 +172,11 @@ describe('connection.js', function() { expect(headers).to.deep.equal(response_headers); done(); }); - pushed.on('readable', function() { - expect(pushed.read()).to.deep.equal(push_content); - done(); - }); - pushed.on('end', function() { + pushed.on('data', function(data) { + expect(data).to.deep.equal(push_content); done(); }); + pushed.on('end', done); }); }); }); diff --git a/testing/xpcshell/node-http2/node_modules/http2-protocol/test/flow.js b/testing/xpcshell/node-http2/node_modules/http2-protocol/test/flow.js index 79e312931b3a..01dad5f1aee1 100644 --- a/testing/xpcshell/node-http2/node_modules/http2-protocol/test/flow.js +++ b/testing/xpcshell/node-http2/node_modules/http2-protocol/test/flow.js @@ -3,6 +3,8 @@ var util = require('./util'); var Flow = require('../lib/flow').Flow; +var MAX_PAYLOAD_SIZE = 4096; + function createFlow(log) { var flowControlId = util.random(10, 100); var flow = new Flow(flowControlId); @@ -33,19 +35,18 @@ describe('flow.js', function() { describe('._send() method', function() { it('is called when the output buffer should be filled with more frames and the flow' + 'control queue is empty', function() { - var sendCalled = 0; var notFlowControlledFrame = { type: 'PRIORITY', flags: {}, priority: 1 }; flow._send = function _send() { - sendCalled += 1; this.push(notFlowControlledFrame); }; expect(flow.read()).to.equal(notFlowControlledFrame); flow._window = 0; flow._queue.push({ type: 'DATA', flags: {}, data: { length: 1 } }); + var frame = flow.read(); + while (frame.type === notFlowControlledFrame.type) frame = flow.read(); + expect(frame.type).to.equal('BLOCKED'); expect(flow.read()).to.equal(null); - - expect(sendCalled).to.equal(1); }); it('has to be overridden by the child class, otherwise it throws', function() { expect(flow._send.bind(flow)).to.throw(Error); @@ -175,6 +176,7 @@ describe('flow.js', function() { var output = []; flow2._receive = function _receive(frame, callback) { if (frame.type === 'DATA') { + expect(frame.data.length).to.be.lte(MAX_PAYLOAD_SIZE) output.push(frame.data); } if (frame.flags.END_STREAM) { @@ -197,5 +199,62 @@ describe('flow.js', function() { flow1.pipe(flow2).pipe(flow1); }); }); + + describe('when running out of window', function() { + it('should send a BLOCKED frame', function(done) { + // Sender side + var frameNumber = util.random(5, 8); + var input = []; + flow1._send = function _send() { + if (input.length >= frameNumber) { + this.push({ type: 'DATA', flags: { END_STREAM: true }, data: new Buffer(0) }); + this.push(null); + } else { + var buffer = new Buffer(util.random(1000, 100000)); + input.push(buffer); + this.push({ type: 'DATA', flags: {}, data: buffer }); + } + }; + + // Receiver side + // Do not send WINDOW_UPDATESs except when the other side sends BLOCKED + var output = []; + flow2._restoreWindow = util.noop; + flow2._receive = function _receive(frame, callback) { + if (frame.type === 'DATA') { + expect(frame.data.length).to.be.lte(MAX_PAYLOAD_SIZE) + output.push(frame.data); + } + if (frame.flags.END_STREAM) { + this.emit('end_stream'); + } + if (frame.type === 'BLOCKED') { + setTimeout(function() { + this._push({ + type: 'WINDOW_UPDATE', + flags: {}, + stream: this._flowControlId, + window_size: this._received + }); + this._received = 0; + }.bind(this), 20); + } + callback(); + }; + + // Checking results + flow2.on('end_stream', function() { + input = util.concat(input); + output = util.concat(output); + + expect(input).to.deep.equal(output); + + done(); + }); + + // Start piping + flow1.pipe(flow2).pipe(flow1); + }) + }); }); }); diff --git a/testing/xpcshell/node-http2/node_modules/http2-protocol/test/framer.js b/testing/xpcshell/node-http2/node_modules/http2-protocol/test/framer.js index ffe07957e46b..8e51cbb25b5f 100644 --- a/testing/xpcshell/node-http2/node_modules/http2-protocol/test/framer.js +++ b/testing/xpcshell/node-http2/node_modules/http2-protocol/test/framer.js @@ -22,7 +22,7 @@ var test_frames = [{ frame: { type: 'DATA', flags: { END_STREAM: false, END_SEGMENT: false, RESERVED4: false, - PAD_LOW: false, PAD_HIGH: false, COMPRESSED: false }, + PADDED: false }, stream: 10, data: new Buffer('12345678', 'hex') @@ -34,7 +34,7 @@ var test_frames = [{ frame: { type: 'HEADERS', flags: { END_STREAM: false, END_SEGMENT: false, END_HEADERS: false, - PAD_LOW: false, PAD_HIGH: false, PRIORITY: false }, + PADDED: false, RESERVED5: false, PRIORITY: false }, stream: 15, data: new Buffer('12345678', 'hex') @@ -45,7 +45,7 @@ var test_frames = [{ frame: { type: 'HEADERS', flags: { END_STREAM: false, END_SEGMENT: false, END_HEADERS: false, - PAD_LOW: false, PAD_HIGH: false, PRIORITY: true }, + PADDED: false, RESERVED5: false, PRIORITY: true }, stream: 15, priorityDependency: 10, priorityWeight: 5, @@ -60,7 +60,7 @@ var test_frames = [{ frame: { type: 'HEADERS', flags: { END_STREAM: false, END_SEGMENT: false, END_HEADERS: false, - PAD_LOW: false, PAD_HIGH: false, PRIORITY: true }, + PADDED: false, RESERVED5: false, PRIORITY: true }, stream: 15, priorityDependency: 10, priorityWeight: 5, @@ -114,21 +114,19 @@ var test_frames = [{ SETTINGS_HEADER_TABLE_SIZE: 0x12345678, SETTINGS_ENABLE_PUSH: true, SETTINGS_MAX_CONCURRENT_STREAMS: 0x01234567, - SETTINGS_INITIAL_WINDOW_SIZE: 0x89ABCDEF, - SETTINGS_COMPRESS_DATA: true + SETTINGS_INITIAL_WINDOW_SIZE: 0x89ABCDEF } }, - buffer: new Buffer('0019' + '04' + '00' + '0000000A' + '01' + '12345678' + - '02' + '00000001' + - '03' + '01234567' + - '04' + '89ABCDEF' + - '05' + '00000001', 'hex') + buffer: new Buffer('0018' + '04' + '00' + '0000000A' + '0001' + '12345678' + + '0002' + '00000001' + + '0003' + '01234567' + + '0004' + '89ABCDEF', 'hex') }, { frame: { type: 'PUSH_PROMISE', flags: { RESERVED1: false, RESERVED2: false, END_PUSH_PROMISE: false, - PAD_LOW: false, PAD_HIGH: false }, + PADDED: false }, stream: 15, promised_stream: 3, @@ -169,8 +167,7 @@ var test_frames = [{ }, { frame: { type: 'CONTINUATION', - flags: { RESERVED1: false, RESERVED2: false, END_HEADERS: true, - PAD_LOW: false, PAD_HIGH: false }, + flags: { RESERVED1: false, RESERVED2: false, END_HEADERS: true }, stream: 10, data: new Buffer('12345678', 'hex') @@ -218,30 +215,30 @@ var padded_test_frames = [{ frame: { type: 'DATA', flags: { END_STREAM: false, END_SEGMENT: false, RESERVED4: false, - PAD_LOW: true, PAD_HIGH: false, COMPRESSED: false }, + PADDED: true }, stream: 10, data: new Buffer('12345678', 'hex') }, - // length + type + flags + stream + pad_low control + content + padding + // length + type + flags + stream + pad length + content + padding buffer: new Buffer('000B' + '00' + '08' + '0000000A' + '06' + '12345678' + '000000000000', 'hex') }, { frame: { type: 'HEADERS', flags: { END_STREAM: false, END_SEGMENT: false, END_HEADERS: false, - PAD_LOW: true, PAD_HIGH: false, PRIORITY: false }, + PADDED: true, RESERVED5: false, PRIORITY: false }, stream: 15, data: new Buffer('12345678', 'hex') }, - // length + type + flags + stream + pad_low control + data + padding + // length + type + flags + stream + pad length + data + padding buffer: new Buffer('000B' + '01' + '08' + '0000000F' + '06' + '12345678' + '000000000000', 'hex') }, { frame: { type: 'HEADERS', flags: { END_STREAM: false, END_SEGMENT: false, END_HEADERS: false, - PAD_LOW: true, PAD_HIGH: false, PRIORITY: true }, + PADDED: true, RESERVED5: false, PRIORITY: true }, stream: 15, priorityDependency: 10, priorityWeight: 5, @@ -249,14 +246,14 @@ var padded_test_frames = [{ data: new Buffer('12345678', 'hex') }, - // length + type + flags + stream + pad_low control + priority dependency + priority weight + data + padding + // length + type + flags + stream + pad length + priority dependency + priority weight + data + padding buffer: new Buffer('0010' + '01' + '28' + '0000000F' + '06' + '0000000A' + '05' + '12345678' + '000000000000', 'hex') }, { frame: { type: 'HEADERS', flags: { END_STREAM: false, END_SEGMENT: false, END_HEADERS: false, - PAD_LOW: true, PAD_HIGH: false, PRIORITY: true }, + PADDED: true, RESERVED5: false, PRIORITY: true }, stream: 15, priorityDependency: 10, priorityWeight: 5, @@ -264,31 +261,20 @@ var padded_test_frames = [{ data: new Buffer('12345678', 'hex') }, - // length + type + flags + stream + pad_low control + priority dependency + priority weight + data + padding + // length + type + flags + stream + pad length + priority dependency + priority weight + data + padding buffer: new Buffer('0010' + '01' + '28' + '0000000F' + '06' + '8000000A' + '05' + '12345678' + '000000000000', 'hex') -}, { - frame: { - type: 'CONTINUATION', - flags: { RESERVED1: false, RESERVED2: false, END_HEADERS: true, - PAD_LOW: true, PAD_HIGH: false }, - stream: 10, - - data: new Buffer('12345678', 'hex') - }, - // length + type + flags + stream + pad_low control + data + padding - buffer: new Buffer('000B' + '09' + '0C' + '0000000A' + '06' + '12345678' + '000000000000', 'hex') }, { frame: { type: 'PUSH_PROMISE', flags: { RESERVED1: false, RESERVED2: false, END_PUSH_PROMISE: false, - PAD_LOW: true, PAD_HIGH: false }, + PADDED: true }, stream: 15, promised_stream: 3, data: new Buffer('12345678', 'hex') }, - // length + type + flags + stream + pad_low control + promised stream + data + padding + // length + type + flags + stream + pad length + promised stream + data + padding buffer: new Buffer('000F' + '05' + '08' + '0000000F' + '06' + '00000003' + '12345678' + '000000000000', 'hex') }]; diff --git a/testing/xpcshell/node-http2/package.json b/testing/xpcshell/node-http2/package.json index adc8c2477f22..b516f8d804ba 100644 --- a/testing/xpcshell/node-http2/package.json +++ b/testing/xpcshell/node-http2/package.json @@ -1,13 +1,13 @@ { "name": "http2", - "version": "2.5.0", + "version": "2.6.0", "description": "An HTTP/2 client and server implementation", "main": "lib/index.js", "engines" : { "node" : ">=0.10.19" }, "dependencies": { - "http2-protocol": "0.12.x" + "http2-protocol": ">=0.13.0" }, "devDependencies": { "istanbul": "*", diff --git a/testing/xpcshell/node-http2/test/http.js b/testing/xpcshell/node-http2/test/http.js index a516b46455d5..825183992360 100644 --- a/testing/xpcshell/node-http2/test/http.js +++ b/testing/xpcshell/node-http2/test/http.js @@ -124,8 +124,8 @@ describe('http.js', function() { server.listen(1234, function() { http2.get('https://localhost:1234' + path, function(response) { - response.on('readable', function() { - expect(response.read().toString()).to.equal(message); + response.on('data', function(data) { + expect(data.toString()).to.equal(message); server.close(); done(); }); @@ -140,8 +140,8 @@ describe('http.js', function() { var server = http2.createServer(options, function(request, response) { expect(request.url).to.equal(path); - request.once('readable', function() { - expect(request.read().toString()).to.equal(message); + request.once('data', function(data) { + expect(data.toString()).to.equal(message); response.end(); }); }); @@ -209,8 +209,8 @@ describe('http.js', function() { expect(response.headers[headerName]).to.equal(headerValue); expect(response.headers['nonexistent']).to.equal(undefined); expect(response.headers['date']).to.equal(undefined); - response.on('readable', function() { - expect(response.read().toString()).to.equal(message); + response.on('data', function(data) { + expect(data.toString()).to.equal(message); server.close(); done(); }); @@ -238,8 +238,8 @@ describe('http.js', function() { port: 1237, path: path }, function(response) { - response.on('readable', function() { - expect(response.read().toString()).to.equal(message); + response.on('data', function(data) { + expect(data.toString()).to.equal(message); server.close(); done(); }); @@ -260,8 +260,8 @@ describe('http.js', function() { server.listen(5678, function() { http2.get('https://localhost:5678' + path, function(response) { - response.on('readable', function() { - expect(response.read().toString()).to.equal(message); + response.on('data', function(data) { + expect(data.toString()).to.equal(message); done(); }); }); @@ -280,8 +280,8 @@ describe('http.js', function() { server.listen(1236, function() { https.get('https://localhost:1236' + path, function(response) { - response.on('readable', function() { - expect(response.read().toString()).to.equal(message); + response.on('data', function(data) { + expect(data.toString()).to.equal(message); done(); }); }); @@ -302,15 +302,15 @@ describe('http.js', function() { done = util.callNTimes(2, done); // 1. request http2.get('https://localhost:1237' + path, function(response) { - response.on('readable', function() { - expect(response.read().toString()).to.equal(message); + response.on('data', function(data) { + expect(data.toString()).to.equal(message); done(); }); }); // 2. request http2.get('https://localhost:1237' + path, function(response) { - response.on('readable', function() { - expect(response.read().toString()).to.equal(message); + response.on('data', function(data) { + expect(data.toString()).to.equal(message); done(); }); }); @@ -330,13 +330,13 @@ describe('http.js', function() { server.listen(1238, function() { // 1. request http2.get('https://localhost:1238' + path, function(response) { - response.on('readable', function() { - expect(response.read().toString()).to.equal(message); + response.on('data', function(data) { + expect(data.toString()).to.equal(message); // 2. request http2.get('https://localhost:1238' + path, function(response) { - response.on('readable', function() { - expect(response.read().toString()).to.equal(message); + response.on('data', function(data) { + expect(data.toString()).to.equal(message); done(); }); }); @@ -398,8 +398,8 @@ describe('http.js', function() { done = util.callNTimes(5, done); request.on('response', function(response) { - response.on('readable', function() { - expect(response.read().toString()).to.equal(message); + response.on('data', function(data) { + expect(data.toString()).to.equal(message); done(); }); response.on('end', done); @@ -408,8 +408,8 @@ describe('http.js', function() { request.on('push', function(promise) { expect(promise.url).to.be.equal(pushedPath); promise.on('response', function(pushStream) { - pushStream.on('readable', function() { - expect(pushStream.read().toString()).to.equal(pushedMessage); + pushStream.on('data', function(data) { + expect(data.toString()).to.equal(pushedMessage); done(); }); pushStream.on('end', done); diff --git a/toolkit/components/passwordmgr/LoginManagerContent.jsm b/toolkit/components/passwordmgr/LoginManagerContent.jsm index 9f250679d180..a2db10dfab68 100644 --- a/toolkit/components/passwordmgr/LoginManagerContent.jsm +++ b/toolkit/components/passwordmgr/LoginManagerContent.jsm @@ -1,8 +1,12 @@ +/* vim: set ts=4 sts=4 sw=4 et tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -this.EXPORTED_SYMBOLS = ["LoginManagerContent"]; +"use strict"; + +this.EXPORTED_SYMBOLS = [ "LoginManagerContent", + "UserAutoCompleteResult" ]; const Ci = Components.interfaces; const Cr = Components.results; @@ -12,6 +16,7 @@ const Cu = Components.utils; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/PrivateBrowsingUtils.jsm"); +Cu.import("resource://gre/modules/Promise.jsm"); // These mirror signon.* prefs. var gEnabled, gDebug, gAutofillForms, gStoreWhenAutocompleteOff; @@ -62,7 +67,7 @@ var observer = { try { LoginManagerContent._onFormSubmit(formElement); } catch (e) { - log("Caught error in onFormSubmit:", e); + log("Caught error in onFormSubmit(", e.lineNumber, "):", e.message); } return true; // Always return true, or form submit will be canceled. @@ -83,6 +88,15 @@ prefBranch.addObserver("", observer.onPrefChange, false); observer.onPrefChange(); // read initial values +function messageManagerFromWindow(win) { + return win.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebNavigation) + .QueryInterface(Ci.nsIDocShell) + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIContentFrameMessageManager) +} + +// This object maps to the "child" process (even in the single-process case). var LoginManagerContent = { __formFillService : null, // FormFillController, for username autocompleting @@ -94,6 +108,125 @@ var LoginManagerContent = { return this.__formFillService; }, + _getRandomId: function() { + return Cc["@mozilla.org/uuid-generator;1"] + .getService(Ci.nsIUUIDGenerator).generateUUID().toString(); + }, + + _messages: [ "RemoteLogins:loginsFound", + "RemoteLogins:loginsAutoCompleted" ], + + // Map from form login requests to information about that request. + _requests: new Map(), + + // Number of outstanding requests to each manager. + _managers: new Map(), + + _takeRequest: function(msg) { + let data = msg.data; + let request = this._requests.get(data.requestId); + + this._requests.delete(data.requestId); + + let count = this._managers.get(msg.target); + if (--count === 0) { + this._managers.delete(msg.target); + + for (let message of this._messages) + msg.target.removeMessageListener(message, this); + } else { + this._managers.set(msg.target, count); + } + + return request; + }, + + _sendRequest: function(messageManager, requestData, + name, messageData) { + let count; + if (!(count = this._managers.get(messageManager))) { + this._managers.set(messageManager, 1); + + for (let message of this._messages) + messageManager.addMessageListener(message, this); + } else { + this._managers.set(messageManager, ++count); + } + + let requestId = this._getRandomId(); + messageData.requestId = requestId; + + messageManager.sendAsyncMessage(name, messageData); + + let deferred = Promise.defer(); + requestData.promise = deferred; + this._requests.set(requestId, requestData); + return deferred.promise; + }, + + receiveMessage: function (msg) { + let request = this._takeRequest(msg); + switch (msg.name) { + case "RemoteLogins:loginsFound": { + request.promise.resolve({ form: request.form, + loginsFound: msg.data.logins }); + break; + } + + case "RemoteLogins:loginsAutoCompleted": { + request.promise.resolve(msg.data.logins); + break; + } + } + }, + + _asyncFindLogins: function(form, options) { + let doc = form.ownerDocument; + let win = doc.defaultView; + + let formOrigin = LoginUtils._getPasswordOrigin(doc.documentURI); + let actionOrigin = LoginUtils._getActionOrigin(form); + + let messageManager = messageManagerFromWindow(win); + + // XXX Weak?? + let requestData = { form: form }; + let messageData = { formOrigin: formOrigin, + actionOrigin: actionOrigin, + options: options }; + + return this._sendRequest(messageManager, requestData, + "RemoteLogins:findLogins", + messageData); + }, + + _autoCompleteSearchAsync: function(aSearchString, aPreviousResult, + aElement, aRect) { + let doc = aElement.ownerDocument; + let form = aElement.form; + let win = doc.defaultView; + + let formOrigin = LoginUtils._getPasswordOrigin(doc.documentURI); + let actionOrigin = LoginUtils._getActionOrigin(form); + + let messageManager = messageManagerFromWindow(win); + + let remote = (Services.appinfo.processType === + Services.appinfo.PROCESS_TYPE_CONTENT); + + let requestData = {}; + let messageData = { formOrigin: formOrigin, + actionOrigin: actionOrigin, + searchString: aSearchString, + previousResult: aPreviousResult, + rect: aRect, + remote: remote }; + + return this._sendRequest(messageManager, requestData, + "RemoteLogins:autoCompleteLogins", + messageData); + }, + /* * onFormPassword * @@ -107,51 +240,18 @@ var LoginManagerContent = { return; let form = event.target; - let doc = form.ownerDocument; - - log("onFormPassword for", doc.documentURI); - - // If there are no logins for this site, bail out now. - let formOrigin = LoginUtils._getPasswordOrigin(doc.documentURI); - if (!Services.logins.countLogins(formOrigin, "", null)) - return; - - // If we're currently displaying a master password prompt, defer - // processing this form until the user handles the prompt. - if (Services.logins.uiBusy) { - log("deferring onFormPassword for", doc.documentURI); - let self = this; - let observer = { - QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference]), - - observe: function (subject, topic, data) { - log("Got deferred onFormPassword notification:", topic); - // Only run observer once. - Services.obs.removeObserver(this, "passwordmgr-crypto-login"); - Services.obs.removeObserver(this, "passwordmgr-crypto-loginCanceled"); - if (topic == "passwordmgr-crypto-loginCanceled") - return; - self.onFormPassword(event); - }, - handleEvent : function (event) { - // Not expected to be called - } - }; - // Trickyness follows: We want an observer, but don't want it to - // cause leaks. So add the observer with a weak reference, and use - // a dummy event listener (a strong reference) to keep it alive - // until the form is destroyed. - Services.obs.addObserver(observer, "passwordmgr-crypto-login", true); - Services.obs.addObserver(observer, "passwordmgr-crypto-loginCanceled", true); - form.addEventListener("mozCleverClosureHack", observer); - return; - } - - let autofillForm = gAutofillForms && !PrivateBrowsingUtils.isWindowPrivate(doc.defaultView); - - this._fillForm(form, autofillForm, false, false, false, null); + log("onFormPassword for", form.ownerDocument.documentURI); + this._asyncFindLogins(form, { showMasterPassword: true }) + .then(this.loginsFound.bind(this)) + .then(null, Cu.reportError); }, + loginsFound: function({ form, loginsFound }) { + let doc = form.ownerDocument; + let autofillForm = gAutofillForms && !PrivateBrowsingUtils.isWindowPrivate(doc.defaultView); + + this._fillForm(form, autofillForm, false, false, false, loginsFound); + }, /* * onUsernameInput @@ -191,12 +291,11 @@ var LoginManagerContent = { var [usernameField, passwordField, ignored] = this._getFormFields(acForm, false); if (usernameField == acInputField && passwordField) { - // If the user has a master password but itsn't logged in, bail - // out now to prevent annoying prompts. - if (!Services.logins.isLoggedIn) - return; - - this._fillForm(acForm, true, true, true, true, null); + this._asyncFindLogins(acForm, { showMasterPassword: false }) + .then(({ form, loginsFound }) => { + this._fillForm(form, true, true, true, true, loginsFound); + }) + .then(null, Cu.reportError); } else { // Ignore the event, it's for some input we don't care about. } @@ -379,15 +478,6 @@ var LoginManagerContent = { * our stored password. */ _onFormSubmit : function (form) { - - // For E10S this will need to move. - function getPrompter(aWindow) { - var prompterSvc = Cc["@mozilla.org/login-manager/prompter;1"]. - createInstance(Ci.nsILoginManagerPrompter); - prompterSvc.init(aWindow); - return prompterSvc; - } - var doc = form.ownerDocument; var win = doc.defaultView; @@ -417,11 +507,6 @@ var LoginManagerContent = { } var formSubmitURL = LoginUtils._getActionOrigin(form) - if (!Services.logins.getLoginSavingEnabled(hostname)) { - log("(form submission ignored -- saving is disabled for:", hostname, ")"); - return; - } - // Get the appropriate fields from the form. var [usernameField, newPasswordField, oldPasswordField] = @@ -429,7 +514,7 @@ var LoginManagerContent = { // Need at least 1 valid password field to do anything. if (newPasswordField == null) - return; + return; // Check for autocomplete=off attribute. We don't use it to prevent // autofilling (for existing logins), but won't save logins when it's @@ -444,103 +529,27 @@ var LoginManagerContent = { return; } + // Don't try to send DOM nodes over IPC. + let mockUsername = usernameField ? + { name: usernameField.name, + value: usernameField.value } : + null; + let mockPassword = { name: newPasswordField.name, + value: newPasswordField.value }; + let mockOldPassword = oldPasswordField ? + { name: oldPasswordField.name, + value: oldPasswordField.value } : + null; - var formLogin = Cc["@mozilla.org/login-manager/loginInfo;1"]. - createInstance(Ci.nsILoginInfo); - formLogin.init(hostname, formSubmitURL, null, - (usernameField ? usernameField.value : ""), - newPasswordField.value, - (usernameField ? usernameField.name : ""), - newPasswordField.name); - - // If we didn't find a username field, but seem to be changing a - // password, allow the user to select from a list of applicable - // logins to update the password for. - if (!usernameField && oldPasswordField) { - - var logins = Services.logins.findLogins({}, hostname, formSubmitURL, null); - - if (logins.length == 0) { - // Could prompt to save this as a new password-only login. - // This seems uncommon, and might be wrong, so ignore. - log("(no logins for this host -- pwchange ignored)"); - return; - } - - var prompter = getPrompter(win); - - if (logins.length == 1) { - var oldLogin = logins[0]; - formLogin.username = oldLogin.username; - formLogin.usernameField = oldLogin.usernameField; - - prompter.promptToChangePassword(oldLogin, formLogin); - } else { - prompter.promptToChangePasswordWithUsernames( - logins, logins.length, formLogin); - } - - return; - } - - - // Look for an existing login that matches the form login. - var existingLogin = null; - var logins = Services.logins.findLogins({}, hostname, formSubmitURL, null); - - for (var i = 0; i < logins.length; i++) { - var same, login = logins[i]; - - // If one login has a username but the other doesn't, ignore - // the username when comparing and only match if they have the - // same password. Otherwise, compare the logins and match even - // if the passwords differ. - if (!login.username && formLogin.username) { - var restoreMe = formLogin.username; - formLogin.username = ""; - same = formLogin.matches(login, false); - formLogin.username = restoreMe; - } else if (!formLogin.username && login.username) { - formLogin.username = login.username; - same = formLogin.matches(login, false); - formLogin.username = ""; // we know it's always blank. - } else { - same = formLogin.matches(login, true); - } - - if (same) { - existingLogin = login; - break; - } - } - - if (existingLogin) { - log("Found an existing login matching this form submission"); - - // Change password if needed. - if (existingLogin.password != formLogin.password) { - log("...passwords differ, prompting to change."); - prompter = getPrompter(win); - prompter.promptToChangePassword(existingLogin, formLogin); - } else { - // Update the lastUsed timestamp. - var propBag = Cc["@mozilla.org/hash-property-bag;1"]. - createInstance(Ci.nsIWritablePropertyBag); - propBag.setProperty("timeLastUsed", Date.now()); - propBag.setProperty("timesUsedIncrement", 1); - Services.logins.modifyLogin(existingLogin, propBag); - } - - return; - } - - - // Prompt user to save login (via dialog or notification bar) - prompter = getPrompter(win); - prompter.promptToSavePassword(formLogin); + let messageManager = messageManagerFromWindow(win); + messageManager.sendAsyncMessage("RemoteLogins:onFormSubmit", + { hostname: hostname, + formSubmitURL: formSubmitURL, + usernameField: mockUsername, + newPasswordField: mockPassword, + oldPasswordField: mockOldPassword }); }, - /* * _fillform * @@ -576,17 +585,6 @@ var LoginManagerContent = { return [false, foundLogins]; } - // Need to get a list of logins if we weren't given them - if (foundLogins == null) { - var formOrigin = - LoginUtils._getPasswordOrigin(form.ownerDocument.documentURI); - var actionOrigin = LoginUtils._getActionOrigin(form); - foundLogins = Services.logins.findLogins({}, formOrigin, actionOrigin, null); - log("found", foundLogins.length, "matching logins."); - } else { - log("reusing logins from last form."); - } - // Discard logins which have username/password values that don't // fit into the fields (as specified by the maxlength attribute). // The user couldn't enter these values anyway, and it helps @@ -600,6 +598,15 @@ var LoginManagerContent = { if (passwordField.maxLength >= 0) maxPasswordLen = passwordField.maxLength; + foundLogins = foundLogins.map(login => { + var formLogin = Cc["@mozilla.org/login-manager/loginInfo;1"]. + createInstance(Ci.nsILoginInfo); + formLogin.init(login.hostname, login.formSubmitURL, + login.httpRealm, login.username, + login.password, login.usernameField, + login.passwordField); + return formLogin; + }); var logins = foundLogins.filter(function (l) { var fit = (l.username.length <= maxUsernameLen && l.password.length <= maxPasswordLen); @@ -792,10 +799,7 @@ var LoginManagerContent = { }; - - - -LoginUtils = { +var LoginUtils = { /* * _getPasswordOrigin * @@ -841,3 +845,93 @@ LoginUtils = { }, }; + +// nsIAutoCompleteResult implementation +function UserAutoCompleteResult (aSearchString, matchingLogins) { + function loginSort(a,b) { + var userA = a.username.toLowerCase(); + var userB = b.username.toLowerCase(); + + if (userA < userB) + return -1; + + if (userB > userA) + return 1; + + return 0; + }; + + this.searchString = aSearchString; + this.logins = matchingLogins.sort(loginSort); + this.matchCount = matchingLogins.length; + + if (this.matchCount > 0) { + this.searchResult = Ci.nsIAutoCompleteResult.RESULT_SUCCESS; + this.defaultIndex = 0; + } +} + +UserAutoCompleteResult.prototype = { + QueryInterface : XPCOMUtils.generateQI([Ci.nsIAutoCompleteResult, + Ci.nsISupportsWeakReference]), + + // private + logins : null, + + // Allow autoCompleteSearch to get at the JS object so it can + // modify some readonly properties for internal use. + get wrappedJSObject() { + return this; + }, + + // Interfaces from idl... + searchString : null, + searchResult : Ci.nsIAutoCompleteResult.RESULT_NOMATCH, + defaultIndex : -1, + errorDescription : "", + matchCount : 0, + + getValueAt : function (index) { + if (index < 0 || index >= this.logins.length) + throw "Index out of range."; + + return this.logins[index].username; + }, + + getLabelAt: function(index) { + return this.getValueAt(index); + }, + + getCommentAt : function (index) { + return ""; + }, + + getStyleAt : function (index) { + return ""; + }, + + getImageAt : function (index) { + return ""; + }, + + getFinalCompleteValueAt : function (index) { + return this.getValueAt(index); + }, + + removeValueAt : function (index, removeFromDB) { + if (index < 0 || index >= this.logins.length) + throw "Index out of range."; + + var [removedLogin] = this.logins.splice(index, 1); + + this.matchCount--; + if (this.defaultIndex > this.logins.length) + this.defaultIndex--; + + if (removeFromDB) { + var pwmgr = Cc["@mozilla.org/login-manager;1"]. + getService(Ci.nsILoginManager); + pwmgr.removeLogin(removedLogin); + } + } +}; diff --git a/toolkit/components/passwordmgr/LoginManagerParent.jsm b/toolkit/components/passwordmgr/LoginManagerParent.jsm new file mode 100644 index 000000000000..5aeb3020fea2 --- /dev/null +++ b/toolkit/components/passwordmgr/LoginManagerParent.jsm @@ -0,0 +1,321 @@ +/* vim: set ts=4 sts=4 sw=4 et tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +const Cu = Components.utils; +const Ci = Components.interfaces; +const Cc = Components.classes; + +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +Cu.import("resource://gre/modules/Services.jsm"); + +XPCOMUtils.defineLazyModuleGetter(this, "UserAutoCompleteResult", + "resource://gre/modules/LoginManagerContent.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "AutoCompleteE10S", + "resource://gre/modules/AutoCompleteE10S.jsm"); + +this.EXPORTED_SYMBOLS = [ "LoginManagerParent" ]; + +var gDebug; + +function log(...pieces) { + function generateLogMessage(args) { + let strings = ['Login Manager (parent):']; + + args.forEach(function(arg) { + if (typeof arg === 'string') { + strings.push(arg); + } else if (typeof arg === 'undefined') { + strings.push('undefined'); + } else if (arg === null) { + strings.push('null'); + } else { + try { + strings.push(JSON.stringify(arg, null, 2)); + } catch(err) { + strings.push("<>"); + } + } + }); + return strings.join(' '); + } + + if (!gDebug) + return; + + let message = generateLogMessage(pieces); + dump(message + "\n"); + Services.console.logStringMessage(message); +} + +function prefChanged() { + gDebug = Services.prefs.getBoolPref("signon.debug"); +} + +Services.prefs.addObserver("signon.debug", prefChanged, false); +prefChanged(); + +var LoginManagerParent = { + init: function() { + let mm = Cc["@mozilla.org/globalmessagemanager;1"] + .getService(Ci.nsIMessageListenerManager); + mm.addMessageListener("RemoteLogins:findLogins", this); + mm.addMessageListener("RemoteLogins:onFormSubmit", this); + mm.addMessageListener("RemoteLogins:autoCompleteLogins", this); + }, + + receiveMessage: function (msg) { + let data = msg.data; + + switch (msg.name) { + case "RemoteLogins:findLogins": { + // TODO Verify msg.target's principals against the formOrigin? + this.findLogins(data.options.showMasterPassword, + data.formOrigin, + data.actionOrigin, + data.requestId, + msg.target.messageManager); + break; + } + + case "RemoteLogins:onFormSubmit": { + // TODO Verify msg.target's principals against the formOrigin? + this.onFormSubmit(data.hostname, + data.formSubmitURL, + data.usernameField, + data.newPasswordField, + data.oldPasswordField, + msg.target); + break; + } + + case "RemoteLogins:autoCompleteLogins": { + this.doAutocompleteSearch(data, msg.target); + break; + } + } + }, + + findLogins: function(showMasterPassword, formOrigin, actionOrigin, + requestId, target) { + if (!showMasterPassword && !Services.logins.isLoggedIn) { + target.sendAsyncMessage("RemoteLogins:loginsFound", + { requestId: requestId, logins: [] }); + return; + } + + // If there are no logins for this site, bail out now. + if (!Services.logins.countLogins(formOrigin, "", null)) { + target.sendAsyncMessage("RemoteLogins:loginsFound", + { requestId: requestId, logins: [] }); + return; + } + + // If we're currently displaying a master password prompt, defer + // processing this form until the user handles the prompt. + if (Services.logins.uiBusy) { + log("deferring onFormPassword for", formOrigin); + let self = this; + let observer = { + QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, + Ci.nsISupportsWeakReference]), + + observe: function (subject, topic, data) { + log("Got deferred onFormPassword notification:", topic); + // Only run observer once. + Services.obs.removeObserver(this, "passwordmgr-crypto-login"); + Services.obs.removeObserver(this, "passwordmgr-crypto-loginCanceled"); + if (topic == "passwordmgr-crypto-loginCanceled") { + target.sendAsyncMessage("RemoteLogins:loginsFound", + { requestId: requestId, logins: [] }); + return; + } + + self.findLogins(showMasterPassword, formOrigin, actionOrigin, + requestId, target); + }, + }; + + // Possible leak: it's possible that neither of these notifications + // will fire, and if that happens, we'll leak the observer (and + // never return). We should guarantee that at least one of these + // will fire. + // See bug XXX. + Services.obs.addObserver(observer, "passwordmgr-crypto-login", false); + Services.obs.addObserver(observer, "passwordmgr-crypto-loginCanceled", false); + return; + } + + var logins = Services.logins.findLogins({}, formOrigin, actionOrigin, null); + target.sendAsyncMessage("RemoteLogins:loginsFound", + { requestId: requestId, logins: logins }); + }, + + doAutocompleteSearch: function({ formOrigin, actionOrigin, + searchString, previousResult, + rect, requestId, remote }, target) { + // Note: previousResult is a regular object, not an + // nsIAutoCompleteResult. + var result; + var matchingLogins; + + let searchStringLower = searchString.toLowerCase(); + let logins; + if (previousResult && + searchStringLower.startsWith(previousResult.searchString.toLowerCase())) { + log("Using previous autocomplete result"); + + // We have a list of results for a shorter search string, so just + // filter them further based on the new search string. + logins = previousResult.logins; + } else { + log("Creating new autocomplete search result."); + + // Grab the logins from the database. + logins = Services.logins.findLogins({}, formOrigin, actionOrigin, null); + } + + let matchingLogins = logins.filter(function(fullMatch) { + let match = fullMatch.username; + + // Remove results that are too short, or have different prefix. + // Also don't offer empty usernames as possible results. + return match && match.toLowerCase().startsWith(searchStringLower); + }); + + // XXX In the E10S case, we're responsible for showing our own + // autocomplete popup here because the autocomplete protocol hasn't + // been e10s-ized yet. In the non-e10s case, our caller is responsible + // for showing the autocomplete popup (via the regular + // nsAutoCompleteController). + if (remote) { + result = new UserAutoCompleteResult(searchString, matchingLogins); + AutoCompleteE10S.showPopupWithResults(target.ownerDocument.defaultView, rect, result); + } + + target.messageManager.sendAsyncMessage("RemoteLogins:loginsAutoCompleted", + { requestId: requestId, + logins: matchingLogins }); + }, + + onFormSubmit: function(hostname, formSubmitURL, + usernameField, newPasswordField, + oldPasswordField, + target) { + function getPrompter() { + var prompterSvc = Cc["@mozilla.org/login-manager/prompter;1"]. + createInstance(Ci.nsILoginManagerPrompter); + // XXX For E10S, we don't want to use the browser's contentWindow + // because it's in another process, so we use our chrome window as + // the window parent (the content process is responsible for + // making sure that its window is not in private browsing mode). + // In the same-process case, we can simply use the content window. + prompterSvc.init(target.isRemoteBrowser ? + target.ownerDocument.defaultView : + target.contentWindow); + return prompterSvc; + } + + if (!Services.logins.getLoginSavingEnabled(hostname)) { + log("(form submission ignored -- saving is disabled for:", hostname, ")"); + return; + } + + var formLogin = Cc["@mozilla.org/login-manager/loginInfo;1"]. + createInstance(Ci.nsILoginInfo); + formLogin.init(hostname, formSubmitURL, null, + (usernameField ? usernameField.value : ""), + newPasswordField.value, + (usernameField ? usernameField.name : ""), + newPasswordField.name); + + // If we didn't find a username field, but seem to be changing a + // password, allow the user to select from a list of applicable + // logins to update the password for. + if (!usernameField && oldPasswordField) { + + var logins = Services.logins.findLogins({}, hostname, formSubmitURL, null); + + if (logins.length == 0) { + // Could prompt to save this as a new password-only login. + // This seems uncommon, and might be wrong, so ignore. + log("(no logins for this host -- pwchange ignored)"); + return; + } + + var prompter = getPrompter(); + + if (logins.length == 1) { + var oldLogin = logins[0]; + formLogin.username = oldLogin.username; + formLogin.usernameField = oldLogin.usernameField; + + prompter.promptToChangePassword(oldLogin, formLogin); + } else { + prompter.promptToChangePasswordWithUsernames( + logins, logins.length, formLogin); + } + + return; + } + + + // Look for an existing login that matches the form login. + var existingLogin = null; + var logins = Services.logins.findLogins({}, hostname, formSubmitURL, null); + + for (var i = 0; i < logins.length; i++) { + var same, login = logins[i]; + + // If one login has a username but the other doesn't, ignore + // the username when comparing and only match if they have the + // same password. Otherwise, compare the logins and match even + // if the passwords differ. + if (!login.username && formLogin.username) { + var restoreMe = formLogin.username; + formLogin.username = ""; + same = formLogin.matches(login, false); + formLogin.username = restoreMe; + } else if (!formLogin.username && login.username) { + formLogin.username = login.username; + same = formLogin.matches(login, false); + formLogin.username = ""; // we know it's always blank. + } else { + same = formLogin.matches(login, true); + } + + if (same) { + existingLogin = login; + break; + } + } + + if (existingLogin) { + log("Found an existing login matching this form submission"); + + // Change password if needed. + if (existingLogin.password != formLogin.password) { + log("...passwords differ, prompting to change."); + prompter = getPrompter(); + prompter.promptToChangePassword(existingLogin, formLogin); + } else { + // Update the lastUsed timestamp. + var propBag = Cc["@mozilla.org/hash-property-bag;1"]. + createInstance(Ci.nsIWritablePropertyBag); + propBag.setProperty("timeLastUsed", Date.now()); + propBag.setProperty("timesUsedIncrement", 1); + Services.logins.modifyLogin(existingLogin, propBag); + } + + return; + } + + + // Prompt user to save login (via dialog or notification bar) + prompter = getPrompter(); + prompter.promptToSavePassword(formLogin); + } +}; diff --git a/toolkit/components/passwordmgr/LoginStore.jsm b/toolkit/components/passwordmgr/LoginStore.jsm index 58d691fa04a7..45ed6071b1ae 100644 --- a/toolkit/components/passwordmgr/LoginStore.jsm +++ b/toolkit/components/passwordmgr/LoginStore.jsm @@ -189,6 +189,14 @@ LoginStore.prototype = { } } + // In some rare cases it's possible for logins to have been added to + // our database between the call to OS.File.read and when we've been + // notified that there was a problem with it. In that case, leave the + // synchronously-added data alone. See bug 1029128, comment 4. + if (this.dataReady) { + return; + } + // In any case, initialize a new object to host the data. this.data = { nextId: 1, diff --git a/toolkit/components/passwordmgr/moz.build b/toolkit/components/passwordmgr/moz.build index 22991b19d814..670d8edb607a 100644 --- a/toolkit/components/passwordmgr/moz.build +++ b/toolkit/components/passwordmgr/moz.build @@ -35,6 +35,7 @@ EXTRA_JS_MODULES += [ 'InsecurePasswordUtils.jsm', 'LoginHelper.jsm', 'LoginManagerContent.jsm', + 'LoginManagerParent.jsm', ] if CONFIG['OS_TARGET'] == 'Android': diff --git a/toolkit/components/passwordmgr/nsILoginManager.idl b/toolkit/components/passwordmgr/nsILoginManager.idl index 4beee995d173..6295b46f9782 100644 --- a/toolkit/components/passwordmgr/nsILoginManager.idl +++ b/toolkit/components/passwordmgr/nsILoginManager.idl @@ -8,12 +8,12 @@ interface nsIURI; interface nsILoginInfo; interface nsIAutoCompleteResult; +interface nsIFormAutoCompleteObserver; interface nsIDOMHTMLInputElement; interface nsIDOMHTMLFormElement; interface nsIPropertyBag; -[scriptable, uuid(f5f2a39a-dffe-4eb9-ad28-340afd53b1a3)] - +[scriptable, uuid(f0c5ca21-db71-4b32-993e-ab63054cc6f5)] interface nsILoginManager : nsISupports { /** * This promise is resolved when initialization is complete, and is rejected @@ -210,9 +210,10 @@ interface nsILoginManager : nsISupports { * which calls it directly. This isn't really ideal, it should * probably be callback registered through the FFC. */ - nsIAutoCompleteResult autoCompleteSearch(in AString aSearchString, - in nsIAutoCompleteResult aPreviousResult, - in nsIDOMHTMLInputElement aElement); + void autoCompleteSearchAsync(in AString aSearchString, + in nsIAutoCompleteResult aPreviousResult, + in nsIDOMHTMLInputElement aElement, + in nsIFormAutoCompleteObserver aListener); /** * Fill a form with login information if we have it. This method will fill @@ -220,9 +221,9 @@ interface nsILoginManager : nsISupports { * * @param aForm * The form to fill - * @return Success of attempt fill form + * @return Promise that is resolved with whether or not the form was filled. */ - boolean fillForm(in nsIDOMHTMLFormElement aForm); + jsval fillForm(in nsIDOMHTMLFormElement aForm); /** * Search for logins in the login manager. An array is always returned; diff --git a/toolkit/components/passwordmgr/nsLoginManager.js b/toolkit/components/passwordmgr/nsLoginManager.js index 9e54764049cc..26ae18f3fdc6 100644 --- a/toolkit/components/passwordmgr/nsLoginManager.js +++ b/toolkit/components/passwordmgr/nsLoginManager.js @@ -5,17 +5,20 @@ const Cc = Components.classes; const Ci = Components.interfaces; +const Cu = Components.utils; -Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); -Components.utils.import("resource://gre/modules/Services.jsm"); -Components.utils.import("resource://gre/modules/PrivateBrowsingUtils.jsm"); +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +Cu.import("resource://gre/modules/Services.jsm"); +Cu.import("resource://gre/modules/Timer.jsm"); +Cu.import("resource://gre/modules/PrivateBrowsingUtils.jsm"); +Cu.import("resource://gre/modules/LoginManagerContent.jsm"); -XPCOMUtils.defineLazyModuleGetter(this, "LoginManagerContent", - "resource://gre/modules/LoginManagerContent.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "Promise", "resource://gre/modules/Promise.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "Task", "resource://gre/modules/Task.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "BrowserUtils", + "resource://gre/modules/BrowserUtils.jsm"); var debug = false; function log(...pieces) { @@ -116,11 +119,17 @@ LoginManager.prototype = { // Form submit observer checks forms for new logins and pw changes. Services.obs.addObserver(this._observer, "xpcom-shutdown", false); - Services.obs.addObserver(this._observer, "passwordmgr-storage-replace", - false); - // Initialize storage so that asynchronous data loading can start. - this._initStorage(); + // TODO: Make this class useful in the child process (in addition to + // autoCompleteSearchAsync and fillForm). + if (Services.appinfo.processType === + Services.appinfo.PROCESS_TYPE_DEFAULT) { + Services.obs.addObserver(this._observer, "passwordmgr-storage-replace", + false); + + // Initialize storage so that asynchronous data loading can start. + this._initStorage(); + } }, @@ -408,91 +417,53 @@ LoginManager.prototype = { return this._storage.setLoginSavingEnabled(hostname, enabled); }, - /* - * autoCompleteSearch + * autoCompleteSearchAsync * * Yuck. This is called directly by satchel: * nsFormFillController::StartSearch() - * [toolkit/components/satchel/src/nsFormFillController.cpp] + * [toolkit/components/satchel/nsFormFillController.cpp] * * We really ought to have a simple way for code to register an * auto-complete provider, and not have satchel calling pwmgr directly. */ - autoCompleteSearch : function (aSearchString, aPreviousResult, aElement) { - // aPreviousResult & aResult are nsIAutoCompleteResult, - // aElement is nsIDOMHTMLInputElement + autoCompleteSearchAsync : function (aSearchString, aPreviousResult, + aElement, aCallback) { + // aPreviousResult is an nsIAutoCompleteResult, aElement is + // nsIDOMHTMLInputElement - if (!this._remember) - return null; + if (!this._remember) { + setTimeout(function() { + aCallback.onSearchCompletion(new UserAutoCompleteResult(aSearchString, [])); + }, 0); + return; + } log("AutoCompleteSearch invoked. Search is:", aSearchString); - var result = null; - - if (aPreviousResult && - aSearchString.substr(0, aPreviousResult.searchString.length) == aPreviousResult.searchString) { - log("Using previous autocomplete result"); - result = aPreviousResult; - result.wrappedJSObject.searchString = aSearchString; - - // We have a list of results for a shorter search string, so just - // filter them further based on the new search string. - // Count backwards, because result.matchCount is decremented - // when we remove an entry. - for (var i = result.matchCount - 1; i >= 0; i--) { - var match = result.getValueAt(i); - - // Remove results that are too short, or have different prefix. - if (aSearchString.length > match.length || - aSearchString.toLowerCase() != - match.substr(0, aSearchString.length).toLowerCase()) - { - log("Removing autocomplete entry:", match); - result.removeValueAt(i, false); - } - } + var previousResult; + if (aPreviousResult) { + previousResult = { searchString: aPreviousResult.searchString, + logins: aPreviousResult.wrappedJSObject.logins }; } else { - log("Creating new autocomplete search result."); - - var doc = aElement.ownerDocument; - var origin = this._getPasswordOrigin(doc.documentURI); - var actionOrigin = this._getActionOrigin(aElement.form); - - // This shouldn't trigger a master password prompt, because we - // don't attach to the input until after we successfully obtain - // logins for the form. - var logins = this.findLogins({}, origin, actionOrigin, null); - var matchingLogins = []; - - // Filter out logins that don't match the search prefix. Also - // filter logins without a username, since that's confusing to see - // in the dropdown and we can't autocomplete them anyway. - for (i = 0; i < logins.length; i++) { - var username = logins[i].username.toLowerCase(); - if (username && - aSearchString.length <= username.length && - aSearchString.toLowerCase() == - username.substr(0, aSearchString.length)) - { - matchingLogins.push(logins[i]); - } - } - log(matchingLogins.length, "autocomplete logins avail."); - result = new UserAutoCompleteResult(aSearchString, matchingLogins); + previousResult = null; } - return result; + let rect = BrowserUtils.getElementBoundingScreenRect(aElement); + LoginManagerContent._autoCompleteSearchAsync(aSearchString, previousResult, + aElement, rect) + .then(function(logins) { + let results = + new UserAutoCompleteResult(aSearchString, logins); + aCallback.onSearchCompletion(results); + }) + .then(null, Cu.reportError); }, - - /* ------- Internal methods / callbacks for document integration ------- */ - - /* * _getPasswordOrigin * @@ -545,102 +516,13 @@ LoginManager.prototype = { */ fillForm : function (form) { log("fillForm processing form[ id:", form.id, "]"); - return LoginManagerContent._fillForm(form, true, true, false, false, null)[0]; + return LoginManagerContent._asyncFindLogins(form, { showMasterPassword: true }) + .then(function({ form, loginsFound }) { + return LoginManagerContent._fillForm(form, true, true, + false, false, loginsFound)[0]; + }); }, }; // end of LoginManager implementation - - - -// nsIAutoCompleteResult implementation -function UserAutoCompleteResult (aSearchString, matchingLogins) { - function loginSort(a,b) { - var userA = a.username.toLowerCase(); - var userB = b.username.toLowerCase(); - - if (userA < userB) - return -1; - - if (userB > userA) - return 1; - - return 0; - }; - - this.searchString = aSearchString; - this.logins = matchingLogins.sort(loginSort); - this.matchCount = matchingLogins.length; - - if (this.matchCount > 0) { - this.searchResult = Ci.nsIAutoCompleteResult.RESULT_SUCCESS; - this.defaultIndex = 0; - } -} - -UserAutoCompleteResult.prototype = { - QueryInterface : XPCOMUtils.generateQI([Ci.nsIAutoCompleteResult, - Ci.nsISupportsWeakReference]), - - // private - logins : null, - - // Allow autoCompleteSearch to get at the JS object so it can - // modify some readonly properties for internal use. - get wrappedJSObject() { - return this; - }, - - // Interfaces from idl... - searchString : null, - searchResult : Ci.nsIAutoCompleteResult.RESULT_NOMATCH, - defaultIndex : -1, - errorDescription : "", - matchCount : 0, - - getValueAt : function (index) { - if (index < 0 || index >= this.logins.length) - throw "Index out of range."; - - return this.logins[index].username; - }, - - getLabelAt: function(index) { - return this.getValueAt(index); - }, - - getCommentAt : function (index) { - return ""; - }, - - getStyleAt : function (index) { - return ""; - }, - - getImageAt : function (index) { - return ""; - }, - - getFinalCompleteValueAt : function (index) { - return this.getValueAt(index); - }, - - removeValueAt : function (index, removeFromDB) { - if (index < 0 || index >= this.logins.length) - throw "Index out of range."; - - var [removedLogin] = this.logins.splice(index, 1); - - this.matchCount--; - if (this.defaultIndex > this.logins.length) - this.defaultIndex--; - - if (removeFromDB) { - var pwmgr = Cc["@mozilla.org/login-manager;1"]. - getService(Ci.nsILoginManager); - pwmgr.removeLogin(removedLogin); - } - } -}; - this.NSGetFactory = XPCOMUtils.generateNSGetFactory([LoginManager]); diff --git a/toolkit/components/passwordmgr/storage-json.js b/toolkit/components/passwordmgr/storage-json.js index ee76de5545cf..f5862288c111 100644 --- a/toolkit/components/passwordmgr/storage-json.js +++ b/toolkit/components/passwordmgr/storage-json.js @@ -11,6 +11,8 @@ //////////////////////////////////////////////////////////////////////////////// //// Globals +"use strict"; + const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); @@ -137,12 +139,10 @@ this.LoginManagerStorage_json.prototype = { addLogin : function (login) { this._store.ensureDataReady(); - let encUsername, encPassword; - // Throws if there are bogus values. LoginHelper.checkLoginValues(login); - [encUsername, encPassword, encType] = this._encryptLogin(login); + let [encUsername, encPassword, encType] = this._encryptLogin(login); // Clone the login, so we don't modify the caller's object. let loginClone = login.clone(); diff --git a/toolkit/components/passwordmgr/test/pwmgr_common.js b/toolkit/components/passwordmgr/test/pwmgr_common.js index 8c1e291735a1..cec68bb5b510 100644 --- a/toolkit/components/passwordmgr/test/pwmgr_common.js +++ b/toolkit/components/passwordmgr/test/pwmgr_common.js @@ -128,7 +128,10 @@ function doKey(aKey, modifier) { } // Init with a common login -function commonInit() { +// If selfFilling is true or non-undefined, fires an event at the page so that +// the test can start checking filled-in values. Tests that check observer +// notifications might be confused by this. +function commonInit(selfFilling) { var pwmgr = SpecialPowers.Cc["@mozilla.org/login-manager;1"]. getService(SpecialPowers.Ci.nsILoginManager); ok(pwmgr != null, "Access LoginManager"); @@ -159,6 +162,41 @@ function commonInit() { is(logins.length, 1, "Checking for successful init login"); disabledHosts = pwmgr.getAllDisabledHosts(); is(disabledHosts.length, 0, "Checking for no disabled hosts"); + + if (selfFilling) + return; + + // We provide a general mechanism for our tests to know when they can + // safely run: we add a final form that we know will be filled in, wait + // for the login manager to tell us that it's filled in and then continue + // with the rest of the tests. + window.addEventListener("DOMContentLoaded", (event) => { + var form = document.createElement('form'); + form.id = 'observerforcer'; + var username = document.createElement('input'); + username.name = 'testuser'; + form.appendChild(username); + var password = document.createElement('input'); + password.name = 'testpass'; + password.type = 'password'; + form.appendChild(password); + + var observer = SpecialPowers.wrapCallback(function(subject, topic, data) { + var bag = subject.QueryInterface(SpecialPowers.Ci.nsIPropertyBag2); + var username = bag.get("usernameField"); + if (!username || username.form.id !== 'observerforcer') + return; + SpecialPowers.removeObserver(observer, "passwordmgr-found-logins"); + form.parentNode.removeChild(form); + SimpleTest.executeSoon(() => { + var event = new Event("runTests"); + window.dispatchEvent(event); + }); + }); + SpecialPowers.addObserver(observer, "passwordmgr-found-logins", false); + + document.body.appendChild(form); + }); } const masterPassword = "omgsecret!"; diff --git a/toolkit/components/passwordmgr/test/subtst_privbrowsing_3.html b/toolkit/components/passwordmgr/test/subtst_privbrowsing_3.html index f9df9d283162..0ad0a51b9fc3 100644 --- a/toolkit/components/passwordmgr/test/subtst_privbrowsing_3.html +++ b/toolkit/components/passwordmgr/test/subtst_privbrowsing_3.html @@ -19,8 +19,8 @@ function submitForm() { form.submit(); } -window.onload = submitForm; var form = document.getElementById("form"); +window.addEventListener('message', () => { submitForm(); }); diff --git a/toolkit/components/passwordmgr/test/subtst_privbrowsing_4.html b/toolkit/components/passwordmgr/test/subtst_privbrowsing_4.html index 796ac202eb26..dfc126e26b48 100644 --- a/toolkit/components/passwordmgr/test/subtst_privbrowsing_4.html +++ b/toolkit/components/passwordmgr/test/subtst_privbrowsing_4.html @@ -28,10 +28,11 @@ function submitForm() { setTimeout(function(){ form.submit(); }, 100); } -window.onload = startAutocomplete; var form = document.getElementById("form"); var userField = document.getElementById("user"); +window.addEventListener('message', () => { startAutocomplete(); }); + diff --git a/toolkit/components/passwordmgr/test/test_basic_form.html b/toolkit/components/passwordmgr/test/test_basic_form.html index 07fad1888738..32cb4f918b82 100644 --- a/toolkit/components/passwordmgr/test/test_basic_form.html +++ b/toolkit/components/passwordmgr/test/test_basic_form.html @@ -22,7 +22,7 @@ function startTest() { SimpleTest.finish(); } -window.onload = startTest; +window.addEventListener("runTests", startTest);

diff --git a/toolkit/components/passwordmgr/test/test_basic_form_0pw.html b/toolkit/components/passwordmgr/test/test_basic_form_0pw.html index 06f32097b74d..e4f830056bf1 100644 --- a/toolkit/components/passwordmgr/test/test_basic_form_0pw.html +++ b/toolkit/components/passwordmgr/test/test_basic_form_0pw.html @@ -65,7 +65,7 @@ function startTest() { SimpleTest.finish(); } -window.onload = startTest; +window.addEventListener("runTests", startTest); SimpleTest.waitForExplicitFinish(); diff --git a/toolkit/components/passwordmgr/test/test_basic_form_1pw.html b/toolkit/components/passwordmgr/test/test_basic_form_1pw.html index 048f6ec4d0dd..8c4f984e48b2 100644 --- a/toolkit/components/passwordmgr/test/test_basic_form_1pw.html +++ b/toolkit/components/passwordmgr/test/test_basic_form_1pw.html @@ -161,7 +161,7 @@ function startTest() { } -window.onload = startTest; +window.addEventListener("runTests", startTest); SimpleTest.waitForExplicitFinish(); diff --git a/toolkit/components/passwordmgr/test/test_basic_form_1pw_2.html b/toolkit/components/passwordmgr/test/test_basic_form_1pw_2.html index 124cfcc06888..13b9421f3485 100644 --- a/toolkit/components/passwordmgr/test/test_basic_form_1pw_2.html +++ b/toolkit/components/passwordmgr/test/test_basic_form_1pw_2.html @@ -102,7 +102,7 @@ function startTest() { } -window.onload = startTest; +window.addEventListener("runTests", startTest); SimpleTest.waitForExplicitFinish(); diff --git a/toolkit/components/passwordmgr/test/test_basic_form_2.html b/toolkit/components/passwordmgr/test/test_basic_form_2.html index 00d5dcb95ae5..e7f26bf6aeac 100644 --- a/toolkit/components/passwordmgr/test/test_basic_form_2.html +++ b/toolkit/components/passwordmgr/test/test_basic_form_2.html @@ -44,19 +44,21 @@ function startTest(){ is($_(1, "pword").value, "", "Checking for blank password"); // Call the public method, check return value - is(pwmgr.fillForm(document.getElementById("form1")), true, - "Checking return value of fillForm"); + pwmgr.fillForm(document.getElementById("form1")) + .then(function(result) { + is(result, true, "Checking return value of fillForm"); - // Check that the form was filled - is($_(1, "uname").value, "testuser", "Checking for filled username"); - is($_(1, "pword").value, "testpass", "Checking for filled password"); + // Check that the form was filled + is($_(1, "uname").value, "testuser", "Checking for filled username"); + is($_(1, "pword").value, "testpass", "Checking for filled password"); - // Reset pref (since we assumed it was true to start) - SpecialPowers.setBoolPref("signon.autofillForms", true); + // Reset pref (since we assumed it was true to start) + SpecialPowers.setBoolPref("signon.autofillForms", true); - SimpleTest.finish(); + SimpleTest.finish(); + }); } -window.onload = startTest; +window.addEventListener("runTests", startTest);
diff --git a/toolkit/components/passwordmgr/test/test_basic_form_2pw_1.html b/toolkit/components/passwordmgr/test/test_basic_form_2pw_1.html index 7e1cb8519b51..90f763d782c9 100644 --- a/toolkit/components/passwordmgr/test/test_basic_form_2pw_1.html +++ b/toolkit/components/passwordmgr/test/test_basic_form_2pw_1.html @@ -182,7 +182,7 @@ function startTest() { } -window.onload = startTest; +window.addEventListener("runTests", startTest); SimpleTest.waitForExplicitFinish(); diff --git a/toolkit/components/passwordmgr/test/test_basic_form_2pw_2.html b/toolkit/components/passwordmgr/test/test_basic_form_2pw_2.html index d99dc517435b..d1aeab4dc267 100644 --- a/toolkit/components/passwordmgr/test/test_basic_form_2pw_2.html +++ b/toolkit/components/passwordmgr/test/test_basic_form_2pw_2.html @@ -10,18 +10,6 @@ Login Manager test: (placeholder)

- -
 
 
+ + diff --git a/toolkit/components/passwordmgr/test/test_basic_form_3pw_1.html b/toolkit/components/passwordmgr/test/test_basic_form_3pw_1.html index a61aaeeb9e85..b44f3d3f9fad 100644 --- a/toolkit/components/passwordmgr/test/test_basic_form_3pw_1.html +++ b/toolkit/components/passwordmgr/test/test_basic_form_3pw_1.html @@ -169,7 +169,7 @@ function startTest() { SimpleTest.finish(); } -window.onload = startTest; +window.addEventListener("runTests", startTest); SimpleTest.waitForExplicitFinish(); diff --git a/toolkit/components/passwordmgr/test/test_basic_form_autocomplete.html b/toolkit/components/passwordmgr/test/test_basic_form_autocomplete.html index 0bf5737d4152..ab6116f0c703 100644 --- a/toolkit/components/passwordmgr/test/test_basic_form_autocomplete.html +++ b/toolkit/components/passwordmgr/test/test_basic_form_autocomplete.html @@ -164,6 +164,7 @@ try { /** Test for Login Manager: multiple login autocomplete. **/ +var tester; var uname = $_(1, "uname"); var pword = $_(1, "pword"); @@ -199,9 +200,6 @@ function hitEventLoop(func, times) { } } -var gNextTestWillOpenPopup = true; -var gLastTest = 704; - function addPopupListener(eventName, func, capture) { autocompletePopup.addEventListener(eventName, func, capture); } @@ -213,559 +211,567 @@ function removePopupListener(eventName, func, capture) { /* * Main section of test... * - * This is a bit hacky, because the events are either being sent or - * processes asynchronously, so we need to interrupt our flow with lots of - * setTimeout() calls. The case statements are executed in order, one per - * timeout. + * This test is, to a first approximation, event driven. Each time we need to + * wait for an event, runTest sets an event listener (or timeout for a couple + * of rare cases) and yields. The event listener then resumes the generator by + * calling its |next| method. */ -function runTest(testNum) { +function* runTest() { + var testNum = 1; ok(true, "Starting test #" + testNum); - if (gNextTestWillOpenPopup) { - addPopupListener("popupshown", function() { - removePopupListener("popupshown", arguments.callee, false); + function waitForPopup() { + addPopupListener("popupshown", function popupshown() { + removePopupListener("popupshown", popupshown, false); - if (testNum != gLastTest) { - window.setTimeout(runTest, 0, testNum + 1); - } + window.setTimeout(tester.next.bind(tester), 0); }, false); - } else { - var unexpectedPopup = function() { - removePopupListener("popupshown", arguments.callee, false); + } - ok(false, "Test " + testNum + " should not show a popup"); + function runNextTest(expectPopup) { + var save = testNum++; + if (expectPopup === "expect popup") + return waitForPopup(); + + var unexpectedPopup = function() { + removePopupListener("popupshown", unexpectedPopup, false); + ok(false, "Test " + save + " should not show a popup"); }; addPopupListener("popupshown", unexpectedPopup, false); - if (testNum == gLastTest) { + + hitEventLoop(function() { removePopupListener("popupshown", unexpectedPopup, false); - } else { - hitEventLoop(function() { - removePopupListener("popupshown", unexpectedPopup, false); - runTest(testNum + 1); - }, 100); - } + tester.next(); + }, 100); } - switch(testNum) { - case 1: - // Make sure initial form is empty. - checkACForm("", ""); - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - break; - - case 2: - // Check first entry - doKey("down"); - checkACForm("", ""); // value shouldn't update - doKey("return"); // not "enter"! - checkACForm("tempuser1", "temppass1"); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - break; - - case 3: - // Check second entry - doKey("down"); - doKey("down"); - doKey("return"); // not "enter"! - checkACForm("testuser2", "testpass2"); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - break; - - case 4: - // Check third entry - doKey("down"); - doKey("down"); - doKey("down"); - doKey("return"); - checkACForm("testuser3", "testpass3"); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - break; - - case 5: - // Check fourth entry - doKey("down"); - doKey("down"); - doKey("down"); - doKey("down"); - doKey("return"); - checkACForm("zzzuser4", "zzzpass4"); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - break; - - case 6: - // Check first entry (wraparound) - doKey("down"); - doKey("down"); - doKey("down"); - doKey("down"); - doKey("down"); // deselects - doKey("down"); - doKey("return"); - checkACForm("tempuser1", "temppass1"); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - break; - - case 7: - // Check the last entry via arrow-up - doKey("up"); - doKey("return"); - checkACForm("zzzuser4", "zzzpass4"); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - break; - - case 8: - // Check the last entry via arrow-up - doKey("down"); // select first entry - doKey("up"); // selects nothing! - doKey("up"); // select last entry - doKey("return"); - checkACForm("zzzuser4", "zzzpass4"); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - break; - - case 9: - // Check the last entry via arrow-up (wraparound) - doKey("down"); - doKey("up"); // deselects - doKey("up"); // last entry - doKey("up"); - doKey("up"); - doKey("up"); // first entry - doKey("up"); // deselects - doKey("up"); // last entry - doKey("return"); - checkACForm("zzzuser4", "zzzpass4"); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - break; - - case 10: - // Set first entry w/o triggering autocomplete - doKey("down"); - doKey("right"); - checkACForm("tempuser1", ""); // empty password - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - break; - - case 11: - // Set first entry w/o triggering autocomplete - doKey("down"); - doKey("left"); - checkACForm("tempuser1", ""); // empty password - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - break; - - case 12: - // Check first entry (page up) - doKey("down"); - doKey("down"); - doKey("page_up"); - doKey("return"); - checkACForm("tempuser1", "temppass1"); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - gNextTestWillOpenPopup = false; - break; - - case 13: - // Check last entry (page down) - doKey("down"); - doKey("page_down"); - doKey("return"); - checkACForm("zzzuser4", "zzzpass4"); - restoreForm(); - gNextTestWillOpenPopup = false; - break; - - case 14: - // Send a fake (untrusted) event. - checkACForm("", ""); - uname.value = "zzzuser4"; - sendFakeAutocompleteEvent(uname); - checkACForm("zzzuser4", ""); - gNextTestWillOpenPopup = true; - break; - - case 15: - //checkACForm("zzzuser4", ""); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - testNum = 49; - break; - - // XXX tried sending character "t" before/during dropdown to test - // filtering, but had no luck. Seemed like the character was getting lost. - // Setting uname.value didn't seem to work either. This works with a human - // driver, so I'm not sure what's up. - - - case 50: - // Delete the first entry (of 4), "tempuser1" - doKey("down"); - var numLogins; - numLogins = pwmgr.countLogins("http://mochi.test:8888", "http://autocomplete:8888", null); - is(numLogins, 5, "Correct number of logins before deleting one"); - - // On OS X, shift-backspace and shift-delete work, just delete does not. - // On Win/Linux, shift-backspace does not work, delete and shift-delete do. - doKey("delete", shiftModifier); - - checkACForm("", ""); - numLogins = pwmgr.countLogins("http://mochi.test:8888", "http://autocomplete:8888", null); - is(numLogins, 4, "Correct number of logins after deleting one"); - doKey("return"); - checkACForm("testuser2", "testpass2"); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - break; - - case 51: - // Check the new first entry (of 3) - doKey("down"); - doKey("return"); - checkACForm("testuser2", "testpass2"); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - break; - - case 52: - // Delete the second entry (of 3), "testuser3" - doKey("down"); - doKey("down"); - doKey("delete", shiftModifier); - checkACForm("", ""); - numLogins = pwmgr.countLogins("http://mochi.test:8888", "http://autocomplete:8888", null); - is(numLogins, 3, "Correct number of logins after deleting one"); - doKey("return"); - checkACForm("zzzuser4", "zzzpass4"); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - break; - - case 53: - // Check the new second entry (of 2) - doKey("down"); - doKey("return"); - checkACForm("testuser2", "testpass2"); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - break; - - case 54: - // Delete the last entry (of 2), "zzzuser4" - doKey("down"); - doKey("down"); - doKey("delete", shiftModifier); - checkACForm("", ""); - numLogins = pwmgr.countLogins("http://mochi.test:8888", "http://autocomplete:8888", null); - is(numLogins, 2, "Correct number of logins after deleting one"); - doKey("return"); - checkACForm("testuser2", "testpass2"); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - break; - - case 55: - // Check the new second entry (of 2) - doKey("down"); - doKey("return"); - checkACForm("testuser2", "testpass2"); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - gNextTestWillOpenPopup = false; - break; - - case 56: - // Delete the only remaining entry, "testuser2" - doKey("down"); - doKey("delete", shiftModifier); - //doKey("return"); - checkACForm("", ""); - numLogins = pwmgr.countLogins("http://mochi.test:8888", "http://autocomplete:8888", null); - is(numLogins, 1, "Correct number of logins after deleting one"); - pwmgr.removeLogin(login0); // remove the login that's not shown in the list. - testNum = 99; - gNextTestWillOpenPopup = true; - break; - - - /* Tests for single-user forms with autocomplete=off */ - - case 100: - // Turn our attention to form2 - uname = $_(2, "uname"); - pword = $_(2, "pword"); - checkACForm("", ""); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - gNextTestWillOpenPopup = false; - break; - - case 101: - // Check first entry - doKey("down"); - checkACForm("", ""); // value shouldn't update - doKey("return"); // not "enter"! - checkACForm("singleuser5", "singlepass5"); - restoreForm(); // clear field, so reloading test doesn't fail - gNextTestWillOpenPopup = true; - break; - - case 102: - // Turn our attention to form3 - uname = $_(3, "uname"); - pword = $_(3, "pword"); - checkACForm("", ""); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - gNextTestWillOpenPopup = false; - break; - - case 103: - // Check first entry - doKey("down"); - checkACForm("", ""); // value shouldn't update - doKey("return"); // not "enter"! - checkACForm("singleuser5", "singlepass5"); - gNextTestWillOpenPopup = true; - break; - - case 104: - // Turn our attention to form4 - uname = $_(4, "uname"); - pword = $_(4, "pword"); - checkACForm("", ""); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - gNextTestWillOpenPopup = false; - break; - - case 105: - // Check first entry - doKey("down"); - checkACForm("", ""); // value shouldn't update - doKey("return"); // not "enter"! - checkACForm("singleuser5", "singlepass5"); - gNextTestWillOpenPopup = true; - break; - - case 106: - // Turn our attention to form5 - uname = $_(5, "uname"); - pword = $_(5, "pword"); - checkACForm("", ""); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - gNextTestWillOpenPopup = false; - break; - - case 107: - // Check first entry - doKey("down"); - checkACForm("", ""); // value shouldn't update - doKey("return"); // not "enter"! - checkACForm("singleuser5", "singlepass5"); - gNextTestWillOpenPopup = false; - break; - - case 108: - // Turn our attention to form6 - // (this is a control, w/o autocomplete=off, to ensure the login - // that was being suppressed would have been filled in otherwise) - uname = $_(6, "uname"); - pword = $_(6, "pword"); - checkACForm("singleuser5", "singlepass5"); - gNextTestWillOpenPopup = false; - break; - - case 109: - // Test that the password field remains filled in after changing - // the username. - uname.focus(); - doKey("right"); - sendChar("X"); - // Trigger the 'blur' event on uname - pword.focus(); - checkACForm("sXingleuser5", "singlepass5"); - - pwmgr.removeLogin(login5); - testNum = 499; - gNextTestWillOpenPopup = true; - break; - - case 500: - // Turn our attention to form7 - uname = $_(7, "uname"); - pword = $_(7, "pword"); - checkACForm("", ""); - - // Insert a new username field into the form. We'll then make sure - // that invoking the autocomplete doesn't try to fill the form. - var newField = document.createElement("input"); - newField.setAttribute("type", "text"); - newField.setAttribute("name", "uname2"); - pword.parentNode.insertBefore(newField, pword); - is($_(7, "uname2").value, "", "Verifying empty uname2");; - - // Delete login6B. It was created just to prevent filling in a login - // automatically, removing it makes it more likely that we'll catch a - // future regression with form filling here. - pwmgr.removeLogin(login6B); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - gNextTestWillOpenPopup = false; - break; - - case 501: - // Check first entry - doKey("down"); - checkACForm("", ""); // value shouldn't update - doKey("return"); // not "enter"! - // The form changes, so we expect the old username field to get the - // selected autocomplete value, but neither the new username field nor - // the password field should have any values filled in. - checkACForm("form7user1", ""); - is($_(7, "uname2").value, "", "Verifying empty uname2");; - restoreForm(); // clear field, so reloading test doesn't fail - - pwmgr.removeLogin(login6A); - testNum = 599; - gNextTestWillOpenPopup = false; - break; - - case 600: - // Turn our attention to form8 - uname = $_(8, "uname"); - pword = $_(8, "pword"); - checkACForm("form8user", "form8pass"); - restoreForm(); - gNextTestWillOpenPopup = false; - break; - - case 601: - checkACForm("", ""); - // Focus the previous form to trigger a blur. - $_(7, "uname").focus(); - gNextTestWillOpenPopup = false; - break; - - case 602: - checkACForm("", ""); - restoreForm(); - gNextTestWillOpenPopup = false; - break; - - case 603: - checkACForm("", ""); - pwmgr.removeLogin(login7); - - testNum = 699; - gNextTestWillOpenPopup = true; - break; - - case 700: - // Turn our attention to form9 to test the dropdown - bug 497541 - uname = $_(9, "uname"); - pword = $_(9, "pword"); - uname.focus(); - sendString("form9userAB"); - gNextTestWillOpenPopup = true; - break; - - case 701: - checkACForm("form9userAB", ""); - uname.focus(); - doKey("left"); - sendChar("A"); - gNextTestWillOpenPopup = false; - break; - - case 702: - // check dropdown is updated after inserting "A" - checkACForm("form9userAAB", ""); - checkMenuEntries(["form9userAAB"]); - doKey("down"); - doKey("return"); - checkACForm("form9userAAB", "form9pass"); - gNextTestWillOpenPopup = false; - break; - - case 703: - pwmgr.addLogin(login8C); - uname.focus(); - sendChar("z"); - gNextTestWillOpenPopup = false; - break; - - case 704: - // check that empty results are cached - bug 496466 - checkMenuEntries([]); - - SimpleTest.finish(); - return; - - default: - ok(false, "Unexpected invocation of test #" + testNum); - SimpleTest.finish(); - return; + // We use this function when we're trying to prove that something doesn't + // happen, but where if it did it would do so asynchronously. It isn't + // perfect, but it's better than nothing. + function spinEventLoop() { + setTimeout(function() { tester.next(); }, 0); } + + function waitForCompletion() { + var observer = SpecialPowers.wrapCallback(function(subject, topic, data) { + SpecialPowers.removeObserver(observer, "passwordmgr-found-logins"); + tester.next(); + }); + SpecialPowers.addObserver(observer, "passwordmgr-found-logins", false); + } + + /* test 1 */ + // Make sure initial form is empty. + checkACForm("", ""); + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 2 */ + // Check first entry + doKey("down"); + checkACForm("", ""); // value shouldn't update + doKey("return"); // not "enter"! + yield waitForCompletion(); + checkACForm("tempuser1", "temppass1"); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 3 */ + // Check second entry + doKey("down"); + doKey("down"); + doKey("return"); // not "enter"! + yield waitForCompletion(); + checkACForm("testuser2", "testpass2"); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 4 */ + // Check third entry + doKey("down"); + doKey("down"); + doKey("down"); + doKey("return"); + yield waitForCompletion(); + checkACForm("testuser3", "testpass3"); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 5 */ + // Check fourth entry + doKey("down"); + doKey("down"); + doKey("down"); + doKey("down"); + doKey("return"); + yield waitForCompletion(); + checkACForm("zzzuser4", "zzzpass4"); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 6 */ + // Check first entry (wraparound) + doKey("down"); + doKey("down"); + doKey("down"); + doKey("down"); + doKey("down"); // deselects + doKey("down"); + doKey("return"); + yield waitForCompletion(); + checkACForm("tempuser1", "temppass1"); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 7 */ + // Check the last entry via arrow-up + doKey("up"); + doKey("return"); + yield waitForCompletion(); + checkACForm("zzzuser4", "zzzpass4"); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 8 */ + // Check the last entry via arrow-up + doKey("down"); // select first entry + doKey("up"); // selects nothing! + doKey("up"); // select last entry + doKey("return"); + yield waitForCompletion(); + checkACForm("zzzuser4", "zzzpass4"); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 9 */ + // Check the last entry via arrow-up (wraparound) + doKey("down"); + doKey("up"); // deselects + doKey("up"); // last entry + doKey("up"); + doKey("up"); + doKey("up"); // first entry + doKey("up"); // deselects + doKey("up"); // last entry + doKey("return"); + yield waitForCompletion(); + checkACForm("zzzuser4", "zzzpass4"); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 10 */ + // Set first entry w/o triggering autocomplete + doKey("down"); + doKey("right"); + yield spinEventLoop(); + checkACForm("tempuser1", ""); // empty password + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 11 */ + // Set first entry w/o triggering autocomplete + doKey("down"); + doKey("left"); + checkACForm("tempuser1", ""); // empty password + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 12 */ + // Check first entry (page up) + doKey("down"); + doKey("down"); + doKey("page_up"); + doKey("return"); + yield waitForCompletion(); + checkACForm("tempuser1", "temppass1"); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 13 */ + // Check last entry (page down) + doKey("down"); + doKey("page_down"); + doKey("return"); + yield waitForCompletion(); + checkACForm("zzzuser4", "zzzpass4"); + restoreForm(); + yield runNextTest(); + + /* test 14 */ + // Send a fake (untrusted) event. + checkACForm("", ""); + uname.value = "zzzuser4"; + sendFakeAutocompleteEvent(uname); + yield spinEventLoop(); + checkACForm("zzzuser4", ""); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + testNum = 49; + yield runNextTest("expect popup"); + + // XXX tried sending character "t" before/during dropdown to test + // filtering, but had no luck. Seemed like the character was getting lost. + // Setting uname.value didn't seem to work either. This works with a human + // driver, so I'm not sure what's up. + + + /* test 50 */ + // Delete the first entry (of 4), "tempuser1" + doKey("down"); + var numLogins; + numLogins = pwmgr.countLogins("http://mochi.test:8888", "http://autocomplete:8888", null); + is(numLogins, 5, "Correct number of logins before deleting one"); + + // On OS X, shift-backspace and shift-delete work, just delete does not. + // On Win/Linux, shift-backspace does not work, delete and shift-delete do. + doKey("delete", shiftModifier); + + checkACForm("", ""); + numLogins = pwmgr.countLogins("http://mochi.test:8888", "http://autocomplete:8888", null); + is(numLogins, 4, "Correct number of logins after deleting one"); + doKey("return"); + yield waitForCompletion(); + checkACForm("testuser2", "testpass2"); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 51 */ + // Check the new first entry (of 3) + doKey("down"); + doKey("return"); + yield waitForCompletion(); + checkACForm("testuser2", "testpass2"); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 52 */ + // Delete the second entry (of 3), "testuser3" + doKey("down"); + doKey("down"); + doKey("delete", shiftModifier); + checkACForm("", ""); + numLogins = pwmgr.countLogins("http://mochi.test:8888", "http://autocomplete:8888", null); + is(numLogins, 3, "Correct number of logins after deleting one"); + doKey("return"); + yield waitForCompletion(); + checkACForm("zzzuser4", "zzzpass4"); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 53 */ + // Check the new second entry (of 2) + doKey("down"); + doKey("return"); + yield waitForCompletion(); + checkACForm("testuser2", "testpass2"); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 54 */ + // Delete the last entry (of 2), "zzzuser4" + doKey("down"); + doKey("down"); + doKey("delete", shiftModifier); + checkACForm("", ""); + numLogins = pwmgr.countLogins("http://mochi.test:8888", "http://autocomplete:8888", null); + is(numLogins, 2, "Correct number of logins after deleting one"); + doKey("return"); + yield waitForCompletion(); + checkACForm("testuser2", "testpass2"); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 55 */ + // Check the new second entry (of 2) + doKey("down"); + doKey("return"); + yield waitForCompletion(); + checkACForm("testuser2", "testpass2"); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 56 */ + // Delete the only remaining entry, "testuser2" + doKey("down"); + doKey("delete", shiftModifier); + //doKey("return"); + checkACForm("", ""); + numLogins = pwmgr.countLogins("http://mochi.test:8888", "http://autocomplete:8888", null); + is(numLogins, 1, "Correct number of logins after deleting one"); + pwmgr.removeLogin(login0); // remove the login that's not shown in the list. + testNum = 99; + yield runNextTest(); + + + /* Tests for single-user forms with autocomplete=off */ + + /* test 100 */ + // Turn our attention to form2 + uname = $_(2, "uname"); + pword = $_(2, "pword"); + checkACForm("", ""); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 101 */ + // Check first entry + doKey("down"); + checkACForm("", ""); // value shouldn't update + doKey("return"); // not "enter"! + yield waitForCompletion(); + checkACForm("singleuser5", "singlepass5"); + restoreForm(); // clear field, so reloading test doesn't fail + yield runNextTest(); + + /* test 102 */ + // Turn our attention to form3 + uname = $_(3, "uname"); + pword = $_(3, "pword"); + checkACForm("", ""); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 103 */ + // Check first entry + doKey("down"); + checkACForm("", ""); // value shouldn't update + doKey("return"); // not "enter"! + yield waitForCompletion(); + checkACForm("singleuser5", "singlepass5"); + yield runNextTest(); + + /* test 104 */ + // Turn our attention to form4 + uname = $_(4, "uname"); + pword = $_(4, "pword"); + checkACForm("", ""); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 105 */ + // Check first entry + doKey("down"); + checkACForm("", ""); // value shouldn't update + doKey("return"); // not "enter"! + yield waitForCompletion(); + checkACForm("singleuser5", "singlepass5"); + yield runNextTest(); + + /* test 106 */ + // Turn our attention to form5 + uname = $_(5, "uname"); + pword = $_(5, "pword"); + checkACForm("", ""); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 107 */ + // Check first entry + doKey("down"); + checkACForm("", ""); // value shouldn't update + doKey("return"); // not "enter"! + yield waitForCompletion(); + checkACForm("singleuser5", "singlepass5"); + yield runNextTest(); + + /* test 108 */ + // Turn our attention to form6 + // (this is a control, w/o autocomplete=off, to ensure the login + // that was being suppressed would have been filled in otherwise) + uname = $_(6, "uname"); + pword = $_(6, "pword"); + checkACForm("singleuser5", "singlepass5"); + yield runNextTest(); + + /* test 109 */ + // Test that the password field remains filled in after changing + // the username. + uname.focus(); + doKey("right"); + sendChar("X"); + // Trigger the 'blur' event on uname + pword.focus(); + yield spinEventLoop(); + checkACForm("sXingleuser5", "singlepass5"); + + pwmgr.removeLogin(login5); + testNum = 499; + yield runNextTest(); + + /* test 500 */ + // Turn our attention to form7 + uname = $_(7, "uname"); + pword = $_(7, "pword"); + checkACForm("", ""); + + // Insert a new username field into the form. We'll then make sure + // that invoking the autocomplete doesn't try to fill the form. + var newField = document.createElement("input"); + newField.setAttribute("type", "text"); + newField.setAttribute("name", "uname2"); + pword.parentNode.insertBefore(newField, pword); + is($_(7, "uname2").value, "", "Verifying empty uname2");; + + // Delete login6B. It was created just to prevent filling in a login + // automatically, removing it makes it more likely that we'll catch a + // future regression with form filling here. + pwmgr.removeLogin(login6B); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest("expect popup"); + + /* test 501 */ + // Check first entry + doKey("down"); + checkACForm("", ""); // value shouldn't update + doKey("return"); // not "enter"! + // The form changes, so we expect the old username field to get the + // selected autocomplete value, but neither the new username field nor + // the password field should have any values filled in. + yield spinEventLoop(); + checkACForm("form7user1", ""); + is($_(7, "uname2").value, "", "Verifying empty uname2");; + restoreForm(); // clear field, so reloading test doesn't fail + + pwmgr.removeLogin(login6A); + testNum = 599; + yield runNextTest(); + + /* test 600 */ + // Turn our attention to form8 + uname = $_(8, "uname"); + pword = $_(8, "pword"); + checkACForm("form8user", "form8pass"); + restoreForm(); + yield runNextTest(); + + /* test 601 */ + checkACForm("", ""); + // Focus the previous form to trigger a blur. + $_(7, "uname").focus(); + yield runNextTest(); + + /* test 602 */ + checkACForm("", ""); + restoreForm(); + yield runNextTest(); + + /* test 603 */ + checkACForm("", ""); + pwmgr.removeLogin(login7); + + testNum = 699; + yield runNextTest(); + + /* test 700 */ + // Turn our attention to form9 to test the dropdown - bug 497541 + uname = $_(9, "uname"); + pword = $_(9, "pword"); + uname.focus(); + sendString("form9userAB"); + yield runNextTest("expect popup"); + + /* test 701 */ + checkACForm("form9userAB", ""); + uname.focus(); + doKey("left"); + sendChar("A"); + yield runNextTest("expect popup"); + + /* test 702 */ + // check dropdown is updated after inserting "A" + checkACForm("form9userAAB", ""); + checkMenuEntries(["form9userAAB"]); + doKey("down"); + doKey("return"); + yield waitForCompletion(); + checkACForm("form9userAAB", "form9pass"); + yield runNextTest(); + + /* test 703 */ + // Note that this addLogin call will only be seen by the autocomplete + // attempt for the sendChar if we do not successfully cache the + // autocomplete results. + pwmgr.addLogin(login8C); + uname.focus(); + sendChar("z"); + yield runNextTest(); + + /* test 704 */ + // check that empty results are cached - bug 496466 + checkMenuEntries([]); + + SimpleTest.finish(); + return; } @@ -804,10 +810,11 @@ function startTest() { // shouldn't assume ID is consistent across products autocompletePopup = chromeWin.document.getElementById("PopupAutoComplete"); ok(autocompletePopup, "Got autocomplete popup"); - runTest(1); + tester = runTest(); + tester.next(); } -window.onload = startTest; +window.addEventListener("runTests", startTest); diff --git a/toolkit/components/passwordmgr/test/test_basic_form_html5.html b/toolkit/components/passwordmgr/test/test_basic_form_html5.html index ba50cb3cf11e..f8b8889f5d8d 100644 --- a/toolkit/components/passwordmgr/test/test_basic_form_html5.html +++ b/toolkit/components/passwordmgr/test/test_basic_form_html5.html @@ -164,7 +164,7 @@ function startTest() { SimpleTest.finish(); } -window.onload = startTest; +window.addEventListener("runTests", startTest); diff --git a/toolkit/components/passwordmgr/test/test_basic_form_observer_autocomplete.html b/toolkit/components/passwordmgr/test/test_basic_form_observer_autocomplete.html index 2e1b313f9e63..70fab399bad9 100644 --- a/toolkit/components/passwordmgr/test/test_basic_form_observer_autocomplete.html +++ b/toolkit/components/passwordmgr/test/test_basic_form_observer_autocomplete.html @@ -60,8 +60,10 @@ var TestObserver = { this.receivedNotification2 = true; this.data2 = data; } + // Now fill the form - pwmgr.fillForm(subject); + pwmgr.fillForm(subject) + .then(startTest); } } }; @@ -95,8 +97,6 @@ function startTest(){ SimpleTest.finish(); } - -window.onload = startTest; diff --git a/toolkit/components/passwordmgr/test/test_basic_form_observer_autofillForms.html b/toolkit/components/passwordmgr/test/test_basic_form_observer_autofillForms.html index 70762eb0de82..42a73d8c820e 100644 --- a/toolkit/components/passwordmgr/test/test_basic_form_observer_autofillForms.html +++ b/toolkit/components/passwordmgr/test/test_basic_form_observer_autofillForms.html @@ -9,7 +9,7 @@ Login Manager test: simple form with autofillForms disabled and notifying observers diff --git a/toolkit/components/passwordmgr/test/test_basic_form_observer_foundLogins.html b/toolkit/components/passwordmgr/test/test_basic_form_observer_foundLogins.html index e5ac8a4b3037..418f0e6cb062 100644 --- a/toolkit/components/passwordmgr/test/test_basic_form_observer_foundLogins.html +++ b/toolkit/components/passwordmgr/test/test_basic_form_observer_foundLogins.html @@ -174,7 +174,7 @@ function startTest(){ SimpleTest.finish(); } -window.onload = startTest; +window.addEventListener("runTests", startTest); diff --git a/toolkit/components/passwordmgr/test/test_basic_form_pwevent.html b/toolkit/components/passwordmgr/test/test_basic_form_pwevent.html index e0b51f2e53c5..2af4ec5dcf50 100644 --- a/toolkit/components/passwordmgr/test/test_basic_form_pwevent.html +++ b/toolkit/components/passwordmgr/test/test_basic_form_pwevent.html @@ -14,6 +14,14 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=355063 function startTest() { info("startTest"); + // Password Manager's own listener should always have been added first, so + // the test's listener should be called after the pwmgr's listener fills in + // a login. + // + SpecialPowers.addChromeEventListener("DOMFormHasPassword", function eventFired() { + SpecialPowers.removeChromeEventListener("DOMFormHasPassword", eventFired); + setTimeout(checkForm, 300); + }); addForm(); } @@ -30,18 +38,12 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=355063 is(userField.value, "testuser", "checking filled username"); is(passField.value, "testpass", "checking filled password"); - SpecialPowers.removeChromeEventListener("DOMFormHasPassword", checkForm); SimpleTest.finish(); } commonInit(); - // Password Manager's own listener should always have been added first, so - // the test's listener should be called after the pwmgr's listener fills in - // a login. - // - SpecialPowers.addChromeEventListener("DOMFormHasPassword", checkForm); - window.addEventListener("load", startTest); + window.addEventListener("runTests", startTest); SimpleTest.waitForExplicitFinish(); diff --git a/toolkit/components/passwordmgr/test/test_basic_form_pwonly.html b/toolkit/components/passwordmgr/test/test_basic_form_pwonly.html index ead1b32a2a38..5c774d8e0a1c 100644 --- a/toolkit/components/passwordmgr/test/test_basic_form_pwonly.html +++ b/toolkit/components/passwordmgr/test/test_basic_form_pwonly.html @@ -211,7 +211,7 @@ function startTest() { SimpleTest.finish(); } -window.onload = startTest; +window.addEventListener("runTests", startTest); diff --git a/toolkit/components/passwordmgr/test/test_bug_227640.html b/toolkit/components/passwordmgr/test/test_bug_227640.html index f69c2cef6c63..317673267175 100644 --- a/toolkit/components/passwordmgr/test/test_bug_227640.html +++ b/toolkit/components/passwordmgr/test/test_bug_227640.html @@ -235,7 +235,7 @@ function countLogins() { return logins.length; } -window.onload = startTest; +window.addEventListener("runTests", startTest); diff --git a/toolkit/components/passwordmgr/test/test_bug_242956.html b/toolkit/components/passwordmgr/test/test_bug_242956.html index 729f6d53f9f3..d11d99567756 100644 --- a/toolkit/components/passwordmgr/test/test_bug_242956.html +++ b/toolkit/components/passwordmgr/test/test_bug_242956.html @@ -118,7 +118,7 @@ function startTest() { SimpleTest.finish(); } -window.onload = startTest; +window.addEventListener("runTests", startTest); SimpleTest.waitForExplicitFinish(); diff --git a/toolkit/components/passwordmgr/test/test_bug_360493_1.html b/toolkit/components/passwordmgr/test/test_bug_360493_1.html index d123018945e5..75b00d804c14 100644 --- a/toolkit/components/passwordmgr/test/test_bug_360493_1.html +++ b/toolkit/components/passwordmgr/test/test_bug_360493_1.html @@ -129,7 +129,7 @@ function startTest() { SimpleTest.finish(); } -window.onload = startTest; +window.addEventListener("runTests", startTest); SimpleTest.waitForExplicitFinish(); diff --git a/toolkit/components/passwordmgr/test/test_bug_360493_2.html b/toolkit/components/passwordmgr/test/test_bug_360493_2.html index 3499f4b1cee5..84d678c8ee8f 100644 --- a/toolkit/components/passwordmgr/test/test_bug_360493_2.html +++ b/toolkit/components/passwordmgr/test/test_bug_360493_2.html @@ -166,7 +166,7 @@ function startTest() { SimpleTest.finish(); } -window.onload = startTest; +window.addEventListener("runTests", startTest); SimpleTest.waitForExplicitFinish(); diff --git a/toolkit/components/passwordmgr/test/test_bug_391514.html b/toolkit/components/passwordmgr/test/test_bug_391514.html index 5b6f99c23d29..8bd1adf24233 100644 --- a/toolkit/components/passwordmgr/test/test_bug_391514.html +++ b/toolkit/components/passwordmgr/test/test_bug_391514.html @@ -130,7 +130,7 @@ function startTest() { SimpleTest.finish(); } -window.onload = startTest; +window.addEventListener("runTests", startTest); SimpleTest.waitForExplicitFinish(); diff --git a/toolkit/components/passwordmgr/test/test_bug_427033.html b/toolkit/components/passwordmgr/test/test_bug_427033.html index 86b9f5243c7c..b40769c0f45a 100644 --- a/toolkit/components/passwordmgr/test/test_bug_427033.html +++ b/toolkit/components/passwordmgr/test/test_bug_427033.html @@ -10,6 +10,10 @@ Login Manager test: form with JS submit action

diff --git a/toolkit/components/passwordmgr/test/test_bug_444968.html b/toolkit/components/passwordmgr/test/test_bug_444968.html index 0ffe79061fe2..ab6136bf5c69 100644 --- a/toolkit/components/passwordmgr/test/test_bug_444968.html +++ b/toolkit/components/passwordmgr/test/test_bug_444968.html @@ -127,7 +127,7 @@ function startTest() { SimpleTest.finish(); } -window.onload = startTest; +window.addEventListener("runTests", startTest); diff --git a/toolkit/components/passwordmgr/test/test_case_differences.html b/toolkit/components/passwordmgr/test/test_case_differences.html index 29519ce52fd3..61b72c649547 100644 --- a/toolkit/components/passwordmgr/test/test_case_differences.html +++ b/toolkit/components/passwordmgr/test/test_case_differences.html @@ -66,6 +66,7 @@ try { /** Test for Login Manager: multiple login autocomplete. **/ +var tester; var uname = $_(1, "uname"); var pword = $_(1, "pword"); @@ -92,8 +93,6 @@ function sendFakeAutocompleteEvent(element) { element.dispatchEvent(acEvent); } -var gLastTest = 6; - function addPopupListener(eventName, func, capture) { autocompletePopup.addEventListener(eventName, func, capture); } @@ -110,83 +109,81 @@ function removePopupListener(eventName, func, capture) { * setTimeout() calls. The case statements are executed in order, one per * timeout. */ -function runTest(testNum) { - ok(true, "Starting test #" + testNum); +function* runTest() { + function runNextTest() { + addPopupListener("popupshown", function() { + removePopupListener("popupshown", arguments.callee, false); - addPopupListener("popupshown", function() { - removePopupListener("popupshown", arguments.callee, false); - - if (testNum != gLastTest) { - window.setTimeout(runTest, 0, testNum + 1); - } - }, false); - - switch(testNum) { - case 1: - // Make sure initial form is empty. - checkACForm("", ""); - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - break; - - case 2: - // Check first entry - doKey("down"); - checkACForm("", ""); // value shouldn't update - doKey("return"); // not "enter"! - checkACForm("name", "pass"); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - break; - - case 3: - // Check second entry - doKey("down"); - doKey("down"); - doKey("return"); // not "enter"! - checkACForm("Name", "Pass"); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - break; - - case 4: - // Check third entry - doKey("down"); - doKey("down"); - doKey("down"); - doKey("return"); - checkACForm("USER", "PASS"); - - // Trigger autocomplete popup - restoreForm(); - uname.value = "user"; - doKey("down"); - break; - - case 5: - // Check that we don't clobber user-entered text when tabbing away - doKey("tab"); - checkACForm("user", "PASS"); - - // Trigger autocomplete popup - restoreForm(); - doKey("down"); - break; - - case 6: - SimpleTest.finish(); - return; - - default: - ok(false, "Unexpected invocation of test #" + testNum); - SimpleTest.finish(); - return; + window.setTimeout(tester.next.bind(tester), 0); + }, false); } + + function waitForCompletion() { + var observer = SpecialPowers.wrapCallback(function(subject, topic, data) { + SpecialPowers.removeObserver(observer, "passwordmgr-found-logins"); + tester.next(); + }); + SpecialPowers.addObserver(observer, "passwordmgr-found-logins", false); + } + + /* test 1 */ + // Make sure initial form is empty. + checkACForm("", ""); + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest(); + + /* test 2 */ + // Check first entry + doKey("down"); + checkACForm("", ""); // value shouldn't update + doKey("return"); // not "enter"! + yield waitForCompletion(); + checkACForm("name", "pass"); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest(); + + /* test 3 */ + // Check second entry + doKey("down"); + doKey("down"); + doKey("return"); // not "enter"! + yield waitForCompletion(); + checkACForm("Name", "Pass"); + + // Trigger autocomplete popup + restoreForm(); + doKey("down"); + yield runNextTest(); + + /* test 4 */ + // Check third entry + doKey("down"); + doKey("down"); + doKey("down"); + doKey("return"); + yield waitForCompletion(); + checkACForm("USER", "PASS"); + + // Trigger autocomplete popup + restoreForm(); + uname.value = "user"; + doKey("down"); + yield runNextTest(); + + /* test 5 */ + // Check that we don't clobber user-entered text when tabbing away + doKey("tab"); + yield waitForCompletion(); + checkACForm("user", "PASS"); + + // Trigger autocomplete popup + restoreForm(); + SimpleTest.finish(); } @@ -206,10 +203,11 @@ function startTest() { // shouldn't assume ID is consistent across products autocompletePopup = chromeWin.document.getElementById("PopupAutoComplete"); ok(autocompletePopup, "Got autocomplete popup"); - runTest(1); + tester = runTest(); + tester.next(); } -window.onload = startTest; +window.addEventListener("runTests", startTest); diff --git a/toolkit/components/passwordmgr/test/test_master_password.html b/toolkit/components/passwordmgr/test/test_master_password.html index de97c7b8639f..ccda6ff99c1a 100644 --- a/toolkit/components/passwordmgr/test/test_master_password.html +++ b/toolkit/components/passwordmgr/test/test_master_password.html @@ -115,14 +115,17 @@ function handleDialog(doc, testNum) { var outerWindowObserver = { observe: function(id) { SpecialPowers.removeObserver(outerWindowObserver, "outer-window-destroyed"); + var func; if (testNum == 1) - startTest2(); + func = startTest2; else if (testNum == 2) - startTest3(); + func = startTest3; else if (testNum == 3) - checkTest3(); + func = checkTest3; else if (testNum == 5) - checkTest4C(); + func = checkTest4C; + + setTimeout(func, 300); } }; @@ -269,7 +272,7 @@ function finishTest() { SimpleTest.finish(); } -window.onload = startTest1; +window.addEventListener("runTests", startTest1); diff --git a/toolkit/components/passwordmgr/test/test_privbrowsing_perwindowpb.html b/toolkit/components/passwordmgr/test/test_privbrowsing_perwindowpb.html index 6409caf60c39..1447adcc9f27 100644 --- a/toolkit/components/passwordmgr/test/test_privbrowsing_perwindowpb.html +++ b/toolkit/components/passwordmgr/test/test_privbrowsing_perwindowpb.html @@ -40,6 +40,7 @@ var subtests = [ "subtst_privbrowsing_4.html", // 9 "subtst_privbrowsing_3.html" // 10 ]; +var observer; var testNum = 0; function loadNextTest() { @@ -95,11 +96,17 @@ function loadNextTest() { ok(false, "Unexpected call to loadNextTest for test #" + testNum); } + if (testNum === 7) { + observer = SpecialPowers.wrapCallback(function(subject, topic, data) { + SimpleTest.executeSoon(() => { iframe.contentWindow.postMessage("go", "*"); }); + }); + SpecialPowers.addObserver(observer, "passwordmgr-found-logins", false); + } + ok(true, "Starting test #" + testNum); iframe.src = prefix + subtests[testNum-1]; } - function checkTest() { var popup; @@ -248,6 +255,7 @@ function handleLoad(aEvent) { aWin.close(); }); + SpecialPowers.removeObserver(observer, "passwordmgr-found-logins"); SimpleTest.finish(); } } diff --git a/toolkit/components/satchel/AutoCompleteE10S.jsm b/toolkit/components/satchel/AutoCompleteE10S.jsm index 796f968967bf..419d96e2f3c2 100644 --- a/toolkit/components/satchel/AutoCompleteE10S.jsm +++ b/toolkit/components/satchel/AutoCompleteE10S.jsm @@ -75,29 +75,18 @@ this.AutoCompleteE10S = { messageManager.addMessageListener("FormAutoComplete:ClosePopup", this); }, - search: function(message) { - let browserWindow = message.target.ownerDocument.defaultView; + _initPopup: function(browserWindow, rect) { this.browser = browserWindow.gBrowser.selectedBrowser; this.popup = this.browser.autoCompletePopup; this.popup.hidden = false; - this.popup.setAttribute("width", message.data.width); + this.popup.setAttribute("width", rect.width); - let rect = message.data; let {x, y} = this.browser.mapScreenCoordinatesFromContent(rect.left, rect.top + rect.height); this.x = x; this.y = y; - - let formAutoComplete = Cc["@mozilla.org/satchel/form-autocomplete;1"] - .getService(Ci.nsIFormAutoComplete); - - formAutoComplete.autoCompleteSearchAsync(message.data.inputName, - message.data.untrimmedSearchString, - null, - null, - this.onSearchComplete.bind(this)); }, - onSearchComplete: function(results) { + _showPopup: function(results) { AutoCompleteE10SView.clearResults(); let resultsArray = []; @@ -110,11 +99,6 @@ this.AutoCompleteE10S = { this.popup.view = AutoCompleteE10SView; - this.browser.messageManager.sendAsyncMessage( - "FormAutoComplete:AutoCompleteSearchAsyncResult", - {results: resultsArray} - ); - this.popup.selectedIndex = -1; this.popup.invalidate(); @@ -128,6 +112,46 @@ this.AutoCompleteE10S = { } else { this.popup.closePopup(); } + + return resultsArray; + }, + + // This function is used by the login manager, which uses a single message + // to fill in the autocomplete results. See + // "RemoteLogins:autoCompleteLogins". + showPopupWithResults: function(browserWindow, rect, results) { + this._initPopup(browserWindow, rect); + this._showPopup(results); + }, + + // This function is called in response to AutoComplete requests from the + // child (received via the message manager, see + // "FormHistory:AutoCompleteSearchAsync"). + search: function(message) { + let browserWindow = message.target.ownerDocument.defaultView; + let rect = message.data; + + this._initPopup(browserWindow, rect); + + let formAutoComplete = Cc["@mozilla.org/satchel/form-autocomplete;1"] + .getService(Ci.nsIFormAutoComplete); + + formAutoComplete.autoCompleteSearchAsync(message.data.inputName, + message.data.untrimmedSearchString, + null, + null, + this.onSearchComplete.bind(this)); + }, + + // The second half of search, this fills in the popup and returns the + // results to the child. + onSearchComplete: function(results) { + let resultsArray = this._showPopup(results); + + this.browser.messageManager.sendAsyncMessage( + "FormAutoComplete:AutoCompleteSearchAsyncResult", + {results: resultsArray} + ); }, receiveMessage: function(message) { diff --git a/toolkit/components/satchel/nsFormAutoComplete.js b/toolkit/components/satchel/nsFormAutoComplete.js index 1add7d8f64ca..8586ed5b7c26 100644 --- a/toolkit/components/satchel/nsFormAutoComplete.js +++ b/toolkit/components/satchel/nsFormAutoComplete.js @@ -438,7 +438,7 @@ FormAutoCompleteResult.prototype = { searchString : null, errorDescription : "", get defaultIndex() { - if (entries.length == 0) + if (this.entries.length == 0) return -1; else return 0; diff --git a/toolkit/components/satchel/nsFormFillController.cpp b/toolkit/components/satchel/nsFormFillController.cpp index d753959acc7e..777364362110 100644 --- a/toolkit/components/satchel/nsFormFillController.cpp +++ b/toolkit/components/satchel/nsFormFillController.cpp @@ -599,7 +599,6 @@ nsFormFillController::StartSearch(const nsAString &aSearchString, const nsAStrin nsIAutoCompleteResult *aPreviousResult, nsIAutoCompleteObserver *aListener) { nsresult rv; - nsCOMPtr result; // If the login manager has indicated it's responsible for this field, let it // handle the autocomplete. Otherwise, handle with form history. @@ -607,14 +606,12 @@ nsFormFillController::StartSearch(const nsAString &aSearchString, const nsAStrin if (mPwmgrInputs.Get(mFocusedInputNode, &dummy)) { // XXX aPreviousResult shouldn't ever be a historyResult type, since we're not letting // satchel manage the field? - rv = mLoginManager->AutoCompleteSearch(aSearchString, - aPreviousResult, - mFocusedInput, - getter_AddRefs(result)); + mLastListener = aListener; + rv = mLoginManager->AutoCompleteSearchAsync(aSearchString, + aPreviousResult, + mFocusedInput, + this); NS_ENSURE_SUCCESS(rv, rv); - if (aListener) { - aListener->OnSearchResult(this, result); - } } else { mLastListener = aListener; @@ -653,32 +650,42 @@ nsFormFillController::PerformInputListAutoComplete(nsIAutoCompleteResult* aPrevi nsresult rv; nsCOMPtr result; - nsCOMPtr inputListAutoComplete = - do_GetService("@mozilla.org/satchel/inputlist-autocomplete;1", &rv); - NS_ENSURE_SUCCESS(rv, rv); - rv = inputListAutoComplete->AutoCompleteSearch(aPreviousResult, - mLastSearchString, - mFocusedInput, - getter_AddRefs(result)); - NS_ENSURE_SUCCESS(rv, rv); + bool dummy; + if (!mPwmgrInputs.Get(mFocusedInputNode, &dummy)) { + nsCOMPtr inputListAutoComplete = + do_GetService("@mozilla.org/satchel/inputlist-autocomplete;1", &rv); + NS_ENSURE_SUCCESS(rv, rv); + rv = inputListAutoComplete->AutoCompleteSearch(aPreviousResult, + mLastSearchString, + mFocusedInput, + getter_AddRefs(result)); + NS_ENSURE_SUCCESS(rv, rv); - if (mFocusedInput) { - nsCOMPtr list; - mFocusedInput->GetList(getter_AddRefs(list)); + if (mFocusedInput) { + nsCOMPtr list; + mFocusedInput->GetList(getter_AddRefs(list)); - // Add a mutation observer to check for changes to the items in the - // and update the suggestions accordingly. - nsCOMPtr node = do_QueryInterface(list); - if (mListNode != node) { - if (mListNode) { - mListNode->RemoveMutationObserver(this); - mListNode = nullptr; - } - if (node) { - node->AddMutationObserverUnlessExists(this); - mListNode = node; + // Add a mutation observer to check for changes to the items in the + // and update the suggestions accordingly. + nsCOMPtr node = do_QueryInterface(list); + if (mListNode != node) { + if (mListNode) { + mListNode->RemoveMutationObserver(this); + mListNode = nullptr; + } + if (node) { + node->AddMutationObserverUnlessExists(this); + mListNode = node; + } } } + } else { + result = aPreviousResult; + + // If this is a password manager input mLastSearchResult will be a JS + // object (wrapped in an XPConnect reflector), so we need to take care not + // to hold onto it for too long. + mLastSearchResult = nullptr; } if (mLastListener) { diff --git a/toolkit/components/telemetry/TelemetryPing.jsm b/toolkit/components/telemetry/TelemetryPing.jsm index 4b69a92b215d..e3d1e12463cc 100644 --- a/toolkit/components/telemetry/TelemetryPing.jsm +++ b/toolkit/components/telemetry/TelemetryPing.jsm @@ -535,9 +535,11 @@ let Impl = { try { let scope = {}; Cu.import("resource:///modules/experiments/Experiments.jsm", scope); - let activeExperiment = scope.Experiments.instance().getActiveExperimentID(); + let experiments = scope.Experiments.instance() + let activeExperiment = experiments.getActiveExperimentID(); if (activeExperiment) { ret.activeExperiment = activeExperiment; + ret.activeExperimentBranch = experiments.getActiveExperimentBranch(); } } catch(e) { // If this is not Firefox, the import will fail. diff --git a/toolkit/library/StaticXULComponents.ld b/toolkit/library/StaticXULComponents.ld new file mode 100644 index 000000000000..e4fe728134de --- /dev/null +++ b/toolkit/library/StaticXULComponents.ld @@ -0,0 +1,5 @@ +SECTIONS { + .data.rel.ro : { + *(.kPStaticModules) + } +} diff --git a/toolkit/library/StaticXULComponentsEnd/StaticXULComponentsEnd.cpp b/toolkit/library/StaticXULComponentsEnd/StaticXULComponentsEnd.cpp new file mode 100644 index 000000000000..7aa2dbac830c --- /dev/null +++ b/toolkit/library/StaticXULComponentsEnd/StaticXULComponentsEnd.cpp @@ -0,0 +1,14 @@ +#include "mozilla/Module.h" +#include "mozilla/NullPtr.h" + +/* Ensure end_kPStaticModules is at the end of the .kPStaticModules section + * on Windows. Somehow, placing the object last is not enough with PGO/LTCG. */ +#ifdef _MSC_VER +/* Sections on Windows are in two parts, separated with $. When linking, + * sections with the same first part are all grouped, and ordered + * alphabetically with the second part as sort key. */ +# pragma section(".kPStaticModules$Z", read) +# undef NSMODULE_SECTION +# define NSMODULE_SECTION __declspec(allocate(".kPStaticModules$Z"), dllexport) +#endif +NSMODULE_DEFN(end_kPStaticModules) = nullptr; diff --git a/content/base/test/xcsp/moz.build b/toolkit/library/StaticXULComponentsEnd/moz.build similarity index 51% rename from content/base/test/xcsp/moz.build rename to toolkit/library/StaticXULComponentsEnd/moz.build index 99b068bc92a0..ed4291e5ed7f 100644 --- a/content/base/test/xcsp/moz.build +++ b/toolkit/library/StaticXULComponentsEnd/moz.build @@ -1,10 +1,11 @@ -# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*- -# vim: set filetype=python: # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -MOCHITEST_MANIFESTS += ['mochitest.ini'] +SOURCES += [ + 'StaticXULComponentsEnd.cpp', +] -MOCHITEST_CHROME_MANIFESTS += ['chrome.ini'] +LIBRARY_NAME = 'StaticXULComponentsEnd' +DEFINES['MOZILLA_INTERNAL_API'] = True diff --git a/toolkit/library/StaticXULComponentsStart.cpp b/toolkit/library/StaticXULComponentsStart.cpp new file mode 100644 index 000000000000..dc24b589459e --- /dev/null +++ b/toolkit/library/StaticXULComponentsStart.cpp @@ -0,0 +1,4 @@ +#include "mozilla/Module.h" +#include "mozilla/NullPtr.h" + +NSMODULE_DEFN(start_kPStaticModules) = nullptr; diff --git a/toolkit/library/gtest/Makefile.in b/toolkit/library/gtest/Makefile.in index bccf93c22f08..e775e6aa5d7a 100644 --- a/toolkit/library/gtest/Makefile.in +++ b/toolkit/library/gtest/Makefile.in @@ -24,4 +24,6 @@ endif $(DIST)/bin/dependentlibs.list.gtest: $(DIST)/bin/dependentlibs.list sed -e 's|$(SHARED_LIBRARY)|gtest/$(SHARED_LIBRARY)|' $< > $@ +LINK_PDBFILE = xul-gtest.pdb + endif diff --git a/toolkit/library/libxul.mk b/toolkit/library/libxul.mk index e416574d98a7..3ddabf390fe6 100644 --- a/toolkit/library/libxul.mk +++ b/toolkit/library/libxul.mk @@ -246,3 +246,28 @@ OS_LIBS += $(LIBICONV) ifeq ($(MOZ_WIDGET_TOOLKIT),windows) OS_LIBS += $(call EXPAND_LIBNAME,usp10 oleaut32) endif + +EXTRA_DSO_LDOPTS += $(call EXPAND_LIBNAME_PATH,StaticXULComponentsEnd,$(DEPTH)/toolkit/library/StaticXULComponentsEnd) + +# BFD ld doesn't create multiple PT_LOADs as usual when an unknown section +# exists. Using an implicit linker script to make it fold that section in +# .data.rel.ro makes it create multiple PT_LOADs. That implicit linker +# script however makes gold misbehave, first because it doesn't like that +# the linker script is given after crtbegin.o, and even past that, replaces +# the default section rules with those from the script instead of +# supplementing them. Which leads to a lib with a huge load of sections. +ifdef LD_IS_BFD +EXTRA_DSO_LDOPTS += $(topsrcdir)/toolkit/library/StaticXULComponents.ld +endif + +ifeq (WINNT,$(OS_TARGET)) +get_first_and_last = dumpbin -exports $1 | grep _NSModule@@ | sort -k 3 | sed -n 's/^.*?\([^@]*\)@@.*$$/\1/;1p;$$p' +else +get_first_and_last = $(TOOLCHAIN_PREFIX)nm -g $1 | grep _NSModule$$ | sort | sed -n 's/^.* _*\([^ ]*\)$$/\1/;1p;$$p' +endif + +LOCAL_CHECKS = test "$$($(get_first_and_last) | xargs echo)" != "start_kPStaticModules_NSModule end_kPStaticModules_NSModule" && echo "NSModules are not ordered appropriately" && exit 1 || exit 0 + +ifeq (Linux,$(OS_ARCH)) +LOCAL_CHECKS += ; test "$$($(TOOLCHAIN_PREFIX)readelf -l $1 | awk '$1 == "LOAD" { t += 1 } END { print t }')" -le 1 && echo "Only one PT_LOAD segment" && exit 1 || exit 0 +endif diff --git a/toolkit/library/moz.build b/toolkit/library/moz.build index bd73db0426de..fc084a4a8415 100644 --- a/toolkit/library/moz.build +++ b/toolkit/library/moz.build @@ -7,43 +7,18 @@ LIBRARY_NAME = 'xul' SOURCES += [ - 'nsStaticXULComponents.cpp', + 'StaticXULComponentsStart.cpp', ] +# This, combined with the fact the file is first, makes the start pointer +# it contains first in Windows PGO builds. +SOURCES['StaticXULComponentsStart.cpp'].no_pgo = True + if CONFIG['OS_ARCH'] == 'WINNT': SOURCES += [ 'nsDllMain.cpp', ] -# component libraries -additional_defines = ( - 'MOZ_AUTH_EXTENSION', - 'MOZ_GIO_COMPONENT', - 'MOZ_JSDEBUGGER', - 'MOZ_PERMISSIONS', - 'MOZ_PREF_EXTENSIONS', - 'MOZ_SPELLCHECK', - 'MOZ_UNIVERSALCHARDET', - 'MOZ_ZIPWRITER', -) - -for var in additional_defines: - if CONFIG[var]: - DEFINES[var] = True - -if CONFIG['MOZ_DEBUG'] and CONFIG['ENABLE_TESTS']: - DEFINES['ENABLE_LAYOUTDEBUG'] = True - -if CONFIG['MOZ_WIDGET_TOOLKIT'] not in ('android', 'gonk', 'qt', - 'cocoa', 'windows') and \ - CONFIG['MOZ_XUL']: - DEFINES['MOZ_FILEVIEW'] = True - -# Platform-specific icon channel stuff - supported mostly-everywhere -if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('windows', 'mac', 'cocoa', - 'gtk2', 'gtk3', 'qt', 'android'): - DEFINES['ICON_DECODER'] = True - LOCAL_INCLUDES += [ '/config', # need widget/windows for resource.h (included from widget.rc) @@ -57,4 +32,4 @@ if CONFIG['OS_ARCH'] == 'WINNT' and not CONFIG['GNU_CC']: FAIL_ON_WARNINGS = True -DIRS += ['build', 'gtest'] +DIRS += ['StaticXULComponentsEnd', 'build', 'gtest'] diff --git a/toolkit/library/nsStaticXULComponents.cpp b/toolkit/library/nsStaticXULComponents.cpp deleted file mode 100644 index 6378db2946bf..000000000000 --- a/toolkit/library/nsStaticXULComponents.cpp +++ /dev/null @@ -1,276 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "mozilla/Module.h" -#include "nsXPCOM.h" -#include "nsMemory.h" - -#ifdef MOZ_AUTH_EXTENSION -#define AUTH_MODULE MODULE(nsAuthModule) -#else -#define AUTH_MODULE -#endif - -#ifdef MOZ_PERMISSIONS -#define PERMISSIONS_MODULES \ - MODULE(nsCookieModule) \ - MODULE(nsPermissionsModule) -#else -#define PERMISSIONS_MODULES -#endif - -#ifdef MOZ_UNIVERSALCHARDET -#define UNIVERSALCHARDET_MODULE MODULE(nsUniversalCharDetModule) -#else -#define UNIVERSALCHARDET_MODULE -#endif - -#ifdef XP_WIN -# define WIDGET_MODULES MODULE(nsWidgetModule) -#elif defined(XP_MACOSX) -# define WIDGET_MODULES MODULE(nsWidgetMacModule) -#elif defined(MOZ_WIDGET_GTK) -# define WIDGET_MODULES MODULE(nsWidgetGtk2Module) -#elif defined(MOZ_WIDGET_QT) -# define WIDGET_MODULES MODULE(nsWidgetQtModule) -#elif defined(MOZ_WIDGET_ANDROID) -# define WIDGET_MODULES MODULE(nsWidgetAndroidModule) -#elif defined(MOZ_WIDGET_GONK) -# define WIDGET_MODULES MODULE(nsWidgetGonkModule) -#else -# error Unknown widget module. -#endif - -#ifndef MOZ_B2G -#define CONTENT_PROCESS_WIDGET_MODULES MODULE(nsContentProcessWidgetModule) -#else -#define CONTENT_PROCESS_WIDGET_MODULES -#endif - -#ifdef ICON_DECODER -#define ICON_MODULE MODULE(nsIconDecoderModule) -#else -#define ICON_MODULE -#endif - -#ifdef MOZ_ENABLE_XREMOTE -#define XREMOTE_MODULES MODULE(RemoteServiceModule) -#else -#define XREMOTE_MODULES -#endif - -#ifdef MOZ_PREF_EXTENSIONS -#define SYSTEMPREF_MODULES MODULE(nsAutoConfigModule) -#else -#define SYSTEMPREF_MODULES -#endif - -#ifdef ENABLE_LAYOUTDEBUG -#define LAYOUT_DEBUG_MODULE MODULE(nsLayoutDebugModule) -#else -#define LAYOUT_DEBUG_MODULE -#endif - -#ifdef MOZ_JSDEBUGGER -#define JSDEBUGGER_MODULES \ - MODULE(JavaScript_Debugger) -#else -#define JSDEBUGGER_MODULES -#endif - -#if defined(MOZ_FILEVIEW) && defined(MOZ_XUL) -#define FILEVIEW_MODULE MODULE(nsFileViewModule) -#else -#define FILEVIEW_MODULE -#endif - -#ifdef MOZ_ZIPWRITER -#define ZIPWRITER_MODULE MODULE(ZipWriterModule) -#else -#define ZIPWRITER_MODULE -#endif - -#ifdef MOZ_PLACES -#define PLACES_MODULES \ - MODULE(nsPlacesModule) -#else -#define PLACES_MODULES -#endif - -#ifdef MOZ_XUL -#define XULENABLED_MODULES \ - MODULE(tkAutoCompleteModule) \ - MODULE(satchel) \ - MODULE(PKI) -#else -#define XULENABLED_MODULES -#endif - -#ifdef MOZ_SPELLCHECK -#define SPELLCHECK_MODULE MODULE(mozSpellCheckerModule) -#else -#define SPELLCHECK_MODULE -#endif - -#ifdef MOZ_XUL -#ifdef MOZ_WIDGET_GTK -#define UNIXPROXY_MODULE MODULE(nsUnixProxyModule) -#endif -#if defined(MOZ_WIDGET_QT) -#define UNIXPROXY_MODULE MODULE(nsUnixProxyModule) -#endif -#endif -#ifndef UNIXPROXY_MODULE -#define UNIXPROXY_MODULE -#endif - -#if defined(XP_MACOSX) -#define OSXPROXY_MODULE MODULE(nsOSXProxyModule) -#else -#define OSXPROXY_MODULE -#endif - -#if defined(XP_WIN) -#define WINDOWSPROXY_MODULE MODULE(nsWindowsProxyModule) -#else -#define WINDOWSPROXY_MODULE -#endif - -#if defined(MOZ_WIDGET_ANDROID) -#define ANDROIDPROXY_MODULE MODULE(nsAndroidProxyModule) -#else -#define ANDROIDPROXY_MODULE -#endif - -#if defined(BUILD_CTYPES) -#define JSCTYPES_MODULE MODULE(jsctypes) -#else -#define JSCTYPES_MODULE -#endif - -#ifndef MOZ_APP_COMPONENT_MODULES -#if defined(MOZ_APP_COMPONENT_INCLUDE) -#include MOZ_APP_COMPONENT_INCLUDE -#define MOZ_APP_COMPONENT_MODULES APP_COMPONENT_MODULES -#else -#define MOZ_APP_COMPONENT_MODULES -#endif -#endif - -#if defined(MOZ_ENABLE_PROFILER_SPS) -#define PROFILER_MODULE MODULE(nsProfilerModule) -#else -#define PROFILER_MODULE -#endif - -#if defined(MOZ_WEBRTC) -#define PEERCONNECTION_MODULE MODULE(peerconnection) -#else -#define PEERCONNECTION_MODULE -#endif - -#if defined(MOZ_GIO_COMPONENT) -#define GIO_MODULE MODULE(nsGIOModule) -#else -#define GIO_MODULE -#endif - -#if defined(MOZ_SYNTH_PICO) -#define SYNTH_PICO_MODULE MODULE(synthpico) -#else -#define SYNTH_PICO_MODULE -#endif - -#define XUL_MODULES \ - MODULE(nsUConvModule) \ - MODULE(nsI18nModule) \ - MODULE(nsChardetModule) \ - UNIVERSALCHARDET_MODULE \ - MODULE(necko) \ - PERMISSIONS_MODULES \ - AUTH_MODULE \ - MODULE(nsJarModule) \ - ZIPWRITER_MODULE \ - MODULE(StartupCacheModule) \ - MODULE(nsPrefModule) \ - MODULE(nsRDFModule) \ - MODULE(nsWindowDataSourceModule) \ - MODULE(nsParserModule) \ - MODULE(nsImageLib2Module) \ - MODULE(nsMediaSnifferModule) \ - MODULE(nsGfxModule) \ - PROFILER_MODULE \ - WIDGET_MODULES \ - CONTENT_PROCESS_WIDGET_MODULES \ - ICON_MODULE \ - MODULE(nsPluginModule) \ - MODULE(nsLayoutModule) \ - MODULE(docshell_provider) \ - MODULE(embedcomponents) \ - MODULE(Browser_Embedding_Module) \ - MODULE(appshell) \ - MODULE(nsTransactionManagerModule) \ - MODULE(nsComposerModule) \ - MODULE(application) \ - MODULE(Apprunner) \ - MODULE(CommandLineModule) \ - FILEVIEW_MODULE \ - MODULE(mozStorageModule) \ - PLACES_MODULES \ - XULENABLED_MODULES \ - MODULE(nsToolkitCompsModule) \ - XREMOTE_MODULES \ - JSDEBUGGER_MODULES \ - MODULE(BOOT) \ - MODULE(NSS) \ - SYSTEMPREF_MODULES \ - SPELLCHECK_MODULE \ - LAYOUT_DEBUG_MODULE \ - UNIXPROXY_MODULE \ - OSXPROXY_MODULE \ - WINDOWSPROXY_MODULE \ - ANDROIDPROXY_MODULE \ - JSCTYPES_MODULE \ - MODULE(jsreflect) \ - MODULE(jsperf) \ - MODULE(identity) \ - MODULE(nsServicesCryptoModule) \ - MOZ_APP_COMPONENT_MODULES \ - MODULE(nsTelemetryModule) \ - MODULE(jsinspector) \ - MODULE(jsdebugger) \ - PEERCONNECTION_MODULE \ - GIO_MODULE \ - SYNTH_PICO_MODULE \ - MODULE(DiskSpaceWatcherModule) \ - /* end of list */ - -#define MODULE(_name) \ - NSMODULE_DECL(_name); - -XUL_MODULES - -#ifdef MOZ_WIDGET_GONK -MODULE(WifiCertServiceModule) -MODULE(WifiProxyServiceModule) -MODULE(NetworkWorkerModule) -#endif - -#undef MODULE - -#define MODULE(_name) \ - &NSMODULE_NAME(_name), - -extern const mozilla::Module *const *const kPStaticModules[] = { - XUL_MODULES -#ifdef MOZ_WIDGET_GONK -MODULE(WifiCertServiceModule) -MODULE(WifiProxyServiceModule) -MODULE(NetworkWorkerModule) -#endif - nullptr -}; - -#undef MODULE diff --git a/widget/cocoa/nsClipboard.h b/widget/cocoa/nsClipboard.h index 3a5577e0450c..5dece34833d4 100644 --- a/widget/cocoa/nsClipboard.h +++ b/widget/cocoa/nsClipboard.h @@ -38,13 +38,8 @@ protected: NS_IMETHOD GetNativeClipboardData(nsITransferable * aTransferable, int32_t aWhichClipboard); private: - // This is always set to the native change count after any modification of the - // general clipboard. - int mChangeCountGeneral; - // This is always set to the native change count after any modification of the - // find clipboard. - int mChangeCountFind; - + int32_t mCachedClipboard; + int32_t mChangeCount; // Set to the native change count after any modification of the clipboard. }; #endif // nsClipboard_h_ diff --git a/widget/cocoa/nsClipboard.mm b/widget/cocoa/nsClipboard.mm index 19219c6df427..497534e1cd18 100644 --- a/widget/cocoa/nsClipboard.mm +++ b/widget/cocoa/nsClipboard.mm @@ -40,8 +40,8 @@ extern void EnsureLogInitialized(); nsClipboard::nsClipboard() : nsBaseClipboard() { - mChangeCountGeneral = 0; - mChangeCountFind = 0; + mCachedClipboard = -1; + mChangeCount = 0; EnsureLogInitialized(); } @@ -113,11 +113,8 @@ nsClipboard::SetNativeClipboardData(int32_t aWhichClipboard) } } - if (aWhichClipboard == kFindClipboard) { - mChangeCountFind = [cocoaPasteboard changeCount]; - } else { - mChangeCountGeneral = [cocoaPasteboard changeCount]; - } + mCachedClipboard = aWhichClipboard; + mChangeCount = [cocoaPasteboard changeCount]; mIgnoreEmptyNotification = false; @@ -281,10 +278,10 @@ nsClipboard::GetNativeClipboardData(nsITransferable* aTransferable, int32_t aWhi uint32_t flavorCount; flavorList->Count(&flavorCount); - int changeCount = (aWhichClipboard == kFindClipboard) ? mChangeCountFind : mChangeCountGeneral; // If we were the last ones to put something on the pasteboard, then just use the cached // transferable. Otherwise clear it because it isn't relevant any more. - if (changeCount == [cocoaPasteboard changeCount]) { + if (mCachedClipboard == aWhichClipboard && + mChangeCount == [cocoaPasteboard changeCount]) { if (mTransferable) { for (uint32_t i = 0; i < flavorCount; i++) { nsCOMPtr genericFlavor; diff --git a/xpcom/components/Module.h b/xpcom/components/Module.h index 81025d7f1cba..e20fc39cfc7c 100644 --- a/xpcom/components/Module.h +++ b/xpcom/components/Module.h @@ -118,8 +118,21 @@ struct Module #if defined(MOZILLA_INTERNAL_API) # define NSMODULE_NAME(_name) _name##_NSModule -# define NSMODULE_DECL(_name) extern mozilla::Module const *const NSMODULE_NAME(_name) -# define NSMODULE_DEFN(_name) NSMODULE_DECL(_name) +# if defined(_MSC_VER) +# pragma section(".kPStaticModules$M", read) +# pragma comment(linker, "/merge:.kPStaticModules=.rdata") +# define NSMODULE_SECTION __declspec(allocate(".kPStaticModules$M"), dllexport) +# elif defined(__GNUC__) +# if defined(__ELF__) +# define NSMODULE_SECTION __attribute__((section(".kPStaticModules"), visibility("protected"))) +# elif defined(__MACH__) +# define NSMODULE_SECTION __attribute__((section("__DATA, .kPStaticModules"), visibility("default"))) +# endif +# endif +# if !defined(NSMODULE_SECTION) +# error Do not know how to define sections. +# endif +# define NSMODULE_DEFN(_name) extern NSMODULE_SECTION mozilla::Module const *const NSMODULE_NAME(_name) #else # define NSMODULE_NAME(_name) NSModule # define NSMODULE_DEFN(_name) extern "C" NS_EXPORT mozilla::Module const *const NSModule diff --git a/xpcom/components/nsComponentManager.cpp b/xpcom/components/nsComponentManager.cpp index 9aa40d5e7d7c..d9b227f9ca33 100644 --- a/xpcom/components/nsComponentManager.cpp +++ b/xpcom/components/nsComponentManager.cpp @@ -81,10 +81,6 @@ using namespace mozilla; PRLogModuleInfo* nsComponentManagerLog = nullptr; -// defined in nsStaticXULComponents.cpp to contain all the components in -// libxul. -extern mozilla::Module const *const *const kPStaticModules[]; - #if 0 || defined (DEBUG_timeless) #define SHOW_DENIED_ON_SHUTDOWN #define SHOW_CI_ON_EXISTING_SERVICE @@ -278,6 +274,15 @@ nsComponentManagerImpl::nsComponentManagerImpl() nsTArray* nsComponentManagerImpl::sStaticModules; +NSMODULE_DEFN(start_kPStaticModules); +NSMODULE_DEFN(end_kPStaticModules); + +/* The content between start_kPStaticModules and end_kPStaticModules is gathered + * by the linker from various objects containing symbols in a specific section. + * ASAN considers (rightfully) the use of this content as a global buffer + * overflow. But this is a deliberate and well-considered choice, with no proper + * way to make ASAN happy. */ +MOZ_ASAN_BLACKLIST /* static */ void nsComponentManagerImpl::InitializeStaticModules() { @@ -285,9 +290,10 @@ nsComponentManagerImpl::InitializeStaticModules() return; sStaticModules = new nsTArray; - for (const mozilla::Module *const *const *staticModules = kPStaticModules; - *staticModules; ++staticModules) - sStaticModules->AppendElement(**staticModules); + for (const mozilla::Module *const *staticModules = &NSMODULE_NAME(start_kPStaticModules) + 1; + staticModules < &NSMODULE_NAME(end_kPStaticModules); ++staticModules) + if (*staticModules) // ASAN adds padding + sStaticModules->AppendElement(*staticModules); } nsTArray* diff --git a/xpcom/io/nsScriptableInputStream.cpp b/xpcom/io/nsScriptableInputStream.cpp index 1951191957d6..62b653a66581 100644 --- a/xpcom/io/nsScriptableInputStream.cpp +++ b/xpcom/io/nsScriptableInputStream.cpp @@ -55,7 +55,7 @@ nsScriptableInputStream::Read(uint32_t aCount, char** aResult) } // bug716556 - Ensure count+1 doesn't overflow - uint32_t count = XPCOM_MIN(uint32_t(XPCOM_MIN(count64, aCount)), uint32_t(UINT32_MAX - 1)); + uint32_t count = XPCOM_MIN((uint32_t)XPCOM_MIN(count64, aCount), UINT32_MAX - 1); buffer = (char*)moz_malloc(count + 1); // make room for '\0' if (!buffer) { return NS_ERROR_OUT_OF_MEMORY;