Merge mozilla-inbound to mozilla-central. a=merge
authorDorel Luca <dluca@mozilla.com>
Wed, 20 Jun 2018 00:54:45 +0300
changeset 808580 e429320fcdd2d5236bb4713e6c435456146e42b9
parent 808579 33c34fbb0b0d7e890c1985c3ba896dd1a238dd1d (current diff)
parent 808491 2d5727bbe035f34e4044878e2870520291286156 (diff)
child 808581 147ee0ef8bd0ff4c351f8364f747a6fb4c543841
child 808586 3f5b942a9fe4a7f7c2b45ade51ddfb693d50d86b
child 808613 c9ea6efc81ae5ad58d880cefd6e3db6b5ea36dbc
child 808619 eaa914a76a16fbc1a6d1cd437b4a55a1ae53732c
child 808625 e61f74a1fe1c1a4fe228a0551567842c2c8475d3
child 808633 d311b8e3c28c61982d14487f876182181c325d66
child 808636 71017f2d9e0f4f9301def57636611cff2e6dbe21
child 808638 78fcb699cfc170f8c48b5bfc62335b423a28787f
child 808650 2eda1a2ab66b87a62ffc22c7750e7a323bb2adf3
child 808677 b994e5f56361c407feabf5f336bc34fbb8bface2
child 808718 42d6174c52eeba85a89d72a5cb2d25411b4c22a4
child 808767 2a521962efe9b1703bb46df3807a15be66242de1
child 808772 92fb6222e1eece5facf88886ea610a9799e7bd44
child 808779 65f07ba889969f1e8f4b55d5b47094064cd70f12
child 808782 c37ebe85dbc03bb92e0a545716c432f8444c837c
child 808823 d6bd0c87cef48f9183680e9f504050295394ff1b
child 808829 3bc4b3c22b539fb1f571aaf446a0033d07c0ba05
child 808865 c3812cdeaaf621bceb753f451bd2219107f02e7a
child 808867 53b551bcfa6665c231a2a790838f795f049678e1
child 809098 45ebcd45583dbe9690f6bf20515dfb1bde8babde
child 813113 ac441aade2764944ac5a9ddecbb095070586b1d2
child 815548 56f046e9c804963a91c364ece0363cd36feaece5
child 815550 611987769c38e822e881f969ef4ef4bb25dd277f
push id113427
push userxquan@mozilla.com
push dateWed, 20 Jun 2018 00:55:16 +0000
reviewersmerge
milestone62.0a1
Merge mozilla-inbound to mozilla-central. a=merge
js/src/gc/GC.cpp
js/src/gc/GCRuntime.h
js/src/jsfriendapi.cpp
js/src/vm/Runtime.cpp
js/src/vm/Runtime.h
--- a/accessible/tests/mochitest/aom/test_general.html
+++ b/accessible/tests/mochitest/aom/test_general.html
@@ -102,16 +102,16 @@
     }
 
     // Check if an AccessibleNode is properly cached.
     let node = ifrDoc.createElement("div");
     anode = node.accessibleNode;
     is(anode, node.accessibleNode, "an AccessibleNode is properly cached");
 
     // Adopting node to another document doesn't change .accessibleNode
-    anotherDoc = document.implementation.createDocument("", "", null);
+    let anotherDoc = document.implementation.createDocument("", "", null);
     let adopted_node = anotherDoc.adoptNode(node);
     is(anode, adopted_node.accessibleNode, "adopting node to another document doesn't change node.accessibleNode");
 
     finish();
   }
   </script>
 </head>
--- a/devtools/client/accessibility/constants.js
+++ b/devtools/client/accessibility/constants.js
@@ -33,31 +33,29 @@ exports.UPDATE_CAN_BE_ENABLED = "UPDATE_
 // Ordered accessible properties to be displayed by the accessible component.
 exports.ORDERED_PROPS = [
   "name",
   "role",
   "actions",
   "value",
   "DOMNode",
   "description",
-  "help",
   "keyboardShortcut",
   "childCount",
   "indexInParent",
   "states",
   "attributes"
 ];
 
 // Accessible events (emitted by accessible front) that the accessible component
 // listens to for a current accessible.
 exports.ACCESSIBLE_EVENTS = [
   "actions-change",
   "attributes-change",
   "description-change",
-  "help-change",
   "name-change",
   "reorder",
   "shortcut-change",
   "states-change",
   "text-change",
   "value-change",
   "index-in-parent-change"
 ];
--- a/devtools/client/accessibility/test/browser/browser.ini
+++ b/devtools/client/accessibility/test/browser/browser.ini
@@ -1,14 +1,16 @@
 [DEFAULT]
 tags = devtools
 subsuite = devtools
 support-files =
   head.js
   !/devtools/client/shared/test/shared-head.js
+  !/devtools/client/shared/test/test-actor.js
+  !/devtools/client/shared/test/test-actor-registry.js
   !/devtools/client/inspector/test/shared-head.js
   !/devtools/client/shared/test/shared-redux-head.js
   !/devtools/client/shared/test/telemetry-test-helpers.js
 
 [browser_accessibility_context_menu_browser.js]
 [browser_accessibility_context_menu_inspector.js]
 [browser_accessibility_mutations.js]
 [browser_accessibility_panel_highlighter.js]
--- a/devtools/client/accessibility/test/browser/browser_accessibility_mutations.js
+++ b/devtools/client/accessibility/test/browser/browser_accessibility_mutations.js
@@ -45,17 +45,16 @@ const tests = [{
       name: `""`
     }],
     sidebar: {
       name: null,
       role: "paragraph",
       actions: [],
       value: "",
       description: "",
-      help: "",
       keyboardShortcut: "",
       childCount: 1,
       indexInParent: 1,
       states: ["selectable text", "opaque", "enabled", "sensitive"]
     }
   }
 }, {
   desc: "Remove a child from a document.",
--- a/devtools/client/accessibility/test/browser/browser_accessibility_sidebar.js
+++ b/devtools/client/accessibility/test/browser/browser_accessibility_sidebar.js
@@ -24,17 +24,16 @@ const tests = [{
   desc: "Test the initial accessibility sidebar state.",
   expected: {
     sidebar: {
       name: "Accessibility Panel Test",
       role: "document",
       actions: [],
       value: "",
       description: "",
-      help: "",
       keyboardShortcut: "",
       childCount: 0,
       indexInParent: 0,
       states: ["readonly", "focusable", "opaque", "enabled", "sensitive"]
     }
   }
 }, {
   desc: "Mark document as disabled for accessibility.",
--- a/devtools/client/accessibility/test/browser/browser_accessibility_tree_nagivation.js
+++ b/devtools/client/accessibility/test/browser/browser_accessibility_tree_nagivation.js
@@ -31,17 +31,16 @@ const tests = [{
       name: `"Accessibility Panel Test"`
     }],
     sidebar: {
       name: "Accessibility Panel Test",
       role: "document",
       actions: [],
       value: "",
       description: "",
-      help: "",
       keyboardShortcut: "",
       childCount: 2,
       indexInParent: 0,
       states: ["readonly", "focusable", "opaque", "enabled", "sensitive"]
     }
   }
 }, {
   desc: "Expand first tree node.",
@@ -76,34 +75,32 @@ const tests = [{
       name: `""`
     }],
     sidebar: {
       name: "Top level header",
       role: "heading",
       actions: [],
       value: "",
       description: "",
-      help: "",
       keyboardShortcut: "",
       childCount: 1,
       indexInParent: 0,
       states: ["selectable text", "opaque", "enabled", "sensitive"]
     }
   }
 }, {
   desc: "Select third tree node.",
   action: ({ doc }) => selectRow(doc, 2),
   expected: {
     sidebar: {
       name: "Top level header",
       role: "text leaf",
       actions: [],
       value: "",
       description: "",
-      help: "",
       keyboardShortcut: "",
       childCount: 0,
       indexInParent: 0,
       states: ["opaque", "enabled", "sensitive"]
     }
   }
 }, {
   desc: "Collapse first tree node.",
@@ -114,17 +111,16 @@ const tests = [{
       name: `"Accessibility Panel Test"`
     }],
     sidebar: {
       name: "Accessibility Panel Test",
       role: "document",
       actions: [],
       value: "",
       description: "",
-      help: "",
       keyboardShortcut: "",
       childCount: 2,
       indexInParent: 0,
       states: ["readonly", "focusable", "opaque", "enabled", "sensitive"]
     }
   }
 }, {
   desc: "Expand first tree node again.",
--- a/devtools/client/inspector/inspector.js
+++ b/devtools/client/inspector/inspector.js
@@ -49,16 +49,17 @@ const INITIAL_SIDEBAR_SIZE = 350;
 // If the toolbox's width is smaller than the given amount of pixels, the sidebar
 // automatically switches from 'landscape/horizontal' to 'portrait/vertical' mode.
 const PORTRAIT_MODE_WIDTH_THRESHOLD = 700;
 // If the toolbox's width docked to the side is smaller than the given amount of pixels,
 // the sidebar automatically switches from 'landscape/horizontal' to 'portrait/vertical'
 // mode.
 const SIDE_PORTAIT_MODE_WIDTH_THRESHOLD = 1000;
 
+const THREE_PANE_FIRST_RUN_PREF = "devtools.inspector.three-pane-first-run";
 const SHOW_THREE_PANE_ONBOARDING_PREF = "devtools.inspector.show-three-pane-tooltip";
 const THREE_PANE_ENABLED_PREF = "devtools.inspector.three-pane-enabled";
 const THREE_PANE_ENABLED_SCALAR = "devtools.inspector.three_pane_enabled";
 
 const TELEMETRY_EYEDROPPER_OPENED = "devtools.toolbar.eyedropper.opened";
 
 /**
  * Represents an open instance of the Inspector for a tab.
@@ -115,16 +116,17 @@ function Inspector(toolbox) {
   this.reflowTracker = new ReflowTracker(this._target);
   this.styleChangeTracker = new InspectorStyleChangeTracker(this);
 
   // Store the URL of the target page prior to navigation in order to ensure
   // telemetry counts in the Grid Inspector are not double counted on reload.
   this.previousURL = this.target.url;
 
   this.is3PaneModeEnabled = Services.prefs.getBoolPref(THREE_PANE_ENABLED_PREF);
+  this.is3PaneModeFirstRun = Services.prefs.getBoolPref(THREE_PANE_FIRST_RUN_PREF);
   this.show3PaneTooltip = Services.prefs.getBoolPref(SHOW_THREE_PANE_ONBOARDING_PREF);
 
   this.nodeMenuTriggerInfo = null;
 
   this._clearSearchResultsLabel = this._clearSearchResultsLabel.bind(this);
   this._handleRejectionIfNotDestroyed = this._handleRejectionIfNotDestroyed.bind(this);
   this._onBeforeNavigate = this._onBeforeNavigate.bind(this);
   this._onContextMenu = this._onContextMenu.bind(this);
@@ -245,16 +247,24 @@ Inspector.prototype = {
 
     if (this.target.isLocalTab) {
       this.target.on("thread-paused", this._updateDebuggerPausedWarning);
       this.target.on("thread-resumed", this._updateDebuggerPausedWarning);
       this.toolbox.on("select", this._updateDebuggerPausedWarning);
       this._updateDebuggerPausedWarning();
     }
 
+    // Resets the inspector sidebar widths if this is the first run of the 3 pane mode.
+    if (this.is3PaneModeFirstRun) {
+      Services.prefs.clearUserPref("devtools.toolsidebar-width.inspector");
+      Services.prefs.clearUserPref("devtools.toolsidebar-height.inspector");
+      Services.prefs.clearUserPref("devtools.toolsidebar-width.inspector.splitsidebar");
+      Services.prefs.setBoolPref(THREE_PANE_FIRST_RUN_PREF, false);
+    }
+
     this._initMarkup();
     this.isReady = false;
 
     this.setupSearchBox();
 
     // Setup the splitter before the sidebar is displayed so,
     // we don't miss any events.
     this.setupSplitter();
@@ -1391,16 +1401,17 @@ Inspector.prototype = {
     this.reflowTracker.destroy();
     this.styleChangeTracker.destroy();
 
     this._notificationBox = null;
     this._target = null;
     this._toolbox = null;
     this.breadcrumbs = null;
     this.is3PaneModeEnabled = null;
+    this.is3PaneModeFirstRun = null;
     this.panelDoc = null;
     this.panelWin.inspector = null;
     this.panelWin = null;
     this.resultsLength = null;
     this.searchBox = null;
     this.show3PaneTooltip = null;
     this.sidebar = null;
     this.store = null;
--- a/devtools/client/inspector/rules/models/element-style.js
+++ b/devtools/client/inspector/rules/models/element-style.js
@@ -1,43 +1,41 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set ts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 const promise = require("promise");
 const Rule = require("devtools/client/inspector/rules/models/rule");
-const {promiseWarn} = require("devtools/client/inspector/shared/utils");
-const {ELEMENT_STYLE} = require("devtools/shared/specs/styles");
-const {getCssProperties, isCssVariable} = require("devtools/shared/fronts/css-properties");
+const UserProperties = require("devtools/client/inspector/rules/models/user-properties");
+const { promiseWarn } = require("devtools/client/inspector/shared/utils");
+const { getCssProperties, isCssVariable } = require("devtools/shared/fronts/css-properties");
+const { ELEMENT_STYLE } = require("devtools/shared/specs/styles");
 
 /**
  * ElementStyle is responsible for the following:
  *   Keeps track of which properties are overridden.
  *   Maintains a list of Rule objects for a given element.
  *
- * @param {Element} element
- *        The element whose style we are viewing.
- * @param {CssRuleView} ruleView
- *        The instance of the rule-view panel.
- * @param {Object} store
- *        The ElementStyle can use this object to store metadata
- *        that might outlast the rule view, particularly the current
- *        set of disabled properties.
- * @param {PageStyleFront} pageStyle
- *        Front for the page style actor that will be providing
- *        the style information.
- * @param {Boolean} showUserAgentStyles
- *        Should user agent styles be inspected?
+ * @param  {Element} element
+ *         The element whose style we are viewing.
+ * @param  {CssRuleView} ruleView
+ *         The instance of the rule-view panel.
+ * @param  {Object} store
+ *         The ElementStyle can use this object to store metadata
+ *         that might outlast the rule view, particularly the current
+ *         set of disabled properties.
+ * @param  {PageStyleFront} pageStyle
+ *         Front for the page style actor that will be providing
+ *         the style information.
+ * @param  {Boolean} showUserAgentStyles
+ *         Should user agent styles be inspected?
  */
-function ElementStyle(element, ruleView, store, pageStyle,
-    showUserAgentStyles) {
+function ElementStyle(element, ruleView, store, pageStyle, showUserAgentStyles) {
   this.element = element;
   this.ruleView = ruleView;
   this.store = store || {};
   this.pageStyle = pageStyle;
   this.showUserAgentStyles = showUserAgentStyles;
   this.rules = [];
   this.cssProperties = getCssProperties(this.ruleView.inspector.toolbox);
   this.variables = new Map();
@@ -49,23 +47,21 @@ function ElementStyle(element, ruleView,
   }
 
   if (!("disabled" in this.store)) {
     this.store.disabled = new WeakMap();
   }
 }
 
 ElementStyle.prototype = {
-  // The element we're looking at.
-  element: null,
-
   destroy: function() {
     if (this.destroyed) {
       return;
     }
+
     this.destroyed = true;
 
     for (const rule of this.rules) {
       if (rule.editor) {
         rule.editor.destroy();
       }
     }
   },
@@ -88,27 +84,22 @@ ElementStyle.prototype = {
    * ready.
    */
   populate: function() {
     const populated = this.pageStyle.getApplied(this.element, {
       inherited: true,
       matchedSelectors: true,
       filter: this.showUserAgentStyles ? "ua" : undefined,
     }).then(entries => {
-      if (this.destroyed) {
-        return promise.resolve(undefined);
-      }
-
-      if (this.populated !== populated) {
-        // Don't care anymore.
+      if (this.destroyed || this.populated !== populated) {
         return promise.resolve(undefined);
       }
 
       // Store the current list of rules (if any) during the population
-      // process.  They will be reused if possible.
+      // process. They will be reused if possible.
       const existingRules = this.rules;
 
       this.rules = [];
 
       for (const entry of entries) {
         this._maybeAddRule(entry, existingRules);
       }
 
@@ -136,17 +127,17 @@ ElementStyle.prototype = {
     this.populated = populated;
     return this.populated;
   },
 
   /**
    * Get the font families in use by the element.
    *
    * Returns a promise that will be resolved to a list of CSS family
-   * names.  The list might have duplicates.
+   * names. The list might have duplicates.
    */
   getUsedFontFamilies: function() {
     return new Promise((resolve, reject) => {
       this.ruleView.styleWindow.requestIdleCallback(async () => {
         try {
           const fonts = await this.pageStyle.getUsedFontFaces(
             this.element, { includePreviews: false });
           resolve(fonts.map(font => font.CSSFamilyName));
@@ -162,35 +153,31 @@ ElementStyle.prototype = {
    */
   _sortRulesForPseudoElement: function() {
     this.rules = this.rules.sort((a, b) => {
       return (a.pseudoElement || "z") > (b.pseudoElement || "z");
     });
   },
 
   /**
-   * Add a rule if it's one we care about.  Filters out duplicates and
+   * Add a rule if it's one we care about. Filters out duplicates and
    * inherited styles with no inherited properties.
    *
-   * @param {Object} options
-   *        Options for creating the Rule, see the Rule constructor.
-   * @param {Array} existingRules
-   *        Rules to reuse if possible.  If a rule is reused, then it
-   *        it will be deleted from this array.
+   * @param  {Object} options
+   *         Options for creating the Rule, see the Rule constructor.
+   * @param  {Array} existingRules
+   *         Rules to reuse if possible. If a rule is reused, then it
+   *         it will be deleted from this array.
    * @return {Boolean} true if we added the rule.
    */
   _maybeAddRule: function(options, existingRules) {
     // If we've already included this domRule (for example, when a
     // common selector is inherited), ignore it.
-    if (options.rule &&
-        this.rules.some(rule => rule.domRule === options.rule)) {
-      return false;
-    }
-
-    if (options.system) {
+    if (options.system ||
+        (options.rule && this.rules.some(rule => rule.domRule === options.rule))) {
       return false;
     }
 
     let rule = null;
 
     // If we're refreshing and the rule previously existed, reuse the
     // Rule object.
     if (existingRules) {
@@ -227,19 +214,19 @@ ElementStyle.prototype = {
       this.markOverridden(pseudo);
     }
   },
 
   /**
    * Mark the properties listed in this.rules for a given pseudo element
    * with an overridden flag if an earlier property overrides it.
    *
-   * @param {String} pseudo
-   *        Which pseudo element to flag as overridden.
-   *        Empty string or undefined will default to no pseudo element.
+   * @param  {String} pseudo
+   *         Which pseudo element to flag as overridden.
+   *         Empty string or undefined will default to no pseudo element.
    */
   markOverridden: function(pseudo = "") {
     // Gather all the text properties applied by these rules, ordered
     // from more- to less-specific. Text properties from keyframes rule are
     // excluded from being marked as overridden since a number of criteria such
     // as time, and animation overlay are required to be check in order to
     // determine if the property is overridden.
     const textProps = [];
@@ -257,17 +244,17 @@ ElementStyle.prototype = {
 
     // Gather all the computed properties applied by those text
     // properties.
     let computedProps = [];
     for (const textProp of textProps) {
       computedProps = computedProps.concat(textProp.computed);
     }
 
-    // Walk over the computed properties.  As we see a property name
+    // Walk over the computed properties. As we see a property name
     // for the first time, mark that property's name as taken by this
     // property.
     //
     // If we come across a property whose name is already taken, check
     // its priority against the property that was found first:
     //
     //   If the new property is a higher priority, mark the old
     //   property overridden and mark the property name as taken by
@@ -286,73 +273,77 @@ ElementStyle.prototype = {
       // linear-gradient in this case:
       //  -moz-linear-gradient: ...;
       //  -webkit-linear-gradient: ...;
       //  linear-gradient: ...;
       if (!computedProp.textProp.isValid()) {
         computedProp.overridden = true;
         continue;
       }
+
       let overridden;
       if (earlier &&
           computedProp.priority === "important" &&
           earlier.priority !== "important" &&
           (earlier.textProp.rule.inherited ||
            !computedProp.textProp.rule.inherited)) {
-        // New property is higher priority.  Mark the earlier property
+        // New property is higher priority. Mark the earlier property
         // overridden (which will reverse its dirty state).
         earlier._overriddenDirty = !earlier._overriddenDirty;
         earlier.overridden = true;
         overridden = false;
       } else {
         overridden = !!earlier;
       }
 
       computedProp._overriddenDirty =
         (!!computedProp.overridden !== overridden);
       computedProp.overridden = overridden;
+
       if (!computedProp.overridden && computedProp.textProp.enabled) {
         taken[computedProp.name] = computedProp;
 
         if (isCssVariable(computedProp.name)) {
           this.variables.set(computedProp.name, computedProp.value);
         }
       }
     }
 
     // For each TextProperty, mark it overridden if all of its
-    // computed properties are marked overridden.  Update the text
-    // property's associated editor, if any.  This will clear the
+    // computed properties are marked overridden. Update the text
+    // property's associated editor, if any. This will clear the
     // _overriddenDirty state on all computed properties.
     for (const textProp of textProps) {
       // _updatePropertyOverridden will return true if the
       // overridden state has changed for the text property.
       if (this._updatePropertyOverridden(textProp)) {
         textProp.updateEditor();
       }
     }
   },
 
   /**
    * Mark a given TextProperty as overridden or not depending on the
-   * state of its computed properties.  Clears the _overriddenDirty state
+   * state of its computed properties. Clears the _overriddenDirty state
    * on all computed properties.
    *
-   * @param {TextProperty} prop
-   *        The text property to update.
+   * @param  {TextProperty} prop
+   *         The text property to update.
    * @return {Boolean} true if the TextProperty's overridden state (or any of
    *         its computed properties overridden state) changed.
    */
   _updatePropertyOverridden: function(prop) {
     let overridden = true;
     let dirty = false;
+
     for (const computedProp of prop.computed) {
       if (!computedProp.overridden) {
         overridden = false;
       }
+
       dirty = computedProp._overriddenDirty || dirty;
       delete computedProp._overriddenDirty;
     }
 
     dirty = (!!prop.overridden !== overridden) || dirty;
     prop.overridden = overridden;
     return dirty;
   },
@@ -366,87 +357,9 @@ ElementStyle.prototype = {
   * @return {String} the variable's value or null if the variable is
   *         not defined.
   */
   getVariable: function(name) {
     return this.variables.get(name);
   },
 };
 
-/**
- * Store of CSSStyleDeclarations mapped to properties that have been changed by
- * the user.
- */
-function UserProperties() {
-  this.map = new Map();
-}
-
-UserProperties.prototype = {
-  /**
-   * Get a named property for a given CSSStyleDeclaration.
-   *
-   * @param {CSSStyleDeclaration} style
-   *        The CSSStyleDeclaration against which the property is mapped.
-   * @param {String} name
-   *        The name of the property to get.
-   * @param {String} value
-   *        Default value.
-   * @return {String}
-   *        The property value if it has previously been set by the user, null
-   *        otherwise.
-   */
-  getProperty: function(style, name, value) {
-    const key = this.getKey(style);
-    const entry = this.map.get(key, null);
-
-    if (entry && name in entry) {
-      return entry[name];
-    }
-    return value;
-  },
-
-  /**
-   * Set a named property for a given CSSStyleDeclaration.
-   *
-   * @param {CSSStyleDeclaration} style
-   *        The CSSStyleDeclaration against which the property is to be mapped.
-   * @param {String} name
-   *        The name of the property to set.
-   * @param {String} userValue
-   *        The value of the property to set.
-   */
-  setProperty: function(style, name, userValue) {
-    const key = this.getKey(style, name);
-    const entry = this.map.get(key, null);
-
-    if (entry) {
-      entry[name] = userValue;
-    } else {
-      const props = {};
-      props[name] = userValue;
-      this.map.set(key, props);
-    }
-  },
-
-  /**
-   * Check whether a named property for a given CSSStyleDeclaration is stored.
-   *
-   * @param {CSSStyleDeclaration} style
-   *        The CSSStyleDeclaration against which the property would be mapped.
-   * @param {String} name
-   *        The name of the property to check.
-   */
-  contains: function(style, name) {
-    const key = this.getKey(style, name);
-    const entry = this.map.get(key, null);
-    return !!entry && name in entry;
-  },
-
-  getKey: function(style, name) {
-    return style.actorID + ":" + name;
-  },
-
-  clear: function() {
-    this.map.clear();
-  }
-};
-
 module.exports = ElementStyle;
--- a/devtools/client/inspector/rules/models/moz.build
+++ b/devtools/client/inspector/rules/models/moz.build
@@ -3,9 +3,10 @@
 # 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/.
 
 DevToolsModules(
     'element-style.js',
     'rule.js',
     'text-property.js',
+    'user-properties.js',
 )
copy from devtools/client/inspector/rules/models/element-style.js
copy to devtools/client/inspector/rules/models/user-properties.js
--- a/devtools/client/inspector/rules/models/element-style.js
+++ b/devtools/client/inspector/rules/models/user-properties.js
@@ -1,381 +1,14 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set ts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
-const promise = require("promise");
-const Rule = require("devtools/client/inspector/rules/models/rule");
-const {promiseWarn} = require("devtools/client/inspector/shared/utils");
-const {ELEMENT_STYLE} = require("devtools/shared/specs/styles");
-const {getCssProperties, isCssVariable} = require("devtools/shared/fronts/css-properties");
-
-/**
- * ElementStyle is responsible for the following:
- *   Keeps track of which properties are overridden.
- *   Maintains a list of Rule objects for a given element.
- *
- * @param {Element} element
- *        The element whose style we are viewing.
- * @param {CssRuleView} ruleView
- *        The instance of the rule-view panel.
- * @param {Object} store
- *        The ElementStyle can use this object to store metadata
- *        that might outlast the rule view, particularly the current
- *        set of disabled properties.
- * @param {PageStyleFront} pageStyle
- *        Front for the page style actor that will be providing
- *        the style information.
- * @param {Boolean} showUserAgentStyles
- *        Should user agent styles be inspected?
- */
-function ElementStyle(element, ruleView, store, pageStyle,
-    showUserAgentStyles) {
-  this.element = element;
-  this.ruleView = ruleView;
-  this.store = store || {};
-  this.pageStyle = pageStyle;
-  this.showUserAgentStyles = showUserAgentStyles;
-  this.rules = [];
-  this.cssProperties = getCssProperties(this.ruleView.inspector.toolbox);
-  this.variables = new Map();
-
-  // We don't want to overwrite this.store.userProperties so we only create it
-  // if it doesn't already exist.
-  if (!("userProperties" in this.store)) {
-    this.store.userProperties = new UserProperties();
-  }
-
-  if (!("disabled" in this.store)) {
-    this.store.disabled = new WeakMap();
-  }
-}
-
-ElementStyle.prototype = {
-  // The element we're looking at.
-  element: null,
-
-  destroy: function() {
-    if (this.destroyed) {
-      return;
-    }
-    this.destroyed = true;
-
-    for (const rule of this.rules) {
-      if (rule.editor) {
-        rule.editor.destroy();
-      }
-    }
-  },
-
-  /**
-   * Called by the Rule object when it has been changed through the
-   * setProperty* methods.
-   */
-  _changed: function() {
-    if (this.onChanged) {
-      this.onChanged();
-    }
-  },
-
-  /**
-   * Refresh the list of rules to be displayed for the active element.
-   * Upon completion, this.rules[] will hold a list of Rule objects.
-   *
-   * Returns a promise that will be resolved when the elementStyle is
-   * ready.
-   */
-  populate: function() {
-    const populated = this.pageStyle.getApplied(this.element, {
-      inherited: true,
-      matchedSelectors: true,
-      filter: this.showUserAgentStyles ? "ua" : undefined,
-    }).then(entries => {
-      if (this.destroyed) {
-        return promise.resolve(undefined);
-      }
-
-      if (this.populated !== populated) {
-        // Don't care anymore.
-        return promise.resolve(undefined);
-      }
-
-      // Store the current list of rules (if any) during the population
-      // process.  They will be reused if possible.
-      const existingRules = this.rules;
-
-      this.rules = [];
-
-      for (const entry of entries) {
-        this._maybeAddRule(entry, existingRules);
-      }
-
-      // Mark overridden computed styles.
-      this.markOverriddenAll();
-
-      this._sortRulesForPseudoElement();
-
-      // We're done with the previous list of rules.
-      for (const r of existingRules) {
-        if (r && r.editor) {
-          r.editor.destroy();
-        }
-      }
-
-      return undefined;
-    }).catch(e => {
-      // populate is often called after a setTimeout,
-      // the connection may already be closed.
-      if (this.destroyed) {
-        return promise.resolve(undefined);
-      }
-      return promiseWarn(e);
-    });
-    this.populated = populated;
-    return this.populated;
-  },
-
-  /**
-   * Get the font families in use by the element.
-   *
-   * Returns a promise that will be resolved to a list of CSS family
-   * names.  The list might have duplicates.
-   */
-  getUsedFontFamilies: function() {
-    return new Promise((resolve, reject) => {
-      this.ruleView.styleWindow.requestIdleCallback(async () => {
-        try {
-          const fonts = await this.pageStyle.getUsedFontFaces(
-            this.element, { includePreviews: false });
-          resolve(fonts.map(font => font.CSSFamilyName));
-        } catch (e) {
-          reject(e);
-        }
-      });
-    });
-  },
-
-  /**
-   * Put pseudo elements in front of others.
-   */
-  _sortRulesForPseudoElement: function() {
-    this.rules = this.rules.sort((a, b) => {
-      return (a.pseudoElement || "z") > (b.pseudoElement || "z");
-    });
-  },
-
-  /**
-   * Add a rule if it's one we care about.  Filters out duplicates and
-   * inherited styles with no inherited properties.
-   *
-   * @param {Object} options
-   *        Options for creating the Rule, see the Rule constructor.
-   * @param {Array} existingRules
-   *        Rules to reuse if possible.  If a rule is reused, then it
-   *        it will be deleted from this array.
-   * @return {Boolean} true if we added the rule.
-   */
-  _maybeAddRule: function(options, existingRules) {
-    // If we've already included this domRule (for example, when a
-    // common selector is inherited), ignore it.
-    if (options.rule &&
-        this.rules.some(rule => rule.domRule === options.rule)) {
-      return false;
-    }
-
-    if (options.system) {
-      return false;
-    }
-
-    let rule = null;
-
-    // If we're refreshing and the rule previously existed, reuse the
-    // Rule object.
-    if (existingRules) {
-      const ruleIndex = existingRules.findIndex((r) => r.matches(options));
-      if (ruleIndex >= 0) {
-        rule = existingRules[ruleIndex];
-        rule.refresh(options);
-        existingRules.splice(ruleIndex, 1);
-      }
-    }
-
-    // If this is a new rule, create its Rule object.
-    if (!rule) {
-      rule = new Rule(this, options);
-    }
-
-    // Ignore inherited rules with no visible properties.
-    if (options.inherited && !rule.hasAnyVisibleProperties()) {
-      return false;
-    }
-
-    this.rules.push(rule);
-    return true;
-  },
-
-  /**
-   * Calls markOverridden with all supported pseudo elements
-   */
-  markOverriddenAll: function() {
-    this.variables.clear();
-    this.markOverridden();
-
-    for (const pseudo of this.cssProperties.pseudoElements) {
-      this.markOverridden(pseudo);
-    }
-  },
-
-  /**
-   * Mark the properties listed in this.rules for a given pseudo element
-   * with an overridden flag if an earlier property overrides it.
-   *
-   * @param {String} pseudo
-   *        Which pseudo element to flag as overridden.
-   *        Empty string or undefined will default to no pseudo element.
-   */
-  markOverridden: function(pseudo = "") {
-    // Gather all the text properties applied by these rules, ordered
-    // from more- to less-specific. Text properties from keyframes rule are
-    // excluded from being marked as overridden since a number of criteria such
-    // as time, and animation overlay are required to be check in order to
-    // determine if the property is overridden.
-    const textProps = [];
-    for (const rule of this.rules) {
-      if ((rule.matchedSelectors.length > 0 ||
-           rule.domRule.type === ELEMENT_STYLE) &&
-          rule.pseudoElement === pseudo && !rule.keyframes) {
-        for (const textProp of rule.textProps.slice(0).reverse()) {
-          if (textProp.enabled) {
-            textProps.push(textProp);
-          }
-        }
-      }
-    }
-
-    // Gather all the computed properties applied by those text
-    // properties.
-    let computedProps = [];
-    for (const textProp of textProps) {
-      computedProps = computedProps.concat(textProp.computed);
-    }
-
-    // Walk over the computed properties.  As we see a property name
-    // for the first time, mark that property's name as taken by this
-    // property.
-    //
-    // If we come across a property whose name is already taken, check
-    // its priority against the property that was found first:
-    //
-    //   If the new property is a higher priority, mark the old
-    //   property overridden and mark the property name as taken by
-    //   the new property.
-    //
-    //   If the new property is a lower or equal priority, mark it as
-    //   overridden.
-    //
-    // _overriddenDirty will be set on each prop, indicating whether its
-    // dirty status changed during this pass.
-    const taken = {};
-    for (const computedProp of computedProps) {
-      const earlier = taken[computedProp.name];
-
-      // Prevent -webkit-gradient from being selected after unchecking
-      // linear-gradient in this case:
-      //  -moz-linear-gradient: ...;
-      //  -webkit-linear-gradient: ...;
-      //  linear-gradient: ...;
-      if (!computedProp.textProp.isValid()) {
-        computedProp.overridden = true;
-        continue;
-      }
-      let overridden;
-      if (earlier &&
-          computedProp.priority === "important" &&
-          earlier.priority !== "important" &&
-          (earlier.textProp.rule.inherited ||
-           !computedProp.textProp.rule.inherited)) {
-        // New property is higher priority.  Mark the earlier property
-        // overridden (which will reverse its dirty state).
-        earlier._overriddenDirty = !earlier._overriddenDirty;
-        earlier.overridden = true;
-        overridden = false;
-      } else {
-        overridden = !!earlier;
-      }
-
-      computedProp._overriddenDirty =
-        (!!computedProp.overridden !== overridden);
-      computedProp.overridden = overridden;
-      if (!computedProp.overridden && computedProp.textProp.enabled) {
-        taken[computedProp.name] = computedProp;
-
-        if (isCssVariable(computedProp.name)) {
-          this.variables.set(computedProp.name, computedProp.value);
-        }
-      }
-    }
-
-    // For each TextProperty, mark it overridden if all of its
-    // computed properties are marked overridden.  Update the text
-    // property's associated editor, if any.  This will clear the
-    // _overriddenDirty state on all computed properties.
-    for (const textProp of textProps) {
-      // _updatePropertyOverridden will return true if the
-      // overridden state has changed for the text property.
-      if (this._updatePropertyOverridden(textProp)) {
-        textProp.updateEditor();
-      }
-    }
-  },
-
-  /**
-   * Mark a given TextProperty as overridden or not depending on the
-   * state of its computed properties.  Clears the _overriddenDirty state
-   * on all computed properties.
-   *
-   * @param {TextProperty} prop
-   *        The text property to update.
-   * @return {Boolean} true if the TextProperty's overridden state (or any of
-   *         its computed properties overridden state) changed.
-   */
-  _updatePropertyOverridden: function(prop) {
-    let overridden = true;
-    let dirty = false;
-    for (const computedProp of prop.computed) {
-      if (!computedProp.overridden) {
-        overridden = false;
-      }
-      dirty = computedProp._overriddenDirty || dirty;
-      delete computedProp._overriddenDirty;
-    }
-
-    dirty = (!!prop.overridden !== overridden) || dirty;
-    prop.overridden = overridden;
-    return dirty;
-  },
-
- /**
-  * Returns the current value of a CSS variable; or null if the
-  * variable is not defined.
-  *
-  * @param  {String} name
-  *         The name of the variable.
-  * @return {String} the variable's value or null if the variable is
-  *         not defined.
-  */
-  getVariable: function(name) {
-    return this.variables.get(name);
-  },
-};
-
 /**
  * Store of CSSStyleDeclarations mapped to properties that have been changed by
  * the user.
  */
 function UserProperties() {
   this.map = new Map();
 }
 
@@ -444,9 +77,9 @@ UserProperties.prototype = {
     return style.actorID + ":" + name;
   },
 
   clear: function() {
     this.map.clear();
   }
 };
 
-module.exports = ElementStyle;
+module.exports = UserProperties;
--- a/devtools/client/jar.mn
+++ b/devtools/client/jar.mn
@@ -210,16 +210,18 @@ devtools.jar:
     skin/images/tool-scratchpad.svg (themes/images/tool-scratchpad.svg)
     skin/images/tool-webaudio.svg (themes/images/tool-webaudio.svg)
     skin/images/tool-memory.svg (themes/images/tool-memory.svg)
     skin/images/tool-dom.svg (themes/images/tool-dom.svg)
     skin/images/tool-accessibility.svg (themes/images/tool-accessibility.svg)
     skin/images/tool-application.svg (themes/images/tool-application.svg)
     skin/images/close.svg (themes/images/close.svg)
     skin/images/clear.svg (themes/images/clear.svg)
+    skin/images/close-3-pane.svg (themes/images/close-3-pane.svg)
+    skin/images/open-3-pane.svg (themes/images/open-3-pane.svg)
     skin/images/vview-delete.png (themes/images/vview-delete.png)
     skin/images/vview-delete@2x.png (themes/images/vview-delete@2x.png)
     skin/images/vview-edit.png (themes/images/vview-edit.png)
     skin/images/vview-edit@2x.png (themes/images/vview-edit@2x.png)
     skin/images/vview-lock.png (themes/images/vview-lock.png)
     skin/images/vview-lock@2x.png (themes/images/vview-lock@2x.png)
     skin/images/vview-open-inspector.png (themes/images/vview-open-inspector.png)
     skin/images/vview-open-inspector@2x.png (themes/images/vview-open-inspector@2x.png)
--- a/devtools/client/preferences/devtools-client.js
+++ b/devtools/client/preferences/devtools-client.js
@@ -39,17 +39,19 @@ pref("devtools.inspector.remote", false)
 // Show the 3 pane onboarding tooltip in the inspector only in release or beta builds.
 #if defined(RELEASE_OR_BETA)
 pref("devtools.inspector.show-three-pane-tooltip", true);
 #else
 pref("devtools.inspector.show-three-pane-tooltip", false);
 #endif
 // Enable the 3 pane mode in the inspector
 pref("devtools.inspector.three-pane-enabled", true);
-
+// Whether or not this is the first run of the 3 pane mode. Used to reset the default
+// inspector sidebar widths for its first run.
+pref("devtools.inspector.three-pane-first-run", true);
 // Collapse pseudo-elements by default in the rule-view
 pref("devtools.inspector.show_pseudo_elements", false);
 // The default size for image preview tooltips in the rule-view/computed-view/markup-view
 pref("devtools.inspector.imagePreviewTooltipSize", 300);
 // Enable user agent style inspection in rule-view
 pref("devtools.inspector.showUserAgentStyles", false);
 // Show all native anonymous content (like controls in <video> tags)
 pref("devtools.inspector.showAllAnonymousContent", false);
new file mode 100644
--- /dev/null
+++ b/devtools/client/themes/images/close-3-pane.svg
@@ -0,0 +1,10 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
+  <g fill="context-fill #0b0b0b">
+    <rect width="3" height="10" x="11" y="3" fill-opacity=".2"/>
+    <path d="M2,3.00247329 L2,3.00247329 L2,12.9975267 C2,12.9944441 2.00555363,13 2.00684547,13 L13.9931545,13 C13.9983241,13 14,12.9983304 14,12.9975267 L14,3.00247329 C14,3.00555595 13.9944464,3 13.9931545,3 L2.00684547,3 C2.00167589,3 2,3.00166957 2,3.00247329 L2,3.00247329 L2,3.00247329 L2,3.00247329 L2,3.00247329 L2,3.00247329 Z M1,3.00247329 C1,2.44882258 1.44994876,2 2.00684547,2 L13.9931545,2 C14.5492199,2 15,2.45576096 15,3.00247329 L15,12.9975267 C15,13.5511774 14.5500512,14 13.9931545,14 L2.00684547,14 C1.45078007,14 1,13.544239 1,12.9975267 L1,3.00247329 Z M10,3.45454545 L10,12.5454545 L10,13 L11,13 L11,12.5454545 L11,3.45454545 L11,3 L10,3 L10,3.45454545 Z"/>
+    <polygon points="4 10.75 4 6 8.5 8.375"/>
+  </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/devtools/client/themes/images/open-3-pane.svg
@@ -0,0 +1,10 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
+  <g fill="context-fill #0b0b0b">
+    <rect width="5" height="10" x="10" y="3" fill-opacity=".2"/>
+    <path d="M2,3.00247329 L2,3.00247329 L2,12.9975267 C2,12.9944441 2.00601643,13 2.00741593,13 L14.9925841,13 C14.9981844,13 15,12.9983304 15,12.9975267 L15,3.00247329 C15,3.00555595 14.9939836,3 14.9925841,3 L2.00741593,3 C2.00181555,3 2,3.00166957 2,3.00247329 L2,3.00247329 L2,3.00247329 L2,3.00247329 L2,3.00247329 L2,3.00247329 Z M2.07876301,2 L14.921237,2 C15.5170213,2 16,2.45576096 16,3.00247329 L16,12.9975267 C16,13.5511774 15.517912,14 14.921237,14 L2.07876301,14 C1.48297865,14 1,13.544239 1,12.9975267 L1,3.00247329 C1,2.44882258 1.48208795,2 2.07876301,2 Z M12,12.5454545 L12,13 L13,13 L13,12.5454545 L13,3.45454545 L13,3 L12,3 L12,3.45454545 L12,12.5454545 Z M9,3.45454545 L9,12.5454545 L9,13 L10,13 L10,12.5454545 L10,3.45454545 L10,3 L9,3 L9,3.45454545 Z"/>
+    <polygon points="3 10.75 3 6 7.5 8.375" transform="rotate(-180 5.25 8.375)"/>
+  </g>
+</svg>
--- a/devtools/client/themes/inspector.css
+++ b/devtools/client/themes/inspector.css
@@ -59,19 +59,24 @@ window {
   min-width: 200px;
 }
 
 #inspector-splitter-box .controlled.pane-collapsed {
   visibility: collapse;
 }
 
 #inspector-splitter-box .sidebar-toggle::before {
+  background-image: url("chrome://devtools/skin/images/close-3-pane.svg");
   transform: unset;
 }
 
+#inspector-splitter-box .sidebar-toggle.pane-collapsed::before {
+  background-image: url("chrome://devtools/skin/images/open-3-pane.svg");
+}
+
 /* Use flex layout for the Inspector toolbar. For now, it's done
    specifically for the Inspector toolbar since general rule applied
    on .devtools-toolbar breaks breadcrumbs and also toolbars in other
    panels (e.g. webconsole, debugger), these are not ready for HTML
    layout yet. */
 #inspector-toolbar.devtools-toolbar {
   display: flex;
 }
--- a/devtools/server/actors/accessibility.js
+++ b/devtools/server/actors/accessibility.js
@@ -32,17 +32,16 @@ const {
   EVENT_TEXT_CHANGED,
   EVENT_TEXT_INSERTED,
   EVENT_TEXT_REMOVED,
   EVENT_ACCELERATOR_CHANGE,
   EVENT_ACTION_CHANGE,
   EVENT_DEFACTION_CHANGE,
   EVENT_DESCRIPTION_CHANGE,
   EVENT_DOCUMENT_ATTRIBUTES_CHANGED,
-  EVENT_HELP_CHANGE,
   EVENT_HIDE,
   EVENT_NAME_CHANGE,
   EVENT_OBJECT_ATTRIBUTE_CHANGED,
   EVENT_REORDER,
   EVENT_STATE_CHANGE,
   EVENT_TEXT_ATTRIBUTE_CHANGED,
   EVENT_VALUE_CHANGE
 } = nsIAccessibleEvent;
@@ -229,28 +228,26 @@ const AccessibleActor = ActorClassWithSp
 
   get description() {
     if (this.isDefunct) {
       return null;
     }
     return this.rawAccessible.description;
   },
 
-  get help() {
-    if (this.isDefunct) {
-      return null;
-    }
-    return this.rawAccessible.help;
-  },
-
   get keyboardShortcut() {
     if (this.isDefunct) {
       return null;
     }
-    return this.rawAccessible.keyboardShortcut;
+    // Gecko accessibility exposes two key bindings: Accessible::AccessKey and
+    // Accessible::KeyboardShortcut. The former is used for accesskey, where the latter
+    // is used for global shortcuts defined by XUL menu items, etc. Here - do what the
+    // Windows implementation does: try AccessKey first, and if that's empty, use
+    // KeyboardShortcut.
+    return this.rawAccessible.accessKey || this.rawAccessible.keyboardShortcut;
   },
 
   get childCount() {
     if (this.isDefunct) {
       return 0;
     }
     return this.rawAccessible.childCount;
   },
@@ -356,17 +353,16 @@ const AccessibleActor = ActorClassWithSp
 
   form() {
     return {
       actor: this.actorID,
       role: this.role,
       name: this.name,
       value: this.value,
       description: this.description,
-      help: this.help,
       keyboardShortcut: this.keyboardShortcut,
       childCount: this.childCount,
       domNodeType: this.domNodeType,
       indexInParent: this.indexInParent,
       states: this.states,
       actions: this.actions,
       attributes: this.attributes
     };
@@ -639,21 +635,16 @@ const AccessibleWalkerActor = ActorClass
           events.emit(accessible, "value-change", rawAccessible.value);
         }
         break;
       case EVENT_DESCRIPTION_CHANGE:
         if (accessible) {
           events.emit(accessible, "description-change", rawAccessible.description);
         }
         break;
-      case EVENT_HELP_CHANGE:
-        if (accessible) {
-          events.emit(accessible, "help-change", rawAccessible.help);
-        }
-        break;
       case EVENT_REORDER:
         if (accessible) {
           accessible.children().forEach(child =>
             events.emit(child, "index-in-parent-change", child.indexInParent));
           events.emit(accessible, "reorder", rawAccessible.childCount, this);
         }
         break;
       case EVENT_HIDE:
@@ -679,19 +670,20 @@ const AccessibleWalkerActor = ActorClass
         break;
       case EVENT_DOCUMENT_ATTRIBUTES_CHANGED:
       case EVENT_OBJECT_ATTRIBUTE_CHANGED:
       case EVENT_TEXT_ATTRIBUTE_CHANGED:
         if (accessible) {
           events.emit(accessible, "attributes-change", accessible.attributes);
         }
         break;
+      // EVENT_ACCELERATOR_CHANGE is currently not fired by gecko accessibility.
       case EVENT_ACCELERATOR_CHANGE:
         if (accessible) {
-          events.emit(accessible, "shortcut-change", rawAccessible.keyboardShortcut);
+          events.emit(accessible, "shortcut-change", accessible.keyboardShortcut);
         }
         break;
       default:
         break;
     }
   },
 
   /**
--- a/devtools/server/tests/browser/browser_accessibility_node.js
+++ b/devtools/server/tests/browser/browser_accessibility_node.js
@@ -4,29 +4,29 @@
 
 "use strict";
 
 // Checks for the AccessibleActor
 
 add_task(async function() {
   const {client, walker, accessibility} =
     await initAccessibilityFrontForUrl(MAIN_DOMAIN + "doc_accessibility.html");
+  const modifiers = Services.appinfo.OS === "Darwin" ? "\u2303\u2325" : "Alt+Shift+";
 
   const a11yWalker = await accessibility.getWalker();
   await accessibility.enable();
   const buttonNode = await walker.querySelector(walker.rootNode, "#button");
   const accessibleFront = await a11yWalker.getAccessibleFor(buttonNode);
 
   checkA11yFront(accessibleFront, {
     name: "Accessible Button",
     role: "pushbutton",
     value: "",
     description: "Accessibility Test",
-    help: "",
-    keyboardShortcut: "",
+    keyboardShortcut: modifiers + "b",
     childCount: 1,
     domNodeType: 1,
     indexInParent: 1,
     states: ["focusable", "selectable text", "opaque", "enabled", "sensitive"],
     actions: [ "Press" ],
     attributes: {
       "margin-top": "0px",
       display: "inline-block",
--- a/devtools/server/tests/browser/browser_accessibility_node_events.js
+++ b/devtools/server/tests/browser/browser_accessibility_node_events.js
@@ -4,34 +4,34 @@
 
 "use strict";
 
 // Checks for the AccessibleActor events
 
 add_task(async function() {
   const {client, walker, accessibility} =
     await initAccessibilityFrontForUrl(MAIN_DOMAIN + "doc_accessibility.html");
+  const modifiers = Services.appinfo.OS === "Darwin" ? "\u2303\u2325" : "Alt+Shift+";
 
   const a11yWalker = await accessibility.getWalker();
   await accessibility.enable();
   const rootNode = await walker.getRootNode();
   const a11yDoc = await a11yWalker.getAccessibleFor(rootNode);
   const buttonNode = await walker.querySelector(walker.rootNode, "#button");
   const accessibleFront = await a11yWalker.getAccessibleFor(buttonNode);
   const sliderNode = await walker.querySelector(walker.rootNode, "#slider");
   const accessibleSliderFront = await a11yWalker.getAccessibleFor(sliderNode);
   const browser = gBrowser.selectedBrowser;
 
   checkA11yFront(accessibleFront, {
     name: "Accessible Button",
     role: "pushbutton",
     value: "",
     description: "Accessibility Test",
-    help: "",
-    keyboardShortcut: "",
+    keyboardShortcut: modifiers + "b",
     childCount: 1,
     domNodeType: 1,
     indexInParent: 1,
     states: ["focusable", "selectable text", "opaque", "enabled", "sensitive"],
     actions: [ "Press" ],
     attributes: {
       "margin-top": "0px",
       display: "inline-block",
--- a/devtools/server/tests/browser/doc_accessibility.html
+++ b/devtools/server/tests/browser/doc_accessibility.html
@@ -1,12 +1,12 @@
 <!DOCTYPE HTML>
 <html>
   <head>
     <meta charset="utf-8">
   </head>
 <body>
   <h1 id="h1">Accessibility Test</h1>
-  <button id="button" aria-describedby="h1">Accessible Button</button>
+  <button id="button" aria-describedby="h1" accesskey="b">Accessible Button</button>
   <div id="slider" role="slider" aria-valuenow="5"
        aria-valuemin="0" aria-valuemax="7">slider</div>
 </body>
 </html>
--- a/devtools/shared/fronts/accessibility.js
+++ b/devtools/shared/fronts/accessibility.js
@@ -36,20 +36,16 @@ const AccessibleFront = FrontClassWithSp
   get value() {
     return this._form.value;
   },
 
   get description() {
     return this._form.description;
   },
 
-  get help() {
-    return this._form.help;
-  },
-
   get keyboardShortcut() {
     return this._form.keyboardShortcut;
   },
 
   get childCount() {
     return this._form.childCount;
   },
 
@@ -95,20 +91,16 @@ const AccessibleFront = FrontClassWithSp
   valueChange: preEvent("value-change", function(value) {
     this._form.value = value;
   }),
 
   descriptionChange: preEvent("description-change", function(description) {
     this._form.description = description;
   }),
 
-  helpChange: preEvent("help-change", function(help) {
-    this._form.help = help;
-  }),
-
   shortcutChange: preEvent("shortcut-change", function(keyboardShortcut) {
     this._form.keyboardShortcut = keyboardShortcut;
   }),
 
   reorder: preEvent("reorder", function(childCount, walker) {
     this._form.childCount = childCount;
     // Reorder event affects the tree rendering, we fire this event on
     // accessibility walker as the point of interaction for UI.
--- a/devtools/shared/specs/accessibility.js
+++ b/devtools/shared/specs/accessibility.js
@@ -45,20 +45,16 @@ const accessibleSpec = generateActorSpec
     "states-change": {
       type: "statesChange",
       states: Arg(0, "array:string")
     },
     "attributes-change": {
       type: "attributesChange",
       attributes: Arg(0, "json")
     },
-    "help-change": {
-      type: "helpChange",
-      help: Arg(0, "string")
-    },
     "shortcut-change": {
       type: "shortcutChange",
       shortcut: Arg(0, "string")
     },
     "reorder": {
       type: "reorder",
       childCount: Arg(0, "number"),
       walker: Arg(1, "nullable:accessiblewalker")
--- a/dom/base/AnonymousContent.cpp
+++ b/dom/base/AnonymousContent.cpp
@@ -223,15 +223,17 @@ AnonymousContent::GetComputedStyleProper
 
   nsIPresShell* shell = element->OwnerDoc()->GetShell();
   if (!shell) {
     aRv.Throw(NS_ERROR_NOT_AVAILABLE);
     return;
   }
 
   RefPtr<nsComputedDOMStyle> cs =
-    new nsComputedDOMStyle(element, NS_LITERAL_STRING(""), shell,
+    new nsComputedDOMStyle(element,
+                           NS_LITERAL_STRING(""),
+                           element->OwnerDoc(),
                            nsComputedDOMStyle::eAll);
   aRv = cs->GetPropertyValue(aPropertyName, aResult);
 }
 
 } // namespace dom
 } // namespace mozilla
--- a/dom/base/Attr.cpp
+++ b/dom/base/Attr.cpp
@@ -284,28 +284,16 @@ Attr::ComputeIndexOf(const nsINode* aPos
 
 nsresult
 Attr::InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                         bool aNotify)
 {
   return NS_ERROR_NOT_IMPLEMENTED;
 }
 
-nsresult
-Attr::InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                               bool aNotify)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-void
-Attr::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
-{
-}
-
 void
 Attr::RemoveChildNode(nsIContent* aKid, bool aNotify)
 {
 }
 
 void
 Attr::GetEventTargetParent(EventChainPreVisitor& aVisitor)
 {
--- a/dom/base/Attr.h
+++ b/dom/base/Attr.h
@@ -58,19 +58,16 @@ public:
 
   // nsINode interface
   virtual bool IsNodeOfType(uint32_t aFlags) const override;
   virtual uint32_t GetChildCount() const override;
   virtual nsIContent *GetChildAt_Deprecated(uint32_t aIndex) const override;
   virtual int32_t ComputeIndexOf(const nsINode* aPossibleChild) const override;
   virtual nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                                      bool aNotify) override;
-  virtual nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                            bool aNotify) override;
-  virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) override;
   virtual void RemoveChildNode(nsIContent* aKid, bool aNotify) override;
   virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult,
                          bool aPreallocateChildren) const override;
   virtual already_AddRefed<nsIURI> GetBaseURI(bool aTryUseXHRDocBaseURI = false) const override;
 
   static void Initialize();
   static void Shutdown();
 
--- a/dom/base/CharacterData.cpp
+++ b/dom/base/CharacterData.cpp
@@ -629,29 +629,16 @@ CharacterData::ComputeIndexOf(const nsIN
 nsresult
 CharacterData::InsertChildBefore(nsIContent* aKid,
                                  nsIContent* aBeforeThis,
                                  bool aNotify)
 {
   return NS_OK;
 }
 
-nsresult
-CharacterData::InsertChildAt_Deprecated(nsIContent* aKid,
-                                        uint32_t aIndex,
-                                        bool aNotify)
-{
-  return NS_OK;
-}
-
-void
-CharacterData::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
-{
-}
-
 void
 CharacterData::RemoveChildNode(nsIContent* aKid, bool aNotify)
 {
 }
 
 nsXBLBinding *
 CharacterData::DoGetXBLBinding() const
 {
--- a/dom/base/CharacterData.h
+++ b/dom/base/CharacterData.h
@@ -100,19 +100,16 @@ public:
                                     ErrorResult& aError) override;
 
   // nsINode methods
   virtual uint32_t GetChildCount() const override;
   virtual nsIContent *GetChildAt_Deprecated(uint32_t aIndex) const override;
   virtual int32_t ComputeIndexOf(const nsINode* aPossibleChild) const override;
   virtual nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                                      bool aNotify) override;
-  virtual nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                            bool aNotify) override;
-  virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) override;
   virtual void RemoveChildNode(nsIContent* aKid, bool aNotify) override;
   virtual void GetTextContentInternal(nsAString& aTextContent,
                                       OOMReporter& aError) override
   {
     GetNodeValue(aTextContent);
   }
   virtual void SetTextContentInternal(const nsAString& aTextContent,
                                       nsIPrincipal* aSubjectPrincipal,
--- a/dom/base/FragmentOrElement.cpp
+++ b/dom/base/FragmentOrElement.cpp
@@ -1220,37 +1220,16 @@ FragmentOrElement::InsertChildBefore(nsI
   MOZ_ASSERT(aKid, "null ptr");
 
   int32_t index = aBeforeThis ? ComputeIndexOf(aBeforeThis) : GetChildCount();
   MOZ_ASSERT(index >= 0);
 
   return doInsertChildAt(aKid, index, aNotify, mAttrsAndChildren);
 }
 
-nsresult
-FragmentOrElement::InsertChildAt_Deprecated(nsIContent* aKid,
-                                            uint32_t aIndex,
-                                            bool aNotify)
-{
-  MOZ_ASSERT(aKid, "null ptr");
-
-  return doInsertChildAt(aKid, aIndex, aNotify, mAttrsAndChildren);
-}
-
-void
-FragmentOrElement::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
-{
-  nsCOMPtr<nsIContent> oldKid = mAttrsAndChildren.GetSafeChildAt(aIndex);
-  NS_ASSERTION(oldKid == GetChildAt_Deprecated(aIndex), "Unexpected child in RemoveChildAt_Deprecated");
-
-  if (oldKid) {
-    doRemoveChildAt(aIndex, aNotify, oldKid, mAttrsAndChildren);
-  }
-}
-
 void
 FragmentOrElement::RemoveChildNode(nsIContent* aKid, bool aNotify)
 {
   // Let's keep the node alive.
   nsCOMPtr<nsIContent> kungFuDeathGrip = aKid;
   doRemoveChildAt(ComputeIndexOf(aKid), aNotify, aKid, mAttrsAndChildren);
 }
 
--- a/dom/base/FragmentOrElement.h
+++ b/dom/base/FragmentOrElement.h
@@ -93,19 +93,16 @@ public:
   NS_DECL_ADDSIZEOFEXCLUDINGTHIS
 
   // nsINode interface methods
   virtual uint32_t GetChildCount() const override;
   virtual nsIContent *GetChildAt_Deprecated(uint32_t aIndex) const override;
   virtual int32_t ComputeIndexOf(const nsINode* aPossibleChild) const override;
   virtual nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                                      bool aNotify) override;
-  virtual nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                            bool aNotify) override;
-  virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) override;
   virtual void RemoveChildNode(nsIContent* aKid, bool aNotify) override;
   virtual void GetTextContentInternal(nsAString& aTextContent,
                                       mozilla::OOMReporter& aError) override;
   virtual void SetTextContentInternal(const nsAString& aTextContent,
                                       nsIPrincipal* aSubjectPrincipal,
                                       mozilla::ErrorResult& aError) override;
 
   // nsIContent interface methods
--- a/dom/base/nsDocument.cpp
+++ b/dom/base/nsDocument.cpp
@@ -4104,56 +4104,16 @@ nsIDocument::InsertChildBefore(nsIConten
   }
 
   int32_t index = aBeforeThis ? ComputeIndexOf(aBeforeThis) : GetChildCount();
   MOZ_ASSERT(index >= 0);
 
   return doInsertChildAt(aKid, index, aNotify, mChildren);
 }
 
-nsresult
-nsIDocument::InsertChildAt_Deprecated(nsIContent* aKid,
-                                      uint32_t aIndex,
-                                      bool aNotify)
-{
-  if (aKid->IsElement() && GetRootElement()) {
-    NS_WARNING("Inserting root element when we already have one");
-    return NS_ERROR_DOM_HIERARCHY_REQUEST_ERR;
-  }
-
-  return doInsertChildAt(aKid, aIndex, aNotify, mChildren);
-}
-
-void
-nsIDocument::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
-{
-  nsCOMPtr<nsIContent> oldKid = GetChildAt_Deprecated(aIndex);
-  if (!oldKid) {
-    return;
-  }
-
-  if (oldKid->IsElement()) {
-    // Destroy the link map up front before we mess with the child list.
-    DestroyElementMaps();
-  }
-
-  // Preemptively clear mCachedRootElement, since we may be about to remove it
-  // from our child list, and we don't want to return this maybe-obsolete value
-  // from any GetRootElement() calls that happen inside of doRemoveChildAt().
-  // (NOTE: for this to be useful, doRemoveChildAt() must NOT trigger any
-  // GetRootElement() calls until after it's removed the child from mChildren.
-  // Any call before that point would restore this soon-to-be-obsolete cached
-  // answer, and our clearing here would be fruitless.)
-  mCachedRootElement = nullptr;
-  doRemoveChildAt(aIndex, aNotify, oldKid, mChildren);
-  MOZ_ASSERT(mCachedRootElement != oldKid,
-             "Stale pointer in mCachedRootElement, after we tried to clear it "
-             "(maybe somebody called GetRootElement() too early?)");
-}
-
 void
 nsIDocument::RemoveChildNode(nsIContent* aKid, bool aNotify)
 {
   if (aKid->IsElement()) {
     // Destroy the link map up front before we mess with the child list.
     DestroyElementMaps();
   }
 
--- a/dom/base/nsGlobalWindowOuter.cpp
+++ b/dom/base/nsGlobalWindowOuter.cpp
@@ -6686,45 +6686,22 @@ nsGlobalWindowOuter::PageHidden()
   FORWARD_TO_INNER_VOID(PageHidden, ());
 }
 
 already_AddRefed<nsICSSDeclaration>
 nsGlobalWindowOuter::GetComputedStyleHelperOuter(Element& aElt,
                                                  const nsAString& aPseudoElt,
                                                  bool aDefaultStylesOnly)
 {
-  if (!mDocShell) {
+  if (!mDoc) {
     return nullptr;
   }
 
-  nsCOMPtr<nsIPresShell> presShell = mDocShell->GetPresShell();
-
-  if (!presShell) {
-    // Try flushing frames on our parent in case there's a pending
-    // style change that will create the presshell.
-    auto* parent = nsGlobalWindowOuter::Cast(GetPrivateParent());
-    if (!parent) {
-      return nullptr;
-    }
-
-    parent->FlushPendingNotifications(FlushType::Frames);
-
-    // Might have killed mDocShell
-    if (!mDocShell) {
-      return nullptr;
-    }
-
-    presShell = mDocShell->GetPresShell();
-    if (!presShell) {
-      return nullptr;
-    }
-  }
-
   RefPtr<nsICSSDeclaration> compStyle =
-    NS_NewComputedDOMStyle(&aElt, aPseudoElt, presShell,
+    NS_NewComputedDOMStyle(&aElt, aPseudoElt, mDoc,
                            aDefaultStylesOnly ? nsComputedDOMStyle::eDefaultOnly :
                                                 nsComputedDOMStyle::eAll);
 
   return compStyle.forget();
 }
 
 //*****************************************************************************
 // nsGlobalWindowOuter::nsIInterfaceRequestor
--- a/dom/base/nsIDocument.h
+++ b/dom/base/nsIDocument.h
@@ -543,19 +543,16 @@ public:
 
   uint32_t GetChildCount() const final
   {
     return mChildren.ChildCount();
   }
 
   nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                              bool aNotify) override;
-  nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                    bool aNotify) override;
-  void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) final;
   void RemoveChildNode(nsIContent* aKid, bool aNotify) final;
   nsresult Clone(mozilla::dom::NodeInfo* aNodeInfo,
                  nsINode **aResult,
                  bool aPreallocateChildren) const override
   {
     return NS_ERROR_NOT_IMPLEMENTED;
   }
 
--- a/dom/base/nsINode.cpp
+++ b/dom/base/nsINode.cpp
@@ -528,34 +528,36 @@ void
 nsINode::GetNodeValueInternal(nsAString& aNodeValue)
 {
   SetDOMStringToNull(aNodeValue);
 }
 
 nsINode*
 nsINode::RemoveChild(nsINode& aOldChild, ErrorResult& aError)
 {
-  if (IsCharacterData()) {
+  if (!aOldChild.IsContent()) {
     // aOldChild can't be one of our children.
     aError.Throw(NS_ERROR_DOM_NOT_FOUND_ERR);
     return nullptr;
   }
 
   if (aOldChild.GetParentNode() == this) {
     nsContentUtils::MaybeFireNodeRemoved(&aOldChild, this);
   }
 
-  int32_t index = ComputeIndexOf(&aOldChild);
-  if (index == -1) {
+  // Check again, we may not be the child's parent anymore.
+  // Can be triggered by dom/base/crashtests/293388-1.html
+  if (aOldChild.AsContent()->IsRootOfAnonymousSubtree() ||
+      aOldChild.GetParentNode() != this) {
     // aOldChild isn't one of our children.
     aError.Throw(NS_ERROR_DOM_NOT_FOUND_ERR);
     return nullptr;
   }
 
-  RemoveChildAt_Deprecated(index, true);
+  RemoveChildNode(aOldChild.AsContent(), true);
   return &aOldChild;
 }
 
 void
 nsINode::Normalize()
 {
   // First collect list of nodes to be removed
   AutoTArray<nsCOMPtr<nsIContent>, 50> nodes;
@@ -635,17 +637,17 @@ nsINode::Normalize()
     }
 
     // Remove node
     nsCOMPtr<nsINode> parent = node->GetParentNode();
     NS_ASSERTION(parent || hasRemoveListeners,
                  "Should always have a parent unless "
                  "mutation events messed us up");
     if (parent) {
-      parent->RemoveChildAt_Deprecated(parent->ComputeIndexOf(node), true);
+      parent->RemoveChildNode(node, true);
     }
   }
 }
 
 nsresult
 nsINode::GetBaseURI(nsAString &aURI) const
 {
   nsCOMPtr<nsIURI> baseURI = GetBaseURI();
@@ -1992,58 +1994,54 @@ nsINode::ReplaceOrInsertBefore(bool aRep
   }
 
   EnsurePreInsertionValidity2(aReplace, *aNewChild, aRefChild, aError);
   if (aError.Failed()) {
     return nullptr;
   }
 
   // Record the node to insert before, if any
-  nsINode* nodeToInsertBefore;
+  nsIContent* nodeToInsertBefore;
   if (aReplace) {
     nodeToInsertBefore = aRefChild->GetNextSibling();
   } else {
-    nodeToInsertBefore = aRefChild;
+    // Since aRefChild is our child, it must be an nsIContent object.
+    nodeToInsertBefore = aRefChild ? aRefChild->AsContent() : nullptr;
   }
   if (nodeToInsertBefore == aNewChild) {
     // We're going to remove aNewChild from its parent, so use its next sibling
     // as the node to insert before.
     nodeToInsertBefore = nodeToInsertBefore->GetNextSibling();
   }
 
   Maybe<AutoTArray<nsCOMPtr<nsIContent>, 50> > fragChildren;
 
   // Remove the new child from the old parent if one exists
   nsIContent* newContent = aNewChild->AsContent();
   nsCOMPtr<nsINode> oldParent = newContent->GetParentNode();
   if (oldParent) {
-    int32_t removeIndex = oldParent->ComputeIndexOf(newContent);
-    if (removeIndex < 0) {
-      // newContent is anonymous.  We can't deal with this, so just bail
-      NS_ERROR("How come our flags didn't catch this?");
-      aError.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
-      return nullptr;
-    }
-
     // Hold a strong ref to nodeToInsertBefore across the removal of newContent
     nsCOMPtr<nsINode> kungFuDeathGrip = nodeToInsertBefore;
 
     // Removing a child can run script, via XBL destructors.
     nsMutationGuard guard;
 
     // Scope for the mutation batch and scriptblocker, so they go away
     // while kungFuDeathGrip is still alive.
     {
       mozAutoDocUpdate batch(newContent->GetComposedDoc(), true);
       nsAutoMutationBatch mb(oldParent, true, true);
-      oldParent->RemoveChildAt_Deprecated(removeIndex, true);
+      // ScriptBlocker ensures previous and next stay alive.
+      nsIContent* previous = aNewChild->GetPreviousSibling();
+      nsIContent* next = aNewChild->GetNextSibling();
+      oldParent->RemoveChildNode(aNewChild->AsContent(), true);
       if (nsAutoMutationBatch::GetCurrentBatch() == &mb) {
         mb.RemovalDone();
-        mb.SetPrevSibling(oldParent->GetChildAt_Deprecated(removeIndex - 1));
-        mb.SetNextSibling(oldParent->GetChildAt_Deprecated(removeIndex));
+        mb.SetPrevSibling(previous);
+        mb.SetNextSibling(next);
       }
     }
 
     // We expect one mutation (the removal) to have happened.
     if (guard.Mutated(1)) {
       // XBL destructors, yuck.
 
       // Verify that nodeToInsertBefore, if non-null, is still our child.  If
@@ -2072,17 +2070,17 @@ nsINode::ReplaceOrInsertBefore(bool aRep
             !IsAllowedAsChild(newContent, this, aReplace, aRefChild)) {
           aError.Throw(NS_ERROR_DOM_HIERARCHY_REQUEST_ERR);
           return nullptr;
         }
         // And recompute nodeToInsertBefore, just in case.
         if (aReplace) {
           nodeToInsertBefore = aRefChild->GetNextSibling();
         } else {
-          nodeToInsertBefore = aRefChild;
+          nodeToInsertBefore = aRefChild ? aRefChild->AsContent() : nullptr;
         }
       }
     }
   } else if (nodeType == DOCUMENT_FRAGMENT_NODE) {
     // Make sure to remove all the fragment's kids.  We need to do this before
     // we start inserting anything, so we will run out XBL destructors and
     // binding teardown (GOD, I HATE THESE THINGS) before we insert anything
     // into the DOM.
@@ -2107,18 +2105,18 @@ nsINode::ReplaceOrInsertBefore(bool aRep
     nsMutationGuard guard;
 
     // Scope for the mutation batch and scriptblocker, so they go away
     // while kungFuDeathGrip is still alive.
     {
       mozAutoDocUpdate batch(newContent->GetComposedDoc(), true);
       nsAutoMutationBatch mb(newContent, false, true);
 
-      for (uint32_t i = count; i > 0;) {
-        newContent->RemoveChildAt_Deprecated(--i, true);
+      while (newContent->HasChildren()) {
+        newContent->RemoveChildNode(newContent->GetLastChild(), true);
       }
     }
 
     // We expect |count| removals
     if (guard.Mutated(count)) {
       // XBL destructors, yuck.
 
       // Verify that nodeToInsertBefore, if non-null, is still our child.  If
@@ -2146,17 +2144,18 @@ nsINode::ReplaceOrInsertBefore(bool aRep
         aError.Throw(NS_ERROR_DOM_HIERARCHY_REQUEST_ERR);
         return nullptr;
       }
 
       // Recompute nodeToInsertBefore, just in case.
       if (aReplace) {
         nodeToInsertBefore = aRefChild->GetNextSibling();
       } else {
-        nodeToInsertBefore = aRefChild;
+        // If aRefChild has 'this' as a parent, it must be an nsIContent.
+        nodeToInsertBefore = aRefChild ? aRefChild->AsContent() : nullptr;
       }
 
       // And verify that newContent is still allowed as our child.  Sadly, we
       // need to reimplement the relevant part of IsAllowedAsChild() because
       // now our nodes are in an array and all.  If you change this code,
       // change the code there.
       if (IsDocument()) {
         bool sawElement = false;
@@ -2177,47 +2176,30 @@ nsINode::ReplaceOrInsertBefore(bool aRep
         }
       }
     }
   }
 
   mozAutoDocUpdate batch(GetComposedDoc(), true);
   nsAutoMutationBatch mb;
 
-  // Figure out which index we want to insert at.  Note that we use
-  // nodeToInsertBefore to determine this, because it's possible that
-  // aRefChild == aNewChild, in which case we just removed it from the
-  // parent list.
-  int32_t insPos;
-  if (nodeToInsertBefore) {
-    insPos = ComputeIndexOf(nodeToInsertBefore);
-    if (insPos < 0) {
-      // XXXbz How the heck would _that_ happen, exactly?
-      aError.Throw(NS_ERROR_DOM_NOT_FOUND_ERR);
-      return nullptr;
-    }
-  }
-  else {
-    insPos = GetChildCount();
-  }
-
   // If we're replacing and we haven't removed aRefChild yet, do so now
   if (aReplace && aRefChild != aNewChild) {
     mb.Init(this, true, true);
 
     // Since aRefChild is never null in the aReplace case, we know that at
     // this point nodeToInsertBefore is the next sibling of aRefChild.
     NS_ASSERTION(aRefChild->GetNextSibling() == nodeToInsertBefore,
                  "Unexpected nodeToInsertBefore");
 
-    // An since nodeToInsertBefore is at index insPos, we want to remove
-    // at the previous index.
-    NS_ASSERTION(insPos >= 1, "insPos too small");
-    RemoveChildAt_Deprecated(insPos-1, true);
-    --insPos;
+    nsIContent* toBeRemoved = nodeToInsertBefore ?
+      nodeToInsertBefore->GetPreviousSibling() : GetLastChild();
+    MOZ_ASSERT(toBeRemoved);
+
+    RemoveChildNode(toBeRemoved, true);
   }
 
   // Move new child over to our document if needed. Do this after removing
   // it from its parent so that AdoptNode doesn't fire DOMNodeRemoved
   // DocumentType nodes are the only nodes that can have a null
   // ownerDocument according to the DOM spec, and we need to allow
   // inserting them w/o calling AdoptNode().
   nsIDocument* doc = OwnerDoc();
@@ -2241,35 +2223,36 @@ nsINode::ReplaceOrInsertBefore(bool aRep
   nsINode* result = aReplace ? aRefChild : aNewChild;
   if (nodeType == DOCUMENT_FRAGMENT_NODE) {
     if (!aReplace) {
       mb.Init(this, true, true);
     }
     nsAutoMutationBatch* mutationBatch = nsAutoMutationBatch::GetCurrentBatch();
     if (mutationBatch) {
       mutationBatch->RemovalDone();
-      mutationBatch->SetPrevSibling(GetChildAt_Deprecated(insPos - 1));
-      mutationBatch->SetNextSibling(GetChildAt_Deprecated(insPos));
+      mutationBatch->SetPrevSibling(nodeToInsertBefore ?
+        nodeToInsertBefore->GetPreviousSibling() : GetLastChild());
+      mutationBatch->SetNextSibling(nodeToInsertBefore);
     }
 
     uint32_t count = fragChildren->Length();
     if (!count) {
       return result;
     }
 
-    bool appending = !IsDocument() && uint32_t(insPos) == GetChildCount();
+    bool appending = !IsDocument() && !nodeToInsertBefore;
     nsIContent* firstInsertedContent = fragChildren->ElementAt(0);
 
     // Iterate through the fragment's children, and insert them in the new
     // parent
-    for (uint32_t i = 0; i < count; ++i, ++insPos) {
+    for (uint32_t i = 0; i < count; ++i) {
       // XXXbz how come no reparenting here?  That seems odd...
       // Insert the child.
-      aError = InsertChildAt_Deprecated(fragChildren->ElementAt(i), insPos,
-                                        !appending);
+      aError = InsertChildBefore(fragChildren->ElementAt(i), nodeToInsertBefore,
+                                 !appending);
       if (aError.Failed()) {
         // Make sure to notify on any children that we did succeed to insert
         if (appending && i != 0) {
           nsNodeUtils::ContentAppended(static_cast<nsIContent*>(this),
                                        firstInsertedContent);
         }
         return nullptr;
       }
@@ -2295,23 +2278,23 @@ nsINode::ReplaceOrInsertBefore(bool aRep
   }
   else {
     // Not inserting a fragment but rather a single node.
 
     // FIXME https://bugzilla.mozilla.org/show_bug.cgi?id=544654
     //       We need to reparent here for nodes for which the parent of their
     //       wrapper is not the wrapper for their ownerDocument (XUL elements,
     //       form controls, ...). Also applies in the fragment code above.
-
     if (nsAutoMutationBatch::GetCurrentBatch() == &mb) {
       mb.RemovalDone();
-      mb.SetPrevSibling(GetChildAt_Deprecated(insPos - 1));
-      mb.SetNextSibling(GetChildAt_Deprecated(insPos));
+      mb.SetPrevSibling(nodeToInsertBefore ?
+                        nodeToInsertBefore->GetPreviousSibling() : GetLastChild());
+      mb.SetNextSibling(nodeToInsertBefore);
     }
-    aError = InsertChildAt_Deprecated(newContent, insPos, true);
+    aError = InsertChildBefore(newContent, nodeToInsertBefore, true);
     if (aError.Failed()) {
       return nullptr;
     }
   }
 
   return result;
 }
 
--- a/dom/base/nsINode.h
+++ b/dom/base/nsINode.h
@@ -817,39 +817,16 @@ public:
    * child of |this|.
    *
    * @throws NS_ERROR_OUT_OF_MEMORY in some cases (from BindToTree).
    */
   virtual nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                                      bool aNotify) = 0;
 
   /**
-   * Insert a content node at a particular index.  This method handles calling
-   * BindToTree on the child appropriately.
-   *
-   * @param aKid the content to insert
-   * @param aIndex the index it is being inserted at (the index it will have
-   *        after it is inserted)
-   * @param aNotify whether to notify the document (current document for
-   *        nsIContent, and |this| for nsIDocument) that the insert has
-   *        occurred
-   *
-   * @throws NS_ERROR_DOM_HIERARCHY_REQUEST_ERR if one attempts to have more
-   * than one element node as a child of a document.  Doing this will also
-   * assert -- you shouldn't be doing it!  Check with
-   * nsIDocument::GetRootElement() first if you're not sure.  Apart from this
-   * one constraint, this doesn't do any checking on whether aKid is a valid
-   * child of |this|.
-   *
-   * @throws NS_ERROR_OUT_OF_MEMORY in some cases (from BindToTree).
-   */
-  virtual nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                            bool aNotify) = 0;
-
-  /**
    * Append a content node to the end of the child list.  This method handles
    * calling BindToTree on the child appropriately.
    *
    * @param aKid the content to append
    * @param aNotify whether to notify the document (current document for
    *        nsIContent, and |this| for nsIDocument) that the append has
    *        occurred
    *
@@ -859,36 +836,20 @@ public:
    * nsIDocument::GetRootElement() first if you're not sure.  Apart from this
    * one constraint, this doesn't do any checking on whether aKid is a valid
    * child of |this|.
    *
    * @throws NS_ERROR_OUT_OF_MEMORY in some cases (from BindToTree).
    */
   nsresult AppendChildTo(nsIContent* aKid, bool aNotify)
   {
-    return InsertChildAt_Deprecated(aKid, GetChildCount(), aNotify);
+    return InsertChildBefore(aKid, nullptr, aNotify);
   }
 
   /**
-   * NOTE: this function is going to be removed soon (hopefully!) Don't use it
-   * in new code.
-   *
-   * Remove a child from this node.  This method handles calling UnbindFromTree
-   * on the child appropriately.
-   *
-   * @param aIndex the index of the child to remove
-   * @param aNotify whether to notify the document (current document for
-   *        nsIContent, and |this| for nsIDocument) that the remove has
-   *        occurred
-   *
-   * Note: If there is no child at aIndex, this method will simply do nothing.
-   */
-  virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) = 0;
-
-  /**
    * Remove a child from this node.  This method handles calling UnbindFromTree
    * on the child appropriately.
    *
    * @param aKid the content to remove
    * @param aNotify whether to notify the document (current document for
    *        nsIContent, and |this| for nsIDocument) that the remove has
    *        occurred
    */
--- a/dom/events/EventDispatcher.cpp
+++ b/dom/events/EventDispatcher.cpp
@@ -231,21 +231,23 @@ public:
   }
 
   void RetargetTouchTargets(WidgetTouchEvent* aTouchEvent, Event* aDOMEvent)
   {
     MOZ_ASSERT(HasRetargetTouchTargets());
     MOZ_ASSERT(aTouchEvent,
                "mRetargetedTouchTargets should be empty when dispatching non-touch events.");
 
-    WidgetTouchEvent::TouchArray& touches = aTouchEvent->mTouches;
-    MOZ_ASSERT(!touches.Length() ||
-               touches.Length() == mRetargetedTouchTargets->Length());
-    for (uint32_t i = 0; i < touches.Length(); ++i) {
-      touches[i]->mTarget = mRetargetedTouchTargets->ElementAt(i);
+    if (mRetargetedTouchTargets.isSome()) {
+      WidgetTouchEvent::TouchArray& touches = aTouchEvent->mTouches;
+      MOZ_ASSERT(!touches.Length() ||
+                 touches.Length() == mRetargetedTouchTargets->Length());
+      for (uint32_t i = 0; i < touches.Length(); ++i) {
+        touches[i]->mTarget = mRetargetedTouchTargets->ElementAt(i);
+      }
     }
 
     if (aDOMEvent) {
       // The number of touch objects in targetTouches list may change depending
       // on the retargeting.
       TouchEvent* touchDOMEvent = static_cast<TouchEvent*>(aDOMEvent);
       TouchList* targetTouches = touchDOMEvent->GetExistingTargetTouches();
       if (targetTouches) {
--- a/dom/html/HTMLFieldSetElement.cpp
+++ b/dom/html/HTMLFieldSetElement.cpp
@@ -166,74 +166,16 @@ HTMLFieldSetElement::InsertChildBefore(n
 
   if (firstLegendHasChanged) {
     NotifyElementsForFirstLegendChange(aNotify);
   }
 
   return rv;
 }
 
-nsresult
-HTMLFieldSetElement::InsertChildAt_Deprecated(nsIContent* aChild,
-                                              uint32_t aIndex,
-                                              bool aNotify)
-{
-  bool firstLegendHasChanged = false;
-
-  if (aChild->IsHTMLElement(nsGkAtoms::legend)) {
-    if (!mFirstLegend) {
-      mFirstLegend = aChild;
-      // We do not want to notify the first time mFirstElement is set.
-    } else {
-      // If mFirstLegend is before aIndex, we do not change it.
-      // Otherwise, mFirstLegend is now aChild.
-      if (int32_t(aIndex) <= ComputeIndexOf(mFirstLegend)) {
-        mFirstLegend = aChild;
-        firstLegendHasChanged = true;
-      }
-    }
-  }
-
-  nsresult rv =
-    nsGenericHTMLFormElement::InsertChildAt_Deprecated(aChild, aIndex, aNotify);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  if (firstLegendHasChanged) {
-    NotifyElementsForFirstLegendChange(aNotify);
-  }
-
-  return rv;
-}
-
-void
-HTMLFieldSetElement::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
-{
-  bool firstLegendHasChanged = false;
-
-  if (mFirstLegend && (GetChildAt_Deprecated(aIndex) == mFirstLegend)) {
-    // If we are removing the first legend we have to found another one.
-    nsIContent* child = mFirstLegend->GetNextSibling();
-    mFirstLegend = nullptr;
-    firstLegendHasChanged = true;
-
-    for (; child; child = child->GetNextSibling()) {
-      if (child->IsHTMLElement(nsGkAtoms::legend)) {
-        mFirstLegend = child;
-        break;
-      }
-    }
-  }
-
-  nsGenericHTMLFormElement::RemoveChildAt_Deprecated(aIndex, aNotify);
-
-  if (firstLegendHasChanged) {
-    NotifyElementsForFirstLegendChange(aNotify);
-  }
-}
-
 void
 HTMLFieldSetElement::RemoveChildNode(nsIContent* aKid, bool aNotify)
 {
   bool firstLegendHasChanged = false;
 
   if (mFirstLegend && aKid == mFirstLegend) {
     // If we are removing the first legend we have to found another one.
     nsIContent* child = mFirstLegend->GetNextSibling();
--- a/dom/html/HTMLFieldSetElement.h
+++ b/dom/html/HTMLFieldSetElement.h
@@ -37,19 +37,16 @@ public:
   virtual nsresult AfterSetAttr(int32_t aNameSpaceID, nsAtom* aName,
                                 const nsAttrValue* aValue,
                                 const nsAttrValue* aOldValue,
                                 nsIPrincipal* aSubjectPrincipal,
                                 bool aNotify) override;
 
   virtual nsresult InsertChildBefore(nsIContent* aChild, nsIContent* aBeforeThis,
                                      bool aNotify) override;
-  virtual nsresult InsertChildAt_Deprecated(nsIContent* aChild, uint32_t aIndex,
-                                            bool aNotify) override;
-  virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) override;
   virtual void RemoveChildNode(nsIContent* aKid, bool aNotify) override;
 
   // nsIFormControl
   NS_IMETHOD Reset() override;
   NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override;
   virtual bool IsDisabledForEvents(EventMessage aMessage) override;
   virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult,
                          bool aPreallocateChildren) const override;
--- a/dom/html/HTMLOptGroupElement.cpp
+++ b/dom/html/HTMLOptGroupElement.cpp
@@ -81,38 +81,16 @@ HTMLOptGroupElement::InsertChildBefore(n
   nsresult rv =
     nsGenericHTMLElement::InsertChildBefore(aKid, aBeforeThis, aNotify);
   if (NS_FAILED(rv)) {
     safeMutation.MutationFailed();
   }
   return rv;
 }
 
-nsresult
-HTMLOptGroupElement::InsertChildAt_Deprecated(nsIContent* aKid,
-                                              uint32_t aIndex,
-                                              bool aNotify)
-{
-  SafeOptionListMutation safeMutation(GetSelect(), this, aKid, aIndex, aNotify);
-  nsresult rv = nsGenericHTMLElement::InsertChildAt_Deprecated(aKid, aIndex,
-                                                               aNotify);
-  if (NS_FAILED(rv)) {
-    safeMutation.MutationFailed();
-  }
-  return rv;
-}
-
-void
-HTMLOptGroupElement::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
-{
-  SafeOptionListMutation safeMutation(GetSelect(), this, nullptr, aIndex,
-                                      aNotify);
-  nsGenericHTMLElement::RemoveChildAt_Deprecated(aIndex, aNotify);
-}
-
 void
 HTMLOptGroupElement::RemoveChildNode(nsIContent* aKid, bool aNotify)
 {
   SafeOptionListMutation safeMutation(GetSelect(), this, nullptr,
                                       ComputeIndexOf(aKid), aNotify);
   nsGenericHTMLElement::RemoveChildNode(aKid, aNotify);
 }
 
--- a/dom/html/HTMLOptGroupElement.h
+++ b/dom/html/HTMLOptGroupElement.h
@@ -23,19 +23,16 @@ public:
 
   // nsISupports
   NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLOptGroupElement,
                                        nsGenericHTMLElement)
 
   // nsINode
   virtual nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                                      bool aNotify) override;
-  virtual nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                            bool aNotify) override;
-  virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) override;
   virtual void RemoveChildNode(nsIContent* aKid, bool aNotify) override;
 
   // nsIContent
   void GetEventTargetParent(EventChainPreVisitor& aVisitor) override;
 
   virtual nsresult Clone(mozilla::dom::NodeInfo* aNodeInfo, nsINode** aResult,
                          bool aPreallocateChildren) const override;
 
--- a/dom/html/HTMLPictureElement.cpp
+++ b/dom/html/HTMLPictureElement.cpp
@@ -26,42 +26,16 @@ HTMLPictureElement::HTMLPictureElement(a
 
 HTMLPictureElement::~HTMLPictureElement()
 {
 }
 
 NS_IMPL_ELEMENT_CLONE(HTMLPictureElement)
 
 void
-HTMLPictureElement::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
-{
-  nsCOMPtr<nsIContent> child = GetChildAt_Deprecated(aIndex);
-
-  if (child && child->IsHTMLElement(nsGkAtoms::img)) {
-    HTMLImageElement* img = HTMLImageElement::FromNode(child);
-    if (img) {
-      img->PictureSourceRemoved(child->AsContent());
-    }
-  } else if (child && child->IsHTMLElement(nsGkAtoms::source)) {
-    // Find all img siblings after this <source> to notify them of its demise
-    nsCOMPtr<nsIContent> nextSibling = child->GetNextSibling();
-    if (nextSibling && nextSibling->GetParentNode() == this) {
-      do {
-        HTMLImageElement* img = HTMLImageElement::FromNode(nextSibling);
-        if (img) {
-          img->PictureSourceRemoved(child->AsContent());
-        }
-      } while ( (nextSibling = nextSibling->GetNextSibling()) );
-    }
-  }
-
-  nsGenericHTMLElement::RemoveChildAt_Deprecated(aIndex, aNotify);
-}
-
-void
 HTMLPictureElement::RemoveChildNode(nsIContent* aKid, bool aNotify)
 {
   if (aKid && aKid->IsHTMLElement(nsGkAtoms::img)) {
     HTMLImageElement* img = HTMLImageElement::FromNode(aKid);
     if (img) {
       img->PictureSourceRemoved(aKid->AsContent());
     }
   } else if (aKid && aKid->IsHTMLElement(nsGkAtoms::source)) {
@@ -106,45 +80,16 @@ HTMLPictureElement::InsertChildBefore(ns
         }
       } while ( (nextSibling = nextSibling->GetNextSibling()) );
     }
   }
 
   return rv;
 }
 
-nsresult
-HTMLPictureElement::InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex, bool aNotify)
-{
-  nsresult rv = nsGenericHTMLElement::InsertChildAt_Deprecated(aKid, aIndex, aNotify);
-
-  NS_ENSURE_SUCCESS(rv, rv);
-  NS_ENSURE_TRUE(aKid, rv);
-
-  if (aKid->IsHTMLElement(nsGkAtoms::img)) {
-    HTMLImageElement* img = HTMLImageElement::FromNode(aKid);
-    if (img) {
-      img->PictureSourceAdded(aKid->AsContent());
-    }
-  } else if (aKid->IsHTMLElement(nsGkAtoms::source)) {
-    // Find all img siblings after this <source> to notify them of its insertion
-    nsCOMPtr<nsIContent> nextSibling = aKid->GetNextSibling();
-    if (nextSibling && nextSibling->GetParentNode() == this) {
-      do {
-        HTMLImageElement* img = HTMLImageElement::FromNode(nextSibling);
-        if (img) {
-          img->PictureSourceAdded(aKid->AsContent());
-        }
-      } while ( (nextSibling = nextSibling->GetNextSibling()) );
-    }
-  }
-
-  return rv;
-}
-
 JSObject*
 HTMLPictureElement::WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
 {
   return HTMLPictureElementBinding::Wrap(aCx, this, aGivenProto);
 }
 
 } // namespace dom
 } // namespace mozilla
--- a/dom/html/HTMLPictureElement.h
+++ b/dom/html/HTMLPictureElement.h
@@ -18,22 +18,19 @@ class HTMLPictureElement final : public 
 public:
   explicit HTMLPictureElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo);
 
   // nsISupports
   NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLPictureElement, nsGenericHTMLElement)
 
   virtual nsresult Clone(mozilla::dom::NodeInfo* aNodeInfo, nsINode** aResult,
                          bool aPreallocateChildren) const override;
-  virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) override;
   virtual void RemoveChildNode(nsIContent* aKid, bool aNotify) override;
   virtual nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                                      bool aNotify) override;
-  virtual nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                            bool aNotify) override;
 
 protected:
   virtual ~HTMLPictureElement();
 
   virtual JSObject* WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
 };
 
 } // namespace dom
--- a/dom/html/HTMLSelectElement.cpp
+++ b/dom/html/HTMLSelectElement.cpp
@@ -212,38 +212,16 @@ HTMLSelectElement::InsertChildBefore(nsI
     nsGenericHTMLFormElementWithState::InsertChildBefore(aKid, aBeforeThis,
                                                          aNotify);
   if (NS_FAILED(rv)) {
     safeMutation.MutationFailed();
   }
   return rv;
 }
 
-nsresult
-HTMLSelectElement::InsertChildAt_Deprecated(nsIContent* aKid,
-                                            uint32_t aIndex,
-                                            bool aNotify)
-{
-  SafeOptionListMutation safeMutation(this, this, aKid, aIndex, aNotify);
-  nsresult rv =
-    nsGenericHTMLFormElementWithState::InsertChildAt_Deprecated(aKid, aIndex,
-                                                                aNotify);
-  if (NS_FAILED(rv)) {
-    safeMutation.MutationFailed();
-  }
-  return rv;
-}
-
-void
-HTMLSelectElement::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
-{
-  SafeOptionListMutation safeMutation(this, this, nullptr, aIndex, aNotify);
-  nsGenericHTMLFormElementWithState::RemoveChildAt_Deprecated(aIndex, aNotify);
-}
-
 void
 HTMLSelectElement::RemoveChildNode(nsIContent* aKid, bool aNotify)
 {
   SafeOptionListMutation safeMutation(this, this, nullptr,
                                       ComputeIndexOf(aKid), aNotify);
   nsGenericHTMLFormElementWithState::RemoveChildNode(aKid, aNotify);
 }
 
--- a/dom/html/HTMLSelectElement.h
+++ b/dom/html/HTMLSelectElement.h
@@ -242,19 +242,16 @@ public:
   // nsIContent
   void GetEventTargetParent(EventChainPreVisitor& aVisitor) override;
   virtual nsresult PostHandleEvent(
                      EventChainPostVisitor& aVisitor) override;
 
   virtual bool IsHTMLFocusable(bool aWithMouse, bool* aIsFocusable, int32_t* aTabIndex) override;
   virtual nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                                      bool aNotify) override;
-  virtual nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                            bool aNotify) override;
-  virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) override;
   virtual void RemoveChildNode(nsIContent* aKid, bool aNotify) override;
 
   // Overriden nsIFormControl methods
   NS_IMETHOD Reset() override;
   NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override;
   NS_IMETHOD SaveState() override;
   virtual bool RestoreState(PresState* aState) override;
   virtual bool IsDisabledForEvents(EventMessage aMessage) override;
--- a/dom/svg/SVGDocument.cpp
+++ b/dom/svg/SVGDocument.cpp
@@ -46,33 +46,16 @@ SVGDocument::InsertChildBefore(nsIConten
     // loaded by then.
     EnsureNonSVGUserAgentStyleSheetsLoaded();
   }
 
   return XMLDocument::InsertChildBefore(aKid, aBeforeThis, aNotify);
 }
 
 nsresult
-SVGDocument::InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                      bool aNotify)
-{
-  if (aKid->IsElement() && !aKid->IsSVGElement()) {
-    // We can get here when well formed XML with a non-SVG root element is
-    // served with the SVG MIME type, for example. In that case we need to load
-    // the non-SVG UA sheets or else we can get bugs like bug 1016145.  Note
-    // that we have to do this _before_ the
-    // XMLDocument::InsertChildAt_Deprecated call, since that can try to
-    // construct frames, and we need to have the sheets loaded by then.
-    EnsureNonSVGUserAgentStyleSheetsLoaded();
-  }
-
-  return XMLDocument::InsertChildAt_Deprecated(aKid, aIndex, aNotify);
-}
-
-nsresult
 SVGDocument::Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult,
                    bool aPreallocateChildren) const
 {
   NS_ASSERTION(aNodeInfo->NodeInfoManager() == mNodeInfoManager,
                "Can't import this document into another document!");
 
   RefPtr<SVGDocument> clone = new SVGDocument();
   nsresult rv = CloneDocHelper(clone.get(), aPreallocateChildren);
--- a/dom/svg/SVGDocument.h
+++ b/dom/svg/SVGDocument.h
@@ -30,18 +30,16 @@ public:
     : XMLDocument("image/svg+xml")
     , mHasLoadedNonSVGUserAgentStyleSheets(false)
   {
     mType = eSVG;
   }
 
   virtual nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                                      bool aNotify) override;
-  virtual nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                            bool aNotify) override;
   virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult,
                          bool aPreallocateChildren) const override;
 
   void SetCurrentContextPaint(const SVGContextPaint* aContextPaint)
   {
     mCurrentContextPaint = aContextPaint;
   }
 
--- a/dom/svg/SVGSwitchElement.cpp
+++ b/dom/svg/SVGSwitchElement.cpp
@@ -88,36 +88,16 @@ SVGSwitchElement::InsertChildBefore(nsIC
   nsresult rv =
     SVGSwitchElementBase::InsertChildBefore(aKid, aBeforeThis, aNotify);
   if (NS_SUCCEEDED(rv)) {
     MaybeInvalidate();
   }
   return rv;
 }
 
-nsresult
-SVGSwitchElement::InsertChildAt_Deprecated(nsIContent* aKid,
-                                           uint32_t aIndex,
-                                           bool aNotify)
-{
-  nsresult rv = SVGSwitchElementBase::InsertChildAt_Deprecated(aKid, aIndex,
-                                                               aNotify);
-  if (NS_SUCCEEDED(rv)) {
-    MaybeInvalidate();
-  }
-  return rv;
-}
-
-void
-SVGSwitchElement::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
-{
-  SVGSwitchElementBase::RemoveChildAt_Deprecated(aIndex, aNotify);
-  MaybeInvalidate();
-}
-
 void
 SVGSwitchElement::RemoveChildNode(nsIContent* aKid, bool aNotify)
 {
   SVGSwitchElementBase::RemoveChildNode(aKid, aNotify);
   MaybeInvalidate();
 }
 
 //----------------------------------------------------------------------
--- a/dom/svg/SVGSwitchElement.h
+++ b/dom/svg/SVGSwitchElement.h
@@ -37,19 +37,16 @@ public:
   // interfaces:
 
   NS_DECL_ISUPPORTS_INHERITED
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(SVGSwitchElement,
                                            SVGSwitchElementBase)
   // nsINode
   virtual nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                                      bool aNotify) override;
-  virtual nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                            bool aNotify) override;
-  virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) override;
   virtual void RemoveChildNode(nsIContent* aKid, bool aNotify) override;
 
   // nsIContent
   NS_IMETHOD_(bool) IsAttributeMapped(const nsAtom* aAttribute) const override;
 
   virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult,
                          bool aPreallocateChildren) const override;
 private:
--- a/dom/xul/nsXULElement.cpp
+++ b/dom/xul/nsXULElement.cpp
@@ -823,113 +823,16 @@ nsXULElement::UnbindFromTree(bool aDeep,
         }
         slots->mFrameLoaderOrOpener = nullptr;
     }
 
     nsStyledElement::UnbindFromTree(aDeep, aNullParent);
 }
 
 void
-nsXULElement::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
-{
-    nsCOMPtr<nsIContent> oldKid = mAttrsAndChildren.GetSafeChildAt(aIndex);
-    if (!oldKid) {
-      return;
-    }
-
-    // On the removal of a <treeitem>, <treechildren>, or <treecell> element,
-    // the possibility exists that some of the items in the removed subtree
-    // are selected (and therefore need to be deselected). We need to account for this.
-    nsCOMPtr<nsIDOMXULMultiSelectControlElement> controlElement;
-    nsCOMPtr<nsIListBoxObject> listBox;
-    bool fireSelectionHandler = false;
-
-    // -1 = do nothing, -2 = null out current item
-    // anything else = index to re-set as current
-    int32_t newCurrentIndex = -1;
-
-    if (oldKid->NodeInfo()->Equals(nsGkAtoms::listitem, kNameSpaceID_XUL)) {
-      // This is the nasty case. We have (potentially) a slew of selected items
-      // and cells going away.
-      // First, retrieve the tree.
-      // Check first whether this element IS the tree
-      controlElement = do_QueryObject(this);
-
-      // If it's not, look at our parent
-      if (!controlElement)
-        GetParentTree(getter_AddRefs(controlElement));
-      nsCOMPtr<nsIContent> controlContent(do_QueryInterface(controlElement));
-      RefPtr<nsXULElement> xulElement = FromNodeOrNull(controlContent);
-
-      if (xulElement) {
-        // Iterate over all of the items and find out if they are contained inside
-        // the removed subtree.
-        int32_t length;
-        controlElement->GetSelectedCount(&length);
-        for (int32_t i = 0; i < length; i++) {
-          nsCOMPtr<nsIDOMXULSelectControlItemElement> item;
-          controlElement->MultiGetSelectedItem(i, getter_AddRefs(item));
-          nsCOMPtr<nsINode> node = do_QueryInterface(item);
-          if (node == oldKid &&
-              NS_SUCCEEDED(controlElement->RemoveItemFromSelection(item))) {
-            length--;
-            i--;
-            fireSelectionHandler = true;
-          }
-        }
-
-        nsCOMPtr<nsIDOMXULSelectControlItemElement> curItem;
-        controlElement->GetCurrentItem(getter_AddRefs(curItem));
-        nsCOMPtr<nsIContent> curNode = do_QueryInterface(curItem);
-        if (curNode && nsContentUtils::ContentIsDescendantOf(curNode, oldKid)) {
-            // Current item going away
-            nsCOMPtr<nsIBoxObject> box = xulElement->GetBoxObject(IgnoreErrors());
-            listBox = do_QueryInterface(box);
-            if (listBox) {
-              listBox->GetIndexOfItem(oldKid->AsElement(), &newCurrentIndex);
-            }
-
-            // If any of this fails, we'll just set the current item to null
-            if (newCurrentIndex == -1)
-              newCurrentIndex = -2;
-        }
-      }
-    }
-
-    nsStyledElement::RemoveChildAt_Deprecated(aIndex, aNotify);
-
-    if (newCurrentIndex == -2) {
-        controlElement->SetCurrentItem(nullptr);
-    } else if (newCurrentIndex > -1) {
-        // Make sure the index is still valid
-        int32_t treeRows;
-        listBox->GetRowCount(&treeRows);
-        if (treeRows > 0) {
-            newCurrentIndex = std::min((treeRows - 1), newCurrentIndex);
-            RefPtr<Element> newCurrentItem;
-            listBox->GetItemAtIndex(newCurrentIndex, getter_AddRefs(newCurrentItem));
-            nsCOMPtr<nsIDOMXULSelectControlItemElement> xulCurItem = do_QueryInterface(newCurrentItem);
-            if (xulCurItem)
-                controlElement->SetCurrentItem(xulCurItem);
-        } else {
-            controlElement->SetCurrentItem(nullptr);
-        }
-    }
-
-    nsIDocument* doc;
-    if (fireSelectionHandler && (doc = GetComposedDoc())) {
-      nsContentUtils::DispatchTrustedEvent(doc,
-                                           static_cast<nsIContent*>(this),
-                                           NS_LITERAL_STRING("select"),
-                                           false,
-                                           true);
-    }
-}
-
-void
 nsXULElement::RemoveChildNode(nsIContent* aKid, bool aNotify)
 {
     // On the removal of a <treeitem>, <treechildren>, or <treecell> element,
     // the possibility exists that some of the items in the removed subtree
     // are selected (and therefore need to be deselected). We need to account for this.
     nsCOMPtr<nsIDOMXULMultiSelectControlElement> controlElement;
     nsCOMPtr<nsIListBoxObject> listBox;
     bool fireSelectionHandler = false;
--- a/dom/xul/nsXULElement.h
+++ b/dom/xul/nsXULElement.h
@@ -363,17 +363,16 @@ public:
     void GetEventTargetParent(mozilla::EventChainPreVisitor& aVisitor) override;
     virtual nsresult PreHandleEvent(
                        mozilla::EventChainVisitor& aVisitor) override;
     // nsIContent
     virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
                                 nsIContent* aBindingParent,
                                 bool aCompileEventHandlers) override;
     virtual void UnbindFromTree(bool aDeep, bool aNullParent) override;
-    virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) override;
     virtual void RemoveChildNode(nsIContent* aKid, bool aNotify) override;
     virtual void DestroyContent() override;
 
 #ifdef DEBUG
     virtual void List(FILE* out, int32_t aIndent) const override;
     virtual void DumpContent(FILE* out, int32_t aIndent,bool aDumpAll) const override
     {
     }
--- a/editor/libeditor/CSSEditUtils.cpp
+++ b/editor/libeditor/CSSEditUtils.cpp
@@ -551,21 +551,18 @@ CSSEditUtils::GetCSSInlinePropertyBase(n
 already_AddRefed<nsComputedDOMStyle>
 CSSEditUtils::GetComputedStyle(Element* aElement)
 {
   MOZ_ASSERT(aElement);
 
   nsIDocument* doc = aElement->GetComposedDoc();
   NS_ENSURE_TRUE(doc, nullptr);
 
-  nsIPresShell* presShell = doc->GetShell();
-  NS_ENSURE_TRUE(presShell, nullptr);
-
   RefPtr<nsComputedDOMStyle> style =
-    NS_NewComputedDOMStyle(aElement, EmptyString(), presShell);
+    NS_NewComputedDOMStyle(aElement, EmptyString(), doc);
 
   return style.forget();
 }
 
 // remove the CSS style "aProperty : aPropertyValue" and possibly remove the whole node
 // if it is a span and if its only attribute is _moz_dirty
 nsresult
 CSSEditUtils::RemoveCSSInlineStyle(nsINode& aNode,
--- a/gfx/ipc/GPUParent.cpp
+++ b/gfx/ipc/GPUParent.cpp
@@ -379,16 +379,19 @@ GPUParent::RecvGetDeviceStatus(GPUDevice
 }
 
 mozilla::ipc::IPCResult
 GPUParent::RecvSimulateDeviceReset(GPUDeviceData* aOut)
 {
 #if defined(XP_WIN)
   DeviceManagerDx::Get()->ForceDeviceReset(ForcedDeviceResetReason::COMPOSITOR_UPDATED);
   DeviceManagerDx::Get()->MaybeResetAndReacquireDevices();
+  if (gfxVars::UseWebRender()) {
+    wr::RenderThread::Get()->SimulateDeviceReset();
+  }
 #endif
   RecvGetDeviceStatus(aOut);
   return IPC_OK();
 }
 
 mozilla::ipc::IPCResult
 GPUParent::RecvNewContentCompositorManager(Endpoint<PCompositorManagerParent>&& aEndpoint)
 {
--- a/gfx/qcms/chain.c
+++ b/gfx/qcms/chain.c
@@ -967,17 +967,19 @@ static float* qcms_modular_transform_dat
 		    transform_fn != qcms_transform_module_clut_only &&
 		    transform_fn != qcms_transform_module_matrix &&
 		    transform_fn != qcms_transform_module_matrix_translate &&
 		    transform_fn != qcms_transform_module_LAB_to_XYZ &&
 		    transform_fn != qcms_transform_module_XYZ_to_LAB) {
 			assert(0 && "Unsupported transform module");
 			return NULL;
 		}
-		if (transform->grid_size <= 0) {
+		if (transform->grid_size <= 0 &&
+			(transform_fn == qcms_transform_module_clut ||
+			 transform_fn == qcms_transform_module_clut_only)) {
 			assert(0 && "Invalid transform");
 			return NULL;
 		}
                 transform->transform_module_fn(transform,src,dest,len);
                 dest = src;
                 src = new_src;
                 transform = transform->next_transform;
         }
--- a/gfx/thebes/gfxPlatform.cpp
+++ b/gfx/thebes/gfxPlatform.cpp
@@ -157,16 +157,17 @@ static bool gEverInitialized = false;
 const ContentDeviceData* gContentDeviceInitData = nullptr;
 
 static Mutex* gGfxPlatformPrefsLock = nullptr;
 
 // These two may point to the same profile
 static qcms_profile *gCMSOutputProfile = nullptr;
 static qcms_profile *gCMSsRGBProfile = nullptr;
 
+static bool gCMSRGBTransformFailed = false;
 static qcms_transform *gCMSRGBTransform = nullptr;
 static qcms_transform *gCMSInverseRGBTransform = nullptr;
 static qcms_transform *gCMSRGBATransform = nullptr;
 
 static bool gCMSInitialized = false;
 static eCMSMode gCMSMode = eCMSMode_Off;
 
 static void ShutdownCMS();
@@ -2083,27 +2084,30 @@ gfxPlatform::GetCMSsRGBProfile()
         gCMSsRGBProfile = qcms_profile_sRGB();
     }
     return gCMSsRGBProfile;
 }
 
 qcms_transform *
 gfxPlatform::GetCMSRGBTransform()
 {
-    if (!gCMSRGBTransform) {
+    if (!gCMSRGBTransform && !gCMSRGBTransformFailed) {
         qcms_profile *inProfile, *outProfile;
         outProfile = GetCMSOutputProfile();
         inProfile = GetCMSsRGBProfile();
 
         if (!inProfile || !outProfile)
             return nullptr;
 
         gCMSRGBTransform = qcms_transform_create(inProfile, QCMS_DATA_RGB_8,
                                               outProfile, QCMS_DATA_RGB_8,
                                              QCMS_INTENT_PERCEPTUAL);
+        if (!gCMSRGBTransform) {
+            gCMSRGBTransformFailed = true;
+        }
     }
 
     return gCMSRGBTransform;
 }
 
 qcms_transform *
 gfxPlatform::GetCMSInverseRGBTransform()
 {
--- a/gfx/webrender_bindings/RenderCompositorANGLE.cpp
+++ b/gfx/webrender_bindings/RenderCompositorANGLE.cpp
@@ -306,17 +306,17 @@ RenderCompositorANGLE::CreateSwapChainFo
     mCompositionDevice = dCompDevice;
   }
 }
 
 bool
 RenderCompositorANGLE::BeginFrame()
 {
   if (mDevice->GetDeviceRemovedReason() != S_OK) {
-    RenderThread::Get()->HandleDeviceReset("BeginFrame");
+    RenderThread::Get()->HandleDeviceReset("BeginFrame", /* aNotify */ true);
     return false;
   }
 
   mWidget->AsWindows()->UpdateCompositorWndSizeIfNecessary();
 
   if (!ResizeBufferIfNeeded()) {
     return false;
   }
@@ -324,17 +324,17 @@ RenderCompositorANGLE::BeginFrame()
   if (!mGL->MakeCurrent()) {
     gfxCriticalNote << "Failed to make render context current, can't draw.";
     return false;
   }
 
   if (mSyncObject) {
     if (!mSyncObject->Synchronize()) {
       // It's timeout or other error. Handle the device-reset here.
-      RenderThread::Get()->HandleDeviceReset("SyncObject");
+      RenderThread::Get()->HandleDeviceReset("SyncObject", /* aNotify */ true);
       return false;
     }
   }
   return true;
 }
 
 void
 RenderCompositorANGLE::EndFrame()
--- a/gfx/webrender_bindings/RenderThread.cpp
+++ b/gfx/webrender_bindings/RenderThread.cpp
@@ -547,27 +547,29 @@ RenderThread::GetRenderTexture(wr::WrExt
 
 void
 RenderThread::ProgramCacheTask()
 {
   ProgramCache();
 }
 
 void
-RenderThread::HandleDeviceReset(const char* aWhere)
+RenderThread::HandleDeviceReset(const char* aWhere, bool aNotify)
 {
   MOZ_ASSERT(IsInRenderThread());
 
   if (mHandlingDeviceReset) {
     return;
   }
 
-  gfxCriticalNote << "GFX: RenderThread detected a device reset in " << aWhere;
-  if (XRE_IsGPUProcess()) {
-    gfx::GPUParent::GetSingleton()->NotifyDeviceReset();
+  if (aNotify) {
+    gfxCriticalNote << "GFX: RenderThread detected a device reset in " << aWhere;
+    if (XRE_IsGPUProcess()) {
+      gfx::GPUParent::GetSingleton()->NotifyDeviceReset();
+    }
   }
 
   {
     MutexAutoLock lock(mRenderTextureMapLock);
     mRenderTexturesDeferred.clear();
     for (auto iter = mRenderTextures.Iter(); !iter.Done(); iter.Next()) {
       iter.UserData()->ClearCachedResources();
     }
@@ -579,16 +581,31 @@ RenderThread::HandleDeviceReset(const ch
 
 bool
 RenderThread::IsHandlingDeviceReset()
 {
   MOZ_ASSERT(IsInRenderThread());
   return mHandlingDeviceReset;
 }
 
+void
+RenderThread::SimulateDeviceReset()
+{
+  if (!IsInRenderThread()) {
+    Loop()->PostTask(NewRunnableMethod(
+      "RenderThread::SimulateDeviceReset",
+      this, &RenderThread::SimulateDeviceReset
+      ));
+  } else {
+    // When this function is called GPUProcessManager::SimulateDeviceReset() already
+    // triggers destroying all CompositorSessions before re-creating them.
+    HandleDeviceReset("SimulateDeviceReset", /* aNotify */ false);
+  }
+}
+
 WebRenderProgramCache*
 RenderThread::ProgramCache()
 {
   MOZ_ASSERT(IsInRenderThread());
 
   if (!mProgramCache) {
     mProgramCache = MakeUnique<WebRenderProgramCache>(ThreadPool().Raw());
   }
--- a/gfx/webrender_bindings/RenderThread.h
+++ b/gfx/webrender_bindings/RenderThread.h
@@ -163,19 +163,21 @@ public:
 
   /// Can be called from any thread.
   WebRenderThreadPool& ThreadPool() { return mThreadPool; }
 
   /// Can only be called from the render thread.
   WebRenderProgramCache* ProgramCache();
 
   /// Can only be called from the render thread.
-  void HandleDeviceReset(const char* aWhere);
+  void HandleDeviceReset(const char* aWhere, bool aNotify);
   /// Can only be called from the render thread.
   bool IsHandlingDeviceReset();
+  /// Can be called from any thread.
+  void SimulateDeviceReset();
 
   size_t RendererCount();
 
 private:
   explicit RenderThread(base::Thread* aThread);
 
   void DeferredRenderTextureHostDestroy();
   void ShutDownTask(layers::SynchronousTask* aTask);
--- a/js/src/gc/GC.cpp
+++ b/js/src/gc/GC.cpp
@@ -2963,17 +2963,17 @@ GCRuntime::updateZonePointersToRelocated
     for (CompartmentsInZoneIter comp(zone); !comp.done(); comp.next())
         callWeakPointerCompartmentCallbacks(comp);
 }
 
 /*
  * Update runtime-wide pointers to relocated cells.
  */
 void
-GCRuntime::updateRuntimePointersToRelocatedCells(AutoTraceSession& session)
+GCRuntime::updateRuntimePointersToRelocatedCells(AutoGCSession& session)
 {
     MOZ_ASSERT(!rt->isBeingDestroyed());
 
     gcstats::AutoPhase ap1(stats(), gcstats::PhaseKind::COMPACT_UPDATE);
     MovingTracer trc(rt);
 
     Compartment::fixupCrossCompartmentWrappersAfterMovingGC(&trc);
 
@@ -4257,18 +4257,17 @@ ShouldCollectZone(Zone* zone, JS::gcreas
     // set of atoms in use by the other collected zones at the end of the GC.
     if (zone->isAtomsZone())
         return TlsContext.get()->canCollectAtoms();
 
     return zone->canCollect();
 }
 
 bool
-GCRuntime::prepareZonesForCollection(JS::gcreason::Reason reason, bool* isFullOut,
-                                     AutoLockForExclusiveAccess& lock)
+GCRuntime::prepareZonesForCollection(JS::gcreason::Reason reason, bool* isFullOut)
 {
 #ifdef DEBUG
     /* Assert that zone state is as we expect */
     for (ZonesIter zone(rt, WithAtoms); !zone.done(); zone.next()) {
         MOZ_ASSERT(!zone->isCollecting());
         MOZ_ASSERT_IF(!zone->isAtomsZone(), !zone->compartments().empty());
         for (auto i : AllAllocKinds())
             MOZ_ASSERT(!zone->arenas.arenaListsToSweep(i));
@@ -4350,17 +4349,17 @@ RelazifyFunctionsForShrinkingGC(JSRuntim
     }
 }
 
 static void
 PurgeShapeTablesForShrinkingGC(JSRuntime* rt)
 {
     gcstats::AutoPhase ap(rt->gc.stats(), gcstats::PhaseKind::PURGE_SHAPE_TABLES);
     for (GCZonesIter zone(rt); !zone.done(); zone.next()) {
-        if (zone->keepShapeTables() || zone->isSelfHostingZone())
+        if (!CanRelocateZone(zone) || zone->keepShapeTables())
             continue;
         for (auto baseShape = zone->cellIter<BaseShape>(); !baseShape.done(); baseShape.next())
             baseShape->maybePurgeTable();
     }
 }
 
 static void
 UnmarkCollectedZones(GCParallelTask* task)
@@ -4379,31 +4378,29 @@ UnmarkCollectedZones(GCParallelTask* tas
 
 static void
 BufferGrayRoots(GCParallelTask* task)
 {
     task->runtime()->gc.bufferGrayRoots();
 }
 
 bool
-GCRuntime::beginMarkPhase(JS::gcreason::Reason reason, AutoTraceSession& session)
-{
-    MOZ_ASSERT(session.maybeLock.isSome());
-
+GCRuntime::beginMarkPhase(JS::gcreason::Reason reason, AutoGCSession& session)
+{
 #ifdef DEBUG
     if (fullCompartmentChecks)
         checkForCompartmentMismatches();
 #endif
 
-    if (!prepareZonesForCollection(reason, &isFull.ref(), session.lock()))
+    if (!prepareZonesForCollection(reason, &isFull.ref()))
         return false;
 
-    /* If we're not collecting the atoms zone we can release the lock now. */
-    if (!atomsZone->isCollecting())
-        session.maybeLock.reset();
+    /* * Check it's safe to access the atoms zone if we are collecting it. */
+    if (atomsZone->isCollecting())
+        session.maybeCheckAtomsAccess.emplace(rt);
 
     /*
      * In an incremental GC, clear the area free lists to ensure that subsequent
      * allocations refill them and end up marking new cells back. See
      * arenaAllocatedDuringGC().
      */
     for (GCZonesIter zone(rt); !zone.done(); zone.next())
         zone->arenas.clearFreeLists();
@@ -4661,17 +4658,17 @@ struct GCChunkHasher {
     }
 };
 
 class js::gc::MarkingValidator
 {
   public:
     explicit MarkingValidator(GCRuntime* gc);
     ~MarkingValidator();
-    void nonIncrementalMark(AutoTraceSession& session);
+    void nonIncrementalMark(AutoGCSession& session);
     void validate();
 
   private:
     GCRuntime* gc;
     bool initialized;
 
     typedef HashMap<Chunk*, ChunkBitmap*, GCChunkHasher, SystemAllocPolicy> BitmapMap;
     BitmapMap map;
@@ -4687,17 +4684,17 @@ js::gc::MarkingValidator::~MarkingValida
     if (!map.initialized())
         return;
 
     for (BitmapMap::Range r(map.all()); !r.empty(); r.popFront())
         js_delete(r.front().value());
 }
 
 void
-js::gc::MarkingValidator::nonIncrementalMark(AutoTraceSession& session)
+js::gc::MarkingValidator::nonIncrementalMark(AutoGCSession& session)
 {
     /*
      * Perform a non-incremental mark for all collecting zones and record
      * the results for later comparison.
      *
      * Currently this does not validate gray marking.
      */
 
@@ -4903,17 +4900,17 @@ js::gc::MarkingValidator::validate()
             }
         }
     }
 }
 
 #endif // JS_GC_ZEAL
 
 void
-GCRuntime::computeNonIncrementalMarkingForValidation(AutoTraceSession& session)
+GCRuntime::computeNonIncrementalMarkingForValidation(AutoGCSession& session)
 {
 #ifdef JS_GC_ZEAL
     MOZ_ASSERT(!markingValidator);
     if (isIncremental && hasZealMode(ZealMode::IncrementalMarkingValidator))
         markingValidator = js_new<MarkingValidator>(this);
     if (markingValidator)
         markingValidator->nonIncrementalMark(session);
 #endif
@@ -5879,17 +5876,17 @@ GCRuntime::endSweepingSweepGroup(FreeOp*
         queueZonesForBackgroundSweep(zones);
     else
         sweepBackgroundThings(zones, blocksToFreeAfterSweeping.ref());
 
     return Finished;
 }
 
 void
-GCRuntime::beginSweepPhase(JS::gcreason::Reason reason, AutoTraceSession& session)
+GCRuntime::beginSweepPhase(JS::gcreason::Reason reason, AutoGCSession& session)
 {
     /*
      * Sweep phase.
      *
      * Finalize as we sweep, outside of lock but with RuntimeHeapIsBusy()
      * true so that any attempt to allocate a GC-thing from a finalizer will
      * fail, rather than nest badly and leave the unmarked newborn to be swept.
      */
@@ -6754,17 +6751,17 @@ GCRuntime::beginCompactPhase()
     }
 
     MOZ_ASSERT(!relocatedArenasToRelease);
     startedCompacting = true;
 }
 
 IncrementalProgress
 GCRuntime::compactPhase(JS::gcreason::Reason reason, SliceBudget& sliceBudget,
-                        AutoTraceSession& session)
+                        AutoGCSession& session)
 {
     assertBackgroundSweepingFinished();
     MOZ_ASSERT(startedCompacting);
 
     gcstats::AutoPhase ap(stats(), gcstats::PhaseKind::COMPACT);
 
     // TODO: JSScripts can move. If the sampler interrupts the GC in the
     // middle of relocating an arena, invalid JSScript pointers may be
@@ -6865,47 +6862,44 @@ HeapStateToLabel(JS::HeapState heapState
       case JS::HeapState::CycleCollecting:
         MOZ_CRASH("Should never have an Idle or CC heap state when pushing GC profiling stack frames!");
     }
     MOZ_ASSERT_UNREACHABLE("Should have exhausted every JS::HeapState variant!");
     return nullptr;
 }
 
 /* Start a new heap session. */
-AutoTraceSession::AutoTraceSession(JSRuntime* rt, JS::HeapState heapState)
+AutoHeapSession::AutoHeapSession(JSRuntime* rt, JS::HeapState heapState)
   : runtime(rt),
     prevState(rt->heapState_),
     profilingStackFrame(rt->mainContextFromOwnThread(), HeapStateToLabel(heapState),
                         ProfilingStackFrame::Category::GCCC)
 {
     MOZ_ASSERT(CurrentThreadCanAccessRuntime(rt));
     MOZ_ASSERT(prevState == JS::HeapState::Idle);
     MOZ_ASSERT(heapState != JS::HeapState::Idle);
     MOZ_ASSERT_IF(heapState == JS::HeapState::MajorCollecting, rt->gc.nursery().isEmpty());
 
-    // Session always begins with lock held, see comment in class definition.
-    maybeLock.emplace(rt);
-
     rt->heapState_ = heapState;
 }
 
-AutoTraceSession::~AutoTraceSession()
+AutoHeapSession::~AutoHeapSession()
 {
     MOZ_ASSERT(JS::RuntimeHeapIsBusy());
     runtime->heapState_ = prevState;
 }
 
 JS_PUBLIC_API(JS::HeapState)
 JS::RuntimeHeapState()
 {
     return TlsContext.get()->runtime()->heapState();
 }
 
 GCRuntime::IncrementalResult
-GCRuntime::resetIncrementalGC(gc::AbortReason reason, AutoTraceSession& session)
+GCRuntime::resetIncrementalGC(gc::AbortReason reason, AutoGCSession& session)
 {
     MOZ_ASSERT(reason != gc::AbortReason::None);
 
     switch (incrementalState) {
       case State::NotActive:
           return IncrementalResult::Ok;
 
       case State::MarkRoots:
@@ -7087,25 +7081,18 @@ ShouldCleanUpEverything(JS::gcreason::Re
     // During shutdown, we must clean everything up, for the sake of leak
     // detection. When a runtime has no contexts, or we're doing a GC before a
     // shutdown CC, those are strong indications that we're shutting down.
     return IsShutdownGC(reason) || gckind == GC_SHRINK;
 }
 
 void
 GCRuntime::incrementalCollectSlice(SliceBudget& budget, JS::gcreason::Reason reason,
-                                   AutoTraceSession& session)
-{
-    /*
-     * Drop the exclusive access lock if we are in an incremental collection
-     * that does not touch the atoms zone.
-     */
-    if (isIncrementalGCInProgress() && !atomsZone->isCollecting())
-        session.maybeLock.reset();
-
+                                   AutoGCSession& session)
+{
     AutoDisableBarriers disableBarriers(rt);
 
     bool destroyingRuntime = (reason == JS::gcreason::DESTROY_RUNTIME);
 
     initialState = incrementalState;
 
 #ifdef JS_GC_ZEAL
     /*
@@ -7323,17 +7310,17 @@ CheckZoneIsScheduled(Zone* zone, JS::gcr
     }
     fflush(stderr);
     MOZ_CRASH("Zone not scheduled");
 #endif
 }
 
 GCRuntime::IncrementalResult
 GCRuntime::budgetIncrementalGC(bool nonincrementalByAPI, JS::gcreason::Reason reason,
-                               SliceBudget& budget, AutoTraceSession& session)
+                               SliceBudget& budget, AutoGCSession& session)
 {
     if (nonincrementalByAPI) {
         stats().nonincremental(gc::AbortReason::NonIncrementalRequested);
         budget.makeUnlimited();
 
         // Reset any in progress incremental GC if this was triggered via the
         // API. This isn't required for correctness, but sometimes during tests
         // the caller expects this GC to collect certain objects, and we need
@@ -7490,17 +7477,17 @@ GCRuntime::gcCycle(bool nonincrementalBy
 {
     // Note that GC callbacks are allowed to re-enter GC.
     AutoCallGCCallbacks callCallbacks(*this);
 
     gcstats::AutoGCSlice agc(stats(), scanZonesBeforeGC(), invocationKind, budget, reason);
 
     minorGC(reason, gcstats::PhaseKind::EVICT_NURSERY_FOR_MAJOR_GC);
 
-    AutoTraceSession session(rt, JS::HeapState::MajorCollecting);
+    AutoGCSession session(rt, JS::HeapState::MajorCollecting);
 
     majorGCTriggerReason = JS::gcreason::NO_REASON;
 
     number++;
     if (!isIncrementalGCInProgress())
         incMajorGcNumber();
 
     // It's ok if threads other than the main thread have suppressGC set, as
@@ -7523,18 +7510,19 @@ GCRuntime::gcCycle(bool nonincrementalBy
         // We must also wait for background allocation to finish so we can
         // avoid taking the GC lock when manipulating the chunks during the GC.
         // The background alloc task can run between slices, so we must wait
         // for it at the start of every slice.
         allocTask.cancelAndWait();
     }
 
     // We don't allow off-thread parsing to start while we're doing an
-    // incremental GC.
-    MOZ_ASSERT_IF(rt->activeGCInAtomsZone(), !rt->hasHelperThreadZones());
+    // incremental GC of the atoms zone.
+    if (rt->activeGCInAtomsZone())
+        session.maybeCheckAtomsAccess.emplace(rt);
 
     auto result = budgetIncrementalGC(nonincrementalByAPI, reason, budget, session);
 
     // If an ongoing incremental GC was reset, we may need to restart.
     if (result == IncrementalResult::Reset) {
         MOZ_ASSERT(!isIncrementalGCInProgress());
         return result;
     }
@@ -7968,22 +7956,16 @@ js::gc::FinishGC(JSContext* cx)
     if (JS::IsIncrementalGCInProgress(cx)) {
         JS::PrepareForIncrementalGC(cx);
         JS::FinishIncrementalGC(cx, JS::gcreason::API);
     }
 
     cx->nursery().waitBackgroundFreeEnd();
 }
 
-AutoPrepareForTracing::AutoPrepareForTracing(JSContext* cx)
-{
-    js::gc::FinishGC(cx);
-    session_.emplace(cx->runtime());
-}
-
 Realm*
 js::NewRealm(JSContext* cx, JSPrincipals* principals, const JS::RealmOptions& options)
 {
     JSRuntime* rt = cx->runtime();
     JS_AbortIfWrongThread(cx);
 
     UniquePtr<Zone> zoneHolder;
     UniquePtr<Compartment> compHolder;
--- a/js/src/gc/GCInternals.h
+++ b/js/src/gc/GCInternals.h
@@ -9,61 +9,113 @@
  */
 
 #ifndef gc_GCInternals_h
 #define gc_GCInternals_h
 
 #include "mozilla/ArrayUtils.h"
 #include "mozilla/Maybe.h"
 
+#include "gc/GC.h"
 #include "gc/RelocationOverlay.h"
 #include "gc/Zone.h"
 #include "vm/HelperThreads.h"
 #include "vm/Runtime.h"
 
 namespace js {
 namespace gc {
 
-/*
- * This class should be used by any code that needs to exclusive access to the
- * heap in order to trace through it...
- */
-class MOZ_RAII AutoTraceSession
+class MOZ_RAII AutoCheckCanAccessAtomsDuringGC
+{
+#ifdef DEBUG
+    JSRuntime* runtime;
+
+  public:
+    explicit AutoCheckCanAccessAtomsDuringGC(JSRuntime* rt)
+      : runtime(rt)
+    {
+        // Ensure we're only used from within the GC.
+        MOZ_ASSERT(JS::RuntimeHeapIsMajorCollecting());
+
+        // Ensure there is no off-thread parsing running.
+        MOZ_ASSERT(!rt->hasHelperThreadZones());
+
+        // Set up a check to assert if we try to start an off-thread parse.
+        runtime->setOffThreadParsingBlocked(true);
+    }
+    ~AutoCheckCanAccessAtomsDuringGC() {
+        runtime->setOffThreadParsingBlocked(false);
+    }
+#else
+  public:
+    explicit AutoCheckCanAccessAtomsDuringGC(JSRuntime* rt) {}
+#endif
+};
+
+// Abstract base class for exclusive heap access for tracing or GC.
+class MOZ_RAII AutoHeapSession
 {
   public:
-    explicit AutoTraceSession(JSRuntime* rt, JS::HeapState state = JS::HeapState::Tracing);
-    ~AutoTraceSession();
-
-    // Constructing an AutoTraceSession takes the exclusive access lock, but GC
-    // may release it during a trace session if we're not collecting the atoms
-    // zone.
-    mozilla::Maybe<AutoLockForExclusiveAccess> maybeLock;
-
-    AutoLockForExclusiveAccess& lock() {
-        return maybeLock.ref();
-    }
+    ~AutoHeapSession();
 
   protected:
-    JSRuntime* runtime;
+    AutoHeapSession(JSRuntime* rt, JS::HeapState state);
 
   private:
-    AutoTraceSession(const AutoTraceSession&) = delete;
-    void operator=(const AutoTraceSession&) = delete;
+    AutoHeapSession(const AutoHeapSession&) = delete;
+    void operator=(const AutoHeapSession&) = delete;
 
+    JSRuntime* runtime;
     JS::HeapState prevState;
     AutoGeckoProfilerEntry profilingStackFrame;
 };
 
-class MOZ_RAII AutoPrepareForTracing
+class MOZ_RAII AutoGCSession : public AutoHeapSession
 {
-    mozilla::Maybe<AutoTraceSession> session_;
+  public:
+    explicit AutoGCSession(JSRuntime* rt, JS::HeapState state)
+      : AutoHeapSession(rt, state)
+    {}
+
+    AutoCheckCanAccessAtomsDuringGC& checkAtomsAccess() {
+        return maybeCheckAtomsAccess.ref();
+    }
+
+    // During a GC we can check that it's not possible for anything else to be
+    // using the atoms zone.
+    mozilla::Maybe<AutoCheckCanAccessAtomsDuringGC> maybeCheckAtomsAccess;
+};
 
+class MOZ_RAII AutoTraceSession : public AutoLockForExclusiveAccess,
+                                  public AutoHeapSession
+{
   public:
-    explicit AutoPrepareForTracing(JSContext* cx);
-    AutoTraceSession& session() { return session_.ref(); }
+    explicit AutoTraceSession(JSRuntime* rt)
+      : AutoLockForExclusiveAccess(rt),
+        AutoHeapSession(rt, JS::HeapState::Tracing)
+    {}
+};
+
+struct MOZ_RAII AutoFinishGC
+{
+    explicit AutoFinishGC(JSContext* cx) {
+        FinishGC(cx);
+    }
+};
+
+// This class should be used by any code that needs to exclusive access to the
+// heap in order to trace through it.
+class MOZ_RAII AutoPrepareForTracing : private AutoFinishGC,
+                                       public AutoTraceSession
+{
+  public:
+    explicit AutoPrepareForTracing(JSContext* cx)
+      : AutoFinishGC(cx),
+        AutoTraceSession(cx->runtime())
+    {}
 };
 
 AbortReason
 IsIncrementalGCUnsafe(JSRuntime* rt);
 
 #ifdef JS_GC_ZEAL
 
 class MOZ_RAII AutoStopVerifyingBarriers
--- a/js/src/gc/GCMarker.h
+++ b/js/src/gc/GCMarker.h
@@ -9,16 +9,17 @@
 
 #include "ds/OrderedHashTable.h"
 #include "js/SliceBudget.h"
 #include "js/TracingAPI.h"
 #include "js/TypeDecls.h"
 
 namespace js {
 
+class AutoAccessAtomsZone;
 class WeakMapBase;
 
 static const size_t NON_INCREMENTAL_MARK_STACK_BASE_CAPACITY = 4096;
 static const size_t INCREMENTAL_MARK_STACK_BASE_CAPACITY = 32768;
 
 namespace gc {
 
 struct Cell;
@@ -276,17 +277,17 @@ class GCMarker : public JSTracer
         return isMarkStackEmpty() && !unmarkedArenaStackTop;
     }
 
     MOZ_MUST_USE bool drainMarkStack(SliceBudget& budget);
 
     void setGCMode(JSGCMode mode) { stack.setGCMode(mode); }
 
     size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf,
-                               const AutoLockForExclusiveAccess& lock) const;
+                               const AutoAccessAtomsZone& access) const;
 
 #ifdef DEBUG
 
     bool shouldCheckCompartments() { return strictCompartmentChecking; }
 
     JS::Zone* stackContainsCrossZonePointerTo(const gc::Cell* cell) const;
 
 #endif
--- a/js/src/gc/GCRuntime.h
+++ b/js/src/gc/GCRuntime.h
@@ -21,27 +21,29 @@
 #include "gc/Statistics.h"
 #include "gc/StoreBuffer.h"
 #include "js/GCAnnotations.h"
 #include "js/UniquePtr.h"
 #include "vm/AtomsTable.h"
 
 namespace js {
 
+class AutoAccessAtomsZone;
 class AutoLockGC;
 class AutoLockGCBgAlloc;
 class AutoLockHelperThreadState;
 class VerifyPreTracer;
 
 namespace gc {
 
 using BlackGrayEdgeVector = Vector<TenuredCell*, 0, SystemAllocPolicy>;
 using ZoneVector = Vector<JS::Zone*, 4, SystemAllocPolicy>;
 
 class AutoCallGCCallbacks;
+class AutoGCSession;
 class AutoRunParallelTask;
 class AutoTraceSession;
 class MarkingValidator;
 struct MovingTracer;
 enum class ShouldCheckThresholds;
 class SweepGroupsIter;
 class WeakCacheSweepIterator;
 
@@ -259,17 +261,17 @@ class GCRuntime
     void runDebugGC();
     void notifyRootsRemoved();
 
     enum TraceOrMarkRuntime {
         TraceRuntime,
         MarkRuntime
     };
     void traceRuntime(JSTracer* trc, AutoTraceSession& session);
-    void traceRuntimeForMinorGC(JSTracer* trc, AutoTraceSession& session);
+    void traceRuntimeForMinorGC(JSTracer* trc, AutoGCSession& session);
 
     void purgeRuntimeForMinorGC();
 
     void shrinkBuffers();
     void onOutOfMallocMemory();
     void onOutOfMallocMemory(const AutoLockGC& lock);
 
 #ifdef JS_GC_ZEAL
@@ -535,62 +537,60 @@ class GCRuntime
 
     friend class BackgroundAllocTask;
     bool wantBackgroundAllocation(const AutoLockGC& lock) const;
     void startBackgroundAllocTaskIfIdle();
 
     void requestMajorGC(JS::gcreason::Reason reason);
     SliceBudget defaultBudget(JS::gcreason::Reason reason, int64_t millis);
     IncrementalResult budgetIncrementalGC(bool nonincrementalByAPI, JS::gcreason::Reason reason,
-                                          SliceBudget& budget, AutoTraceSession& session);
-    IncrementalResult resetIncrementalGC(AbortReason reason, AutoTraceSession& session);
+                                          SliceBudget& budget, AutoGCSession& session);
+    IncrementalResult resetIncrementalGC(AbortReason reason, AutoGCSession& session);
 
     // Assert if the system state is such that we should never
     // receive a request to do GC work.
     void checkCanCallAPI();
 
     // Check if the system state is such that GC has been supressed
     // or otherwise delayed.
     MOZ_MUST_USE bool checkIfGCAllowedInCurrentState(JS::gcreason::Reason reason);
 
     gcstats::ZoneGCStats scanZonesBeforeGC();
     void collect(bool nonincrementalByAPI, SliceBudget budget, JS::gcreason::Reason reason) JS_HAZ_GC_CALL;
     MOZ_MUST_USE IncrementalResult gcCycle(bool nonincrementalByAPI, SliceBudget& budget,
                                            JS::gcreason::Reason reason);
     bool shouldRepeatForDeadZone(JS::gcreason::Reason reason);
     void incrementalCollectSlice(SliceBudget& budget, JS::gcreason::Reason reason,
-                                 AutoTraceSession& session);
+                                 AutoGCSession& session);
 
     friend class AutoCallGCCallbacks;
     void maybeCallGCCallback(JSGCStatus status);
 
     void pushZealSelectedObjects();
     void purgeRuntime();
-    MOZ_MUST_USE bool beginMarkPhase(JS::gcreason::Reason reason, AutoTraceSession& session);
-    bool prepareZonesForCollection(JS::gcreason::Reason reason, bool* isFullOut,
-                                   AutoLockForExclusiveAccess& lock);
+    MOZ_MUST_USE bool beginMarkPhase(JS::gcreason::Reason reason, AutoGCSession& session);
+    bool prepareZonesForCollection(JS::gcreason::Reason reason, bool* isFullOut);
     bool shouldPreserveJITCode(JS::Realm* realm, int64_t currentTime,
                                JS::gcreason::Reason reason, bool canAllocateMoreCode);
-    void traceRuntimeForMajorGC(JSTracer* trc, AutoTraceSession& session);
-    void traceRuntimeAtoms(JSTracer* trc, AutoLockForExclusiveAccess& lock);
+    void traceRuntimeForMajorGC(JSTracer* trc, AutoGCSession& session);
+    void traceRuntimeAtoms(JSTracer* trc, const AutoAccessAtomsZone& atomsAccess);
     void traceKeptAtoms(JSTracer* trc);
-    void traceRuntimeCommon(JSTracer* trc, TraceOrMarkRuntime traceOrMark,
-                            AutoTraceSession& session);
+    void traceRuntimeCommon(JSTracer* trc, TraceOrMarkRuntime traceOrMark);
     void maybeDoCycleCollection();
     void markCompartments();
     IncrementalProgress drainMarkStack(SliceBudget& sliceBudget, gcstats::PhaseKind phase);
     template <class CompartmentIterT> void markWeakReferences(gcstats::PhaseKind phase);
     void markWeakReferencesInCurrentGroup(gcstats::PhaseKind phase);
     template <class ZoneIterT, class CompartmentIterT> void markGrayReferences(gcstats::PhaseKind phase);
     void markBufferedGrayRoots(JS::Zone* zone);
     void markGrayReferencesInCurrentGroup(gcstats::PhaseKind phase);
     void markAllWeakReferences(gcstats::PhaseKind phase);
     void markAllGrayReferences(gcstats::PhaseKind phase);
 
-    void beginSweepPhase(JS::gcreason::Reason reason, AutoTraceSession& session);
+    void beginSweepPhase(JS::gcreason::Reason reason, AutoGCSession& session);
     void groupZonesForSweeping(JS::gcreason::Reason reason);
     MOZ_MUST_USE bool findInterZoneEdges();
     void getNextSweepGroup();
     IncrementalProgress endMarkingSweepGroup(FreeOp* fop, SliceBudget& budget);
     IncrementalProgress beginSweepingSweepGroup(FreeOp* fop, SliceBudget& budget);
 #ifdef JS_GC_ZEAL
     IncrementalProgress maybeYieldForSweepingZeal(FreeOp* fop, SliceBudget& budget);
 #endif
@@ -613,34 +613,34 @@ class GCRuntime
     void decommitAllWithoutUnlocking(const AutoLockGC& lock);
     void startDecommit();
     void queueZonesForBackgroundSweep(ZoneList& zones);
     void sweepBackgroundThings(ZoneList& zones, LifoAlloc& freeBlocks);
     void assertBackgroundSweepingFinished();
     bool shouldCompact();
     void beginCompactPhase();
     IncrementalProgress compactPhase(JS::gcreason::Reason reason, SliceBudget& sliceBudget,
-                                     AutoTraceSession& session);
+                                     AutoGCSession& session);
     void endCompactPhase();
     void sweepTypesAfterCompacting(Zone* zone);
     void sweepZoneAfterCompacting(Zone* zone);
     MOZ_MUST_USE bool relocateArenas(Zone* zone, JS::gcreason::Reason reason,
                                      Arena*& relocatedListOut, SliceBudget& sliceBudget);
     void updateTypeDescrObjects(MovingTracer* trc, Zone* zone);
     void updateCellPointers(Zone* zone, AllocKinds kinds, size_t bgTaskCount);
     void updateAllCellPointers(MovingTracer* trc, Zone* zone);
     void updateZonePointersToRelocatedCells(Zone* zone);
-    void updateRuntimePointersToRelocatedCells(AutoTraceSession& session);
+    void updateRuntimePointersToRelocatedCells(AutoGCSession& session);
     void protectAndHoldArenas(Arena* arenaList);
     void unprotectHeldRelocatedArenas();
     void releaseRelocatedArenas(Arena* arenaList);
     void releaseRelocatedArenasWithoutUnlocking(Arena* arenaList, const AutoLockGC& lock);
     void finishCollection();
 
-    void computeNonIncrementalMarkingForValidation(AutoTraceSession& session);
+    void computeNonIncrementalMarkingForValidation(AutoGCSession& session);
     void validateIncrementalMarking();
     void finishMarkingValidation();
 
 #ifdef DEBUG
     void checkForCompartmentMismatches();
 #endif
 
     void callFinalizeCallbacks(FreeOp* fop, JSFinalizeStatus status) const;
@@ -987,17 +987,16 @@ class GCRuntime
                  gcstats::PhaseKind phase = gcstats::PhaseKind::MINOR_GC) JS_HAZ_GC_CALL;
     void evictNursery(JS::gcreason::Reason reason = JS::gcreason::EVICT_NURSERY) {
         minorGC(reason, gcstats::PhaseKind::EVICT_NURSERY);
     }
     void freeAllLifoBlocksAfterMinorGC(LifoAlloc* lifo);
 
     friend class js::GCHelperState;
     friend class MarkingValidator;
-    friend class AutoTraceSession;
     friend class AutoEnterIteration;
 };
 
 /* Prevent compartments and zones from being collected during iteration. */
 class MOZ_RAII AutoEnterIteration {
     GCRuntime* gc;
 
   public:
--- a/js/src/gc/Marking.cpp
+++ b/js/src/gc/Marking.cpp
@@ -2558,17 +2558,17 @@ GCMarker::checkZone(void* p)
     MOZ_ASSERT(started);
     DebugOnly<Cell*> cell = static_cast<Cell*>(p);
     MOZ_ASSERT_IF(cell->isTenured(), cell->asTenured().zone()->isCollecting());
 }
 #endif
 
 size_t
 GCMarker::sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf,
-                              const AutoLockForExclusiveAccess& lock) const
+                              const AutoAccessAtomsZone& access) const
 {
     size_t size = stack.sizeOfExcludingThis(mallocSizeOf);
     for (ZonesIter zone(runtime(), WithAtoms); !zone.done(); zone.next())
         size += zone->gcGrayRoots().sizeOfExcludingThis(mallocSizeOf);
     return size;
 }
 
 #ifdef DEBUG
--- a/js/src/gc/Nursery.cpp
+++ b/js/src/gc/Nursery.cpp
@@ -767,17 +767,17 @@ js::Nursery::collect(JS::gcreason::Reaso
                 if (group->canPreTenure(sweep)) {
                     group->setShouldPreTenure(sweep, cx);
                     pretenureCount++;
                 }
             }
         }
     }
 
-    mozilla::Maybe<AutoTraceSession> session;
+    mozilla::Maybe<AutoGCSession> session;
     for (ZonesIter zone(rt, SkipAtoms); !zone.done(); zone.next()) {
         if (shouldPretenure && zone->allocNurseryStrings && zone->tenuredStrings >= 30 * 1000) {
             if (!session.isSome())
                 session.emplace(rt, JS::HeapState::MinorCollecting);
             CancelOffThreadIonCompile(zone);
             bool preserving = zone->isPreservingCode();
             zone->setPreservingCode(false);
             zone->discardJitCode(rt->defaultFreeOp());
@@ -841,17 +841,17 @@ js::Nursery::collect(JS::gcreason::Reaso
         }
     }
 }
 
 void
 js::Nursery::doCollection(JS::gcreason::Reason reason, TenureCountCache& tenureCounts)
 {
     JSRuntime* rt = runtime();
-    AutoTraceSession session(rt, JS::HeapState::MinorCollecting);
+    AutoGCSession session(rt, JS::HeapState::MinorCollecting);
     AutoSetThreadIsPerformingGC performingGC;
     AutoStopVerifyingBarriers av(rt, false);
     AutoDisableProxyCheck disableStrictProxyChecking;
     mozilla::DebugOnly<AutoEnterOOMUnsafeRegion> oomUnsafeRegion;
 
     const size_t initialNurseryCapacity = spaceToEnd(maxChunkCount());
     const size_t initialNurseryUsedBytes = initialNurseryCapacity - freeSpace();
 
--- a/js/src/gc/PublicIterators.cpp
+++ b/js/src/gc/PublicIterators.cpp
@@ -46,33 +46,33 @@ IterateRealmsArenasCellsUnbarriered(JSCo
 
 void
 js::IterateHeapUnbarriered(JSContext* cx, void* data,
                            IterateZoneCallback zoneCallback,
                            JS::IterateRealmCallback realmCallback,
                            IterateArenaCallback arenaCallback,
                            IterateCellCallback cellCallback)
 {
-    AutoPrepareForTracing prop(cx);
+    AutoPrepareForTracing prep(cx);
 
     for (ZonesIter zone(cx->runtime(), WithAtoms); !zone.done(); zone.next()) {
         (*zoneCallback)(cx->runtime(), data, zone);
         IterateRealmsArenasCellsUnbarriered(cx, zone, data,
                                             realmCallback, arenaCallback, cellCallback);
     }
 }
 
 void
 js::IterateHeapUnbarrieredForZone(JSContext* cx, Zone* zone, void* data,
                                   IterateZoneCallback zoneCallback,
                                   JS::IterateRealmCallback realmCallback,
                                   IterateArenaCallback arenaCallback,
                                   IterateCellCallback cellCallback)
 {
-    AutoPrepareForTracing prop(cx);
+    AutoPrepareForTracing prep(cx);
 
     (*zoneCallback)(cx->runtime(), data, zone);
     IterateRealmsArenasCellsUnbarriered(cx, zone, data,
                                         realmCallback, arenaCallback, cellCallback);
 }
 
 void
 js::IterateChunks(JSContext* cx, void* data, IterateChunkCallback chunkCallback)
--- a/js/src/gc/RootMarking.cpp
+++ b/js/src/gc/RootMarking.cpp
@@ -257,100 +257,99 @@ PropertyDescriptor::trace(JSTracer* trc)
     if ((attrs & JSPROP_SETTER) && setter) {
         JSObject* tmp = JS_FUNC_TO_DATA_PTR(JSObject*, setter);
         TraceRoot(trc, &tmp, "Descriptor::set");
         setter = JS_DATA_TO_FUNC_PTR(JSSetterOp, tmp);
     }
 }
 
 void
-js::gc::GCRuntime::traceRuntimeForMajorGC(JSTracer* trc, AutoTraceSession& session)
+js::gc::GCRuntime::traceRuntimeForMajorGC(JSTracer* trc, AutoGCSession& session)
 {
     MOZ_ASSERT(!TlsContext.get()->suppressGC);
-    MOZ_ASSERT_IF(atomsZone->isCollecting(), session.maybeLock.isSome());
 
     // FinishRoots will have asserted that every root that we do not expect
     // is gone, so we can simply skip traceRuntime here.
     if (rt->isBeingDestroyed())
         return;
 
     gcstats::AutoPhase ap(stats(), gcstats::PhaseKind::MARK_ROOTS);
     if (atomsZone->isCollecting())
-        traceRuntimeAtoms(trc, session.lock());
+        traceRuntimeAtoms(trc, session.checkAtomsAccess());
     traceKeptAtoms(trc);
     Compartment::traceIncomingCrossCompartmentEdgesForZoneGC(trc);
-    traceRuntimeCommon(trc, MarkRuntime, session);
+    traceRuntimeCommon(trc, MarkRuntime);
 }
 
 void
-js::gc::GCRuntime::traceRuntimeForMinorGC(JSTracer* trc, AutoTraceSession& session)
+js::gc::GCRuntime::traceRuntimeForMinorGC(JSTracer* trc, AutoGCSession& session)
 {
     MOZ_ASSERT(!TlsContext.get()->suppressGC);
 
     // Note that we *must* trace the runtime during the SHUTDOWN_GC's minor GC
     // despite having called FinishRoots already. This is because FinishRoots
     // does not clear the crossCompartmentWrapper map. It cannot do this
     // because Proxy's trace for CrossCompartmentWrappers asserts presence in
     // the map. And we can reach its trace function despite having finished the
     // roots via the edges stored by the pre-barrier verifier when we finish
     // the verifier for the last time.
     gcstats::AutoPhase ap(stats(), gcstats::PhaseKind::MARK_ROOTS);
 
     jit::JitRuntime::TraceJitcodeGlobalTableForMinorGC(trc);
 
-    traceRuntimeCommon(trc, TraceRuntime, session);
+    traceRuntimeCommon(trc, TraceRuntime);
 }
 
 void
 js::TraceRuntime(JSTracer* trc)
 {
     MOZ_ASSERT(!trc->isMarkingTracer());
 
     JSRuntime* rt = trc->runtime();
     rt->gc.evictNursery();
     AutoPrepareForTracing prep(rt->mainContextFromOwnThread());
     gcstats::AutoPhase ap(rt->gc.stats(), gcstats::PhaseKind::TRACE_HEAP);
-    rt->gc.traceRuntime(trc, prep.session());
+    rt->gc.traceRuntime(trc, prep);
 }
 
 void
 js::gc::GCRuntime::traceRuntime(JSTracer* trc, AutoTraceSession& session)
 {
     MOZ_ASSERT(!rt->isBeingDestroyed());
 
     gcstats::AutoPhase ap(stats(), gcstats::PhaseKind::MARK_ROOTS);
-    traceRuntimeAtoms(trc, session.lock());
-    traceRuntimeCommon(trc, TraceRuntime, session);
+
+    traceRuntimeAtoms(trc, session);
+    traceRuntimeCommon(trc, TraceRuntime);
 }
 
 void
-js::gc::GCRuntime::traceRuntimeAtoms(JSTracer* trc, AutoLockForExclusiveAccess& lock)
+js::gc::GCRuntime::traceRuntimeAtoms(JSTracer* trc, const AutoAccessAtomsZone& access)
 {
     gcstats::AutoPhase ap(stats(), gcstats::PhaseKind::MARK_RUNTIME_DATA);
     TracePermanentAtoms(trc);
-    TraceAtoms(trc, lock);
+    TraceAtoms(trc, access);
     TraceWellKnownSymbols(trc);
-    jit::JitRuntime::Trace(trc, lock);
+    jit::JitRuntime::Trace(trc, access);
 }
 
 void
 js::gc::GCRuntime::traceKeptAtoms(JSTracer* trc)
 {
     // We don't have exact rooting information for atoms while parsing. When
     // this is happeninng we set a flag on the zone and trace all atoms in the
     // zone's cache.
     for (GCZonesIter zone(trc->runtime()); !zone.done(); zone.next()) {
         if (zone->hasKeptAtoms())
             zone->traceAtomCache(trc);
     }
 }
 
 void
-js::gc::GCRuntime::traceRuntimeCommon(JSTracer* trc, TraceOrMarkRuntime traceOrMark,
-                                      AutoTraceSession& session)
+js::gc::GCRuntime::traceRuntimeCommon(JSTracer* trc, TraceOrMarkRuntime traceOrMark)
 {
     {
         gcstats::AutoPhase ap(stats(), gcstats::PhaseKind::MARK_STACK);
 
         JSContext* cx = rt->mainContextFromOwnThread();
 
         // Trace active interpreter and JIT stack roots.
         TraceInterpreterActivations(cx, trc);
@@ -381,17 +380,17 @@ js::gc::GCRuntime::traceRuntimeCommon(JS
     rt->mainContextFromOwnThread()->trace(trc);
 
     // Trace all realm roots, but not the realm itself; it is traced via the
     // parent pointer if traceRoots actually traces anything.
     for (RealmsIter r(rt); !r.done(); r.next())
         r->traceRoots(trc, traceOrMark);
 
     // Trace helper thread roots.
-    HelperThreadState().trace(trc, session);
+    HelperThreadState().trace(trc);
 
     // Trace the embedding's black and gray roots.
     if (!JS::RuntimeHeapIsMinorCollecting()) {
         gcstats::AutoPhase ap(stats(), gcstats::PhaseKind::MARK_EMBEDDING);
 
         /*
          * The embedding can register additional roots here.
          *
@@ -445,19 +444,19 @@ js::gc::GCRuntime::finishRoots()
 
 #ifdef DEBUG
     // The nsWrapperCache may not be empty before our shutdown GC, so we have
     // to skip that table when verifying that we are fully unrooted.
     auto prior = grayRootTracer;
     grayRootTracer = Callback<JSTraceDataOp>(nullptr, nullptr);
 
     AssertNoRootsTracer trc(rt, TraceWeakMapKeysValues);
-    AutoPrepareForTracing prep(TlsContext.get());
+    AutoTraceSession session(rt);
     gcstats::AutoPhase ap(rt->gc.stats(), gcstats::PhaseKind::TRACE_HEAP);
-    traceRuntime(&trc, prep.session());
+    traceRuntime(&trc, session);
 
     // Restore the wrapper tracing so that we leak instead of leaving dangling
     // pointers.
     grayRootTracer = prior;
 #endif // DEBUG
 }
 
 // Append traced things to a buffer on the zone for use later in the GC.
--- a/js/src/gc/Verifier.cpp
+++ b/js/src/gc/Verifier.cpp
@@ -216,17 +216,17 @@ gc::GCRuntime::startVerifyPreBarriers()
         goto oom;
 
     /* Create the root node. */
     trc->curnode = MakeNode(trc, nullptr, JS::TraceKind(0));
 
     incrementalState = State::MarkRoots;
 
     /* Make all the roots be edges emanating from the root node. */
-    traceRuntime(trc, prep.session());
+    traceRuntime(trc, prep);
 
     VerifyNode* node;
     node = trc->curnode;
     if (trc->edgeptr == trc->term)
         goto oom;
 
     /* For each edge, make a node for it if one doesn't already exist. */
     while ((char*)node < trc->edgeptr) {
@@ -650,17 +650,17 @@ CheckHeapTracer::check(AutoTraceSession&
     if (failures)
         fprintf(stderr, "Heap check: %zu failure(s)\n", failures);
     MOZ_RELEASE_ASSERT(failures == 0);
 }
 
 void
 js::gc::CheckHeapAfterGC(JSRuntime* rt)
 {
-    AutoTraceSession session(rt, JS::HeapState::Tracing);
+    AutoTraceSession session(rt);
     CheckHeapTracer tracer(rt);
     if (tracer.init())
         tracer.check(session);
 }
 
 #endif /* JSGC_HASH_TABLE_CHECKS */
 
 #if defined(JS_GC_ZEAL) || defined(DEBUG)
@@ -719,17 +719,17 @@ JS_FRIEND_API(bool)
 js::CheckGrayMarkingState(JSRuntime* rt)
 {
     MOZ_ASSERT(!JS::RuntimeHeapIsCollecting());
     MOZ_ASSERT(!rt->gc.isIncrementalGCInProgress());
     if (!rt->gc.areGrayBitsValid())
         return true;
 
     gcstats::AutoPhase ap(rt->gc.stats(), gcstats::PhaseKind::TRACE_HEAP);
-    AutoTraceSession session(rt, JS::HeapState::Tracing);
+    AutoTraceSession session(rt);
     CheckGrayMarkingTracer tracer(rt);
     if (!tracer.init())
         return true; // Ignore failure
 
     return tracer.check(session);
 }
 
 #endif // defined(JS_GC_ZEAL) || defined(DEBUG)
--- a/js/src/gc/Zone.cpp
+++ b/js/src/gc/Zone.cpp
@@ -56,22 +56,22 @@ JS::Zone::Zone(JSRuntime* rt)
     allocNurseryStrings(this, true),
     propertyTree_(this, this),
     baseShapes_(this, this),
     initialShapes_(this, this),
     nurseryShapes_(this),
     data(this, nullptr),
     isSystem(this, false),
 #ifdef DEBUG
-    gcLastSweepGroupIndex(this, 0),
+    gcLastSweepGroupIndex(0),
 #endif
     jitZone_(this, nullptr),
     gcScheduled_(false),
     gcScheduledSaved_(false),
-    gcPreserveCode_(this, false),
+    gcPreserveCode_(false),
     keepShapeTables_(this, false),
     listNext_(NotOnList)
 {
     /* Ensure that there are no vtables to mess us up here. */
     MOZ_ASSERT(reinterpret_cast<JS::shadow::Zone*>(this) ==
                static_cast<JS::shadow::Zone*>(this));
 
     AutoLockGC lock(rt);
--- a/js/src/gc/Zone.h
+++ b/js/src/gc/Zone.h
@@ -578,17 +578,17 @@ class Zone : public JS::shadow::Zone,
     void fixupAfterMovingGC();
 
     // Per-zone data for use by an embedder.
     js::ZoneData<void*> data;
 
     js::ZoneData<bool> isSystem;
 
 #ifdef DEBUG
-    js::ZoneData<unsigned> gcLastSweepGroupIndex;
+    js::MainThreadData<unsigned> gcLastSweepGroupIndex;
 #endif
 
     static js::HashNumber UniqueIdToHash(uint64_t uid) {
         return mozilla::HashGeneric(uid);
     }
 
     // Creates a HashNumber based on getUniqueId. Returns false on OOM.
     MOZ_MUST_USE bool getHashCode(js::gc::Cell* cell, js::HashNumber* hashp) {
@@ -732,21 +732,21 @@ class Zone : public JS::shadow::Zone,
     // Non-zero if the storage underlying any typed object in this zone might
     // be detached. This is stored in Zone because IC stubs bake in a pointer
     // to this field and Baseline IC code is shared across realms within a
     // Zone. Furthermore, it's not entirely clear if this flag is ever set to
     // a non-zero value since bug 1458011.
     uint32_t detachedTypedObjects = 0;
 
   private:
-    js::ZoneData<js::jit::JitZone*> jitZone_;
+    js::ZoneOrGCTaskData<js::jit::JitZone*> jitZone_;
 
     js::MainThreadData<bool> gcScheduled_;
     js::MainThreadData<bool> gcScheduledSaved_;
-    js::ZoneData<bool> gcPreserveCode_;
+    js::MainThreadData<bool> gcPreserveCode_;
     js::ZoneData<bool> keepShapeTables_;
 
     // Allow zones to be linked into a list
     friend class js::gc::ZoneList;
     static Zone * const NotOnList;
     js::MainThreadOrGCTaskData<Zone*> listNext_;
     bool isOnList() const;
     Zone* nextZone() const;
--- a/js/src/jit/Ion.cpp
+++ b/js/src/jit/Ion.cpp
@@ -577,26 +577,26 @@ jit::LazyLinkTopActivation(JSContext* cx
 
     MOZ_ASSERT(calleeScript->hasBaselineScript());
     MOZ_ASSERT(calleeScript->jitCodeRaw());
 
     return calleeScript->jitCodeRaw();
 }
 
 /* static */ void
-JitRuntime::Trace(JSTracer* trc, AutoLockForExclusiveAccess& lock)
+JitRuntime::Trace(JSTracer* trc, const AutoAccessAtomsZone& access)
 {
     MOZ_ASSERT(!JS::RuntimeHeapIsMinorCollecting());
 
     // Shared stubs are allocated in the atoms zone, so do not iterate
     // them after the atoms heap after it has been "finished."
     if (trc->runtime()->atomsAreFinished())
         return;
 
-    Zone* zone = trc->runtime()->atomsZone(lock);
+    Zone* zone = trc->runtime()->atomsZone(access);
     for (auto i = zone->cellIter<JitCode>(); !i.done(); i.next()) {
         JitCode* code = i;
         TraceRoot(trc, &code, "wrapper");
     }
 }
 
 /* static */ void
 JitRuntime::TraceJitcodeGlobalTableForMinorGC(JSTracer* trc)
--- a/js/src/jit/JitRealm.h
+++ b/js/src/jit/JitRealm.h
@@ -188,17 +188,17 @@ class JitRuntime
         return TrampolinePtr(trampolineCode_->raw() + offset);
     }
 
   public:
     JitRuntime();
     ~JitRuntime();
     MOZ_MUST_USE bool initialize(JSContext* cx, js::AutoLockForExclusiveAccess& lock);
 
-    static void Trace(JSTracer* trc, js::AutoLockForExclusiveAccess& lock);
+    static void Trace(JSTracer* trc, const js::AutoAccessAtomsZone& access);
     static void TraceJitcodeGlobalTableForMinorGC(JSTracer* trc);
     static MOZ_MUST_USE bool MarkJitcodeGlobalTableIteratively(GCMarker* marker);
     static void SweepJitcodeGlobalTable(JSRuntime* rt);
 
     ExecutableAllocator& execAlloc() {
         return execAlloc_.ref();
     }
 
--- a/js/src/jsfriendapi.cpp
+++ b/js/src/jsfriendapi.cpp
@@ -1247,19 +1247,19 @@ js::DumpHeap(JSContext* cx, FILE* fp, js
     if (nurseryBehaviour == js::CollectNurseryBeforeDump)
         cx->runtime()->gc.evictNursery(JS::gcreason::API);
 
     DumpHeapTracer dtrc(fp, cx);
 
     fprintf(dtrc.output, "# Roots.\n");
     {
         JSRuntime* rt = cx->runtime();
-        js::gc::AutoPrepareForTracing prep(cx);
+        js::gc::AutoTraceSession session(rt);
         gcstats::AutoPhase ap(rt->gc.stats(), gcstats::PhaseKind::TRACE_HEAP);
-        rt->gc.traceRuntime(&dtrc, prep.session());
+        rt->gc.traceRuntime(&dtrc, session);
     }
 
     fprintf(dtrc.output, "# Weak maps.\n");
     WeakMapBase::traceAllMappings(&dtrc);
 
     fprintf(dtrc.output, "==========\n");
 
     dtrc.prefix = "> ";
--- a/js/src/threading/ProtectedData.cpp
+++ b/js/src/threading/ProtectedData.cpp
@@ -60,27 +60,29 @@ template class CheckMainThread<AllowedHe
 
 template <AllowedHelperThread Helper>
 void
 CheckZone<Helper>::check() const
 {
     if (OnHelperThread<Helper>())
         return;
 
-    JSContext* cx = TlsContext.get();
+    JSRuntime* runtime = TlsContext.get()->runtime();
     if (zone->isAtomsZone()) {
-        // The atoms zone is protected by the exclusive access lock.
-        MOZ_ASSERT(cx->runtime()->currentThreadHasExclusiveAccess());
+        // The atoms zone is protected by the exclusive access lock, but can be
+        // also accessed when off-thread parsing is blocked.
+        MOZ_ASSERT(runtime->currentThreadHasExclusiveAccess() ||
+                   (!runtime->isOffThreadParseRunning() && runtime->isOffThreadParsingBlocked()));
     } else if (zone->usedByHelperThread()) {
         // This may only be accessed by the helper thread using this zone.
         MOZ_ASSERT(zone->ownedByCurrentHelperThread());
     } else {
         // The main thread is permitted access to all zones. These accesses
         // are threadsafe if the zone is not in use by a helper thread.
-        MOZ_ASSERT(CurrentThreadCanAccessRuntime(cx->runtime()));
+        MOZ_ASSERT(CurrentThreadCanAccessRuntime(runtime));
     }
 }
 
 template class CheckZone<AllowedHelperThread::None>;
 template class CheckZone<AllowedHelperThread::GCTask>;
 template class CheckZone<AllowedHelperThread::IonCompile>;
 template class CheckZone<AllowedHelperThread::GCTaskOrIonCompile>;
 
--- a/js/src/util/NativeStack.cpp
+++ b/js/src/util/NativeStack.cpp
@@ -8,20 +8,34 @@
 
 #ifdef XP_WIN
 # include "util/Windows.h"
 #elif defined(XP_DARWIN) || defined(DARWIN) || defined(XP_UNIX)
 # include <pthread.h>
 # if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
 #  include <pthread_np.h>
 # endif
+# if defined(SOLARIS) || defined(AIX)
+#  include <ucontext.h>
+# endif
 # if defined(ANDROID) && !defined(__aarch64__)
 #  include <sys/types.h>
 #  include <unistd.h>
 # endif
+# if defined(XP_LINUX) && !defined(ANDROID) && defined(__GLIBC__)
+#  include <dlfcn.h>
+#  include <sys/syscall.h>
+#  include <sys/types.h>
+#  include <unistd.h>
+static pid_t
+gettid()
+{
+    return syscall(__NR_gettid);
+}
+# endif
 #else
 # error "Unsupported platform"
 #endif
 
 #include "jsfriendapi.h"
 
 #if defined(XP_WIN)
 
@@ -29,43 +43,85 @@ void*
 js::GetNativeStackBaseImpl()
 {
     PNT_TIB pTib = reinterpret_cast<PNT_TIB>(NtCurrentTeb());
     return static_cast<void*>(pTib->StackBase);
 }
 
 #elif defined(SOLARIS)
 
-#include <ucontext.h>
-
 JS_STATIC_ASSERT(JS_STACK_GROWTH_DIRECTION < 0);
 
 void*
 js::GetNativeStackBaseImpl()
 {
     stack_t st;
     stack_getbounds(&st);
     return static_cast<char*>(st.ss_sp) + st.ss_size;
 }
 
 #elif defined(AIX)
 
-#include <ucontext.h>
-
 JS_STATIC_ASSERT(JS_STACK_GROWTH_DIRECTION < 0);
 
 void*
 js::GetNativeStackBaseImpl()
 {
     ucontext_t context;
     getcontext(&context);
     return static_cast<char*>(context.uc_stack.ss_sp) +
         context.uc_stack.ss_size;
 }
 
+#elif defined(XP_LINUX) && !defined(ANDROID) && defined(__GLIBC__)
+void*
+js::GetNativeStackBaseImpl()
+{
+
+    // On the main thread, get stack base from glibc's __libc_stack_end rather than pthread APIs
+    // to avoid filesystem calls /proc/self/maps.  Non-main threads spawned with pthreads can read
+    // this information directly from their pthread struct, but the main thread must go parse
+    // /proc/self/maps to figure the mapped stack address space ranges.  We want to avoid reading
+    // from /proc/ so that firefox can run in sandboxed environments where /proc may not be mounted
+    if (gettid() == getpid()) {
+        void** pLibcStackEnd = (void**)dlsym(RTLD_DEFAULT, "__libc_stack_end");
+
+        // If __libc_stack_end is not found, architecture specific frame pointer hopping will need
+        // to be implemented.
+        MOZ_RELEASE_ASSERT(pLibcStackEnd, "__libc_stack_end unavailable, unable to setup stack range for JS");
+        void* stackBase = *pLibcStackEnd;
+        MOZ_RELEASE_ASSERT(stackBase, "invalid stack base, unable to setup stack range for JS");
+
+        // We don't need to fix stackBase, as it already roughly points to beginning of the stack
+        return stackBase;
+    }
+
+    // Non-main threads have the required info stored in memory, so no filesystem calls are made.
+    pthread_t thread = pthread_self();
+    pthread_attr_t sattr;
+    pthread_attr_init(&sattr);
+    pthread_getattr_np(thread, &sattr);
+
+    // stackBase will be the *lowest* address on all architectures.
+    void* stackBase = nullptr;
+    size_t stackSize = 0;
+    int rc = pthread_attr_getstack(&sattr, &stackBase, &stackSize);
+    if (rc) {
+        MOZ_CRASH("call to pthread_attr_getstack failed, unable to setup stack range for JS");
+    }
+    MOZ_RELEASE_ASSERT(stackBase, "invalid stack base, unable to setup stack range for JS");
+    pthread_attr_destroy(&sattr);
+
+# if JS_STACK_GROWTH_DIRECTION > 0
+    return stackBase;
+# else
+    return static_cast<char*>(stackBase) + stackSize;
+# endif
+}
+
 #else /* XP_UNIX */
 
 void*
 js::GetNativeStackBaseImpl()
 {
     pthread_t thread = pthread_self();
 # if defined(XP_DARWIN) || defined(DARWIN)
     return pthread_get_stackaddr_np(thread);
--- a/js/src/vm/BytecodeUtil.cpp
+++ b/js/src/vm/BytecodeUtil.cpp
@@ -2891,16 +2891,17 @@ static bool
 GenerateLcovInfo(JSContext* cx, JS::Realm* realm, GenericPrinter& out)
 {
     JSRuntime* rt = cx->runtime();
 
     // Collect the list of scripts which are part of the current realm.
     {
         js::gc::AutoPrepareForTracing apft(cx);
     }
+
     Rooted<ScriptVector> topScripts(cx, ScriptVector(cx));
     for (ZonesIter zone(rt, SkipAtoms); !zone.done(); zone.next()) {
         for (auto script = zone->cellIter<JSScript>(); !script.done(); script.next()) {
             if (script->realm() != realm ||
                 !script->isTopLevel() ||
                 !script->filename())
             {
                 continue;
--- a/js/src/vm/HelperThreads.cpp
+++ b/js/src/vm/HelperThreads.cpp
@@ -2094,19 +2094,22 @@ void
 HelperThread::handleParseWorkload(AutoLockHelperThreadState& locked)
 {
     MOZ_ASSERT(HelperThreadState().canStartParseTask(locked));
     MOZ_ASSERT(idle());
 
     currentTask.emplace(HelperThreadState().parseWorklist(locked).popCopy());
     ParseTask* task = parseTask();
 
+    JSRuntime* runtime = task->parseGlobal->runtimeFromAnyThread();
+    runtime->incOffThreadParsesRunning();
+
     {
         AutoUnlockHelperThreadState unlock(locked);
-        AutoSetContextRuntime ascr(task->parseGlobal->runtimeFromAnyThread());
+        AutoSetContextRuntime ascr(runtime);
 
         JSContext* cx = TlsContext.get();
 
         Zone* zone = task->parseGlobal->zoneFromAnyThread();
         zone->setHelperThreadOwnerContext(cx);
         auto resetOwnerContext = mozilla::MakeScopeExit([&] {
             zone->setHelperThreadOwnerContext(nullptr);
         });
@@ -2120,16 +2123,18 @@ HelperThread::handleParseWorkload(AutoLo
 
     // The callback is invoked while we are still off thread.
     task->callback(task, task->callbackData);
 
     // FinishOffThreadScript will need to be called on the script to
     // migrate it into the correct compartment.
     HelperThreadState().parseFinishedList(locked).insertBack(task);
 
+    runtime->decOffThreadParsesRunning();
+
     currentTask.reset();
 
     // Notify the main thread in case it is waiting for the parse/emit to finish.
     HelperThreadState().notifyAll(GlobalHelperThreadState::CONSUMER, locked);
 }
 
 void
 HelperThread::handleCompressionWorkload(AutoLockHelperThreadState& locked)
@@ -2262,17 +2267,17 @@ js::StartOffThreadPromiseHelperTask(Prom
     if (!HelperThreadState().promiseHelperTasks(lock).append(task))
         return false;
 
     HelperThreadState().notifyOne(GlobalHelperThreadState::PRODUCER, lock);
     return true;
 }
 
 void
-GlobalHelperThreadState::trace(JSTracer* trc, gc::AutoTraceSession& session)
+GlobalHelperThreadState::trace(JSTracer* trc)
 {
     AutoLockHelperThreadState lock;
     for (auto builder : ionWorklist(lock))
         builder->trace(trc);
     for (auto builder : ionFinishedList(lock))
         builder->trace(trc);
 
     if (HelperThreadState().threads) {
--- a/js/src/vm/HelperThreads.h
+++ b/js/src/vm/HelperThreads.h
@@ -306,17 +306,17 @@ class GlobalHelperThreadState
 
     bool finishParseTask(JSContext* cx, ParseTaskKind kind, JS::OffThreadToken* token, MutableHandle<ScriptVector> scripts);
 
     void cancelParseTask(JSRuntime* rt, ParseTaskKind kind, JS::OffThreadToken* token);
     void destroyParseTask(JSRuntime* rt, ParseTask* parseTask);
 
     void mergeParseTaskRealm(JSContext* cx, ParseTask* parseTask, JS::Realm* dest);
 
-    void trace(JSTracer* trc, js::gc::AutoTraceSession& session);
+    void trace(JSTracer* trc);
 
     JSScript* finishScriptParseTask(JSContext* cx, JS::OffThreadToken* token);
     JSScript* finishScriptDecodeTask(JSContext* cx, JS::OffThreadToken* token);
     bool finishMultiScriptsDecodeTask(JSContext* cx, JS::OffThreadToken* token, MutableHandle<ScriptVector> scripts);
     JSObject* finishModuleParseTask(JSContext* cx, JS::OffThreadToken* token);
 
 #if defined(JS_BUILD_BINAST)
     JSScript* finishBinASTDecodeTask(JSContext* cx, JS::OffThreadToken* token);
--- a/js/src/vm/JSAtom.cpp
+++ b/js/src/vm/JSAtom.cpp
@@ -250,24 +250,24 @@ TracePinnedAtoms(JSTracer* trc, const At
             JSAtom* atom = entry.asPtrUnbarriered();
             TraceRoot(trc, &atom, "interned_atom");
             MOZ_ASSERT(entry.asPtrUnbarriered() == atom);
         }
     }
 }
 
 void
-js::TraceAtoms(JSTracer* trc, AutoLockForExclusiveAccess& lock)
+js::TraceAtoms(JSTracer* trc, const AutoAccessAtomsZone& access)
 {
     JSRuntime* rt = trc->runtime();
 
     if (rt->atomsAreFinished())
         return;
 
-    TracePinnedAtoms(trc, rt->atoms(lock));
+    TracePinnedAtoms(trc, rt->atoms(access));
     if (rt->atomsAddedWhileSweeping())
         TracePinnedAtoms(trc, *rt->atomsAddedWhileSweeping());
 }
 
 void
 js::TracePermanentAtoms(JSTracer* trc)
 {
     JSRuntime* rt = trc->runtime();
--- a/js/src/vm/JSAtom.h
+++ b/js/src/vm/JSAtom.h
@@ -34,23 +34,23 @@ JS_FOR_EACH_PROTOTYPE(DECLARE_PROTO_STR)
 #undef DECLARE_PROTO_STR
 
 #define DECLARE_CONST_CHAR_STR(idpart, id, text)  extern const char js_##idpart##_str[];
 FOR_EACH_COMMON_PROPERTYNAME(DECLARE_CONST_CHAR_STR)
 #undef DECLARE_CONST_CHAR_STR
 
 namespace js {
 
-class AutoLockForExclusiveAccess;
+class AutoAccessAtomsZone;
 
 /*
  * Atom tracing and garbage collection hooks.
  */
 void
-TraceAtoms(JSTracer* trc, AutoLockForExclusiveAccess& lock);
+TraceAtoms(JSTracer* trc, const AutoAccessAtomsZone& atomsAccess);
 
 void
 TracePermanentAtoms(JSTracer* trc);
 
 void
 TraceWellKnownSymbols(JSTracer* trc);
 
 /* N.B. must correspond to boolean tagging behavior. */
--- a/js/src/vm/JSContext.h
+++ b/js/src/vm/JSContext.h
@@ -29,16 +29,17 @@ class AutoAtomsZone;
 class AutoRealm;
 
 namespace jit {
 class JitContext;
 class DebugModeOSRVolatileJitFrameIter;
 } // namespace jit
 
 namespace gc {
+class AutoCheckCanAccessAtomsDuringGC;
 class AutoSuppressNurseryCellAlloc;
 }
 
 typedef HashSet<Shape*> ShapeSet;
 
 /* Detects cycles when traversing an object graph. */
 class MOZ_RAII AutoCycleDetector
 {
@@ -259,24 +260,24 @@ struct JSContext : public JS::RootingCon
     // Zone local methods that can be used freely.
     inline js::LifoAlloc& typeLifoAlloc();
 
     // Current global. This is only safe to use within the scope of the
     // AutoRealm from which it's called.
     inline js::Handle<js::GlobalObject*> global() const;
 
     // Methods to access runtime data that must be protected by locks.
-    js::AtomSet& atoms(js::AutoLockForExclusiveAccess& lock) {
-        return runtime_->atoms(lock);
+    js::AtomSet& atoms(const js::AutoAccessAtomsZone& access) {
+        return runtime_->atoms(access);
     }
-    const JS::Zone* atomsZone(js::AutoLockForExclusiveAccess& lock) {
-        return runtime_->atomsZone(lock);
+    const JS::Zone* atomsZone(const js::AutoAccessAtomsZone& access) {
+        return runtime_->atomsZone(access);
     }
-    js::SymbolRegistry& symbolRegistry(js::AutoLockForExclusiveAccess& lock) {
-        return runtime_->symbolRegistry(lock);
+    js::SymbolRegistry& symbolRegistry(const js::AutoAccessAtomsZone& access) {
+        return runtime_->symbolRegistry(access);
     }
     js::ScriptDataTable& scriptDataTable(js::AutoLockScriptData& lock) {
         return runtime_->scriptDataTable(lock);
     }
 
     // Methods to access other runtime data that checks locking internally.
     js::gc::AtomMarkingRuntime& atomMarking() {
         return runtime_->gc.atomMarking;
@@ -535,16 +536,18 @@ struct JSContext : public JS::RootingCon
     // Count of AutoDisableGenerationalGC instances on the thread's stack.
     js::ThreadData<unsigned> generationalDisabled;
 
     // Some code cannot tolerate compacting GC so it can be disabled temporarily
     // with AutoDisableCompactingGC which uses this counter.
     js::ThreadData<unsigned> compactingDisabledCount;
 
     bool canCollectAtoms() const {
+        // TODO: We may be able to improve this by collecting if
+        // !isOffThreadParseRunning() (bug 1468422).
         return !runtime()->hasHelperThreadZones();
     }
 
   private:
     // Pools used for recycling name maps and vectors when parsing and
     // emitting bytecode. Purged on GC when there are no active script
     // compilations.
     js::ThreadData<js::frontend::NameCollectionPool> frontendCollectionPool_;
@@ -1165,16 +1168,32 @@ class MOZ_RAII AutoLockScriptData
             runtime->activeThreadHasScriptDataAccess = false;
 #endif
         }
     }
 
     MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
 };
 
+// A token used to prove you can safely access the atoms zone. This zone is
+// accessed by the main thread and by off-thread parsing. There are two
+// situations in which it is safe:
+//
+//  - the current thread holds the exclusive access lock (off-thread parsing may
+//    be running and this must also take the lock for access)
+//
+//  - the GC is running and is collecting the atoms zone (this cannot be started
+//    while off-thread parsing is happening)
+class MOZ_STACK_CLASS AutoAccessAtomsZone
+{
+  public:
+    MOZ_IMPLICIT AutoAccessAtomsZone(const AutoLockForExclusiveAccess& lock) {}
+    MOZ_IMPLICIT AutoAccessAtomsZone(const gc::AutoCheckCanAccessAtomsDuringGC& canAccess) {}
+};
+
 class MOZ_RAII AutoKeepAtoms
 {
     JSContext* cx;
     MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
 
   public:
     explicit inline AutoKeepAtoms(JSContext* cx
                            MOZ_GUARD_OBJECT_NOTIFIER_PARAM);
--- a/js/src/vm/Runtime.cpp
+++ b/js/src/vm/Runtime.cpp
@@ -161,16 +161,20 @@ JSRuntime::JSRuntime(JSRuntime* parentRu
     commonNames(nullptr),
     permanentAtoms(nullptr),
     wellKnownSymbols(nullptr),
     jitSupportsFloatingPoint(false),
     jitSupportsUnalignedAccesses(false),
     jitSupportsSimd(false),
     offthreadIonCompilationEnabled_(true),
     parallelParsingEnabled_(true),
+#ifdef DEBUG
+    offThreadParsesRunning_(0),
+    offThreadParsingBlocked_(false),
+#endif
     autoWritableJitCodeActive_(false),
     oomCallback(nullptr),
     debuggerMallocSizeOf(ReturnZeroSize),
     lastAnimationTime(0),
     performanceMonitoring_(),
     stackFormat_(parentRuntime ? js::StackFormat::Default
                                : js::StackFormat::SpiderMonkey),
     wasmInstances(mutexid::WasmRuntimeInstances),
@@ -803,16 +807,17 @@ JSRuntime::destroyAtomsAddedWhileSweepin
     atomsAddedWhileSweeping_ = nullptr;
 }
 
 void
 JSRuntime::setUsedByHelperThread(Zone* zone)
 {
     MOZ_ASSERT(!zone->usedByHelperThread());
     MOZ_ASSERT(!zone->wasGCStarted());
+    MOZ_ASSERT(!isOffThreadParsingBlocked());
     zone->setUsedByHelperThread();
     numActiveHelperThreadZones++;
 }
 
 void
 JSRuntime::clearUsedByHelperThread(Zone* zone)
 {
     MOZ_ASSERT(zone->usedByHelperThread());
--- a/js/src/vm/Runtime.h
+++ b/js/src/vm/Runtime.h
@@ -56,16 +56,20 @@ namespace js {
 
 class AutoAssertNoContentJS;
 class AutoKeepAtoms;
 class EnterDebuggeeNoExecute;
 #ifdef JS_TRACE_LOGGING
 class TraceLoggerThread;
 #endif
 
+namespace gc {
+class AutoHeapSession;
+}
+
 } // namespace js
 
 struct DtoaState;
 
 #ifdef JS_SIMULATOR_ARM64
 namespace vixl {
 class Simulator;
 }
@@ -697,69 +701,69 @@ struct JSRuntime : public js::MallocProv
         return allowContentJS_;
     }
 
     friend class js::AutoAssertNoContentJS;
 
   private:
     // Set of all atoms other than those in permanentAtoms and staticStrings.
     // Reading or writing this set requires the calling thread to use
-    // AutoLockForExclusiveAccess.
+    // AutoAccessAtomsZone.
     js::ExclusiveAccessLockOrGCTaskData<js::AtomSet*> atoms_;
 
     // Set of all atoms added while the main atoms table is being swept.
-    js::ExclusiveAccessLockData<js::AtomSet*> atomsAddedWhileSweeping_;
+    js::ExclusiveAccessLockOrGCTaskData<js::AtomSet*> atomsAddedWhileSweeping_;
 
     // Set of all live symbols produced by Symbol.for(). All such symbols are
-    // allocated in the atomsZone. Reading or writing the symbol registry
-    // requires the calling thread to use AutoLockForExclusiveAccess.
+    // allocated in the atoms zone. Reading or writing the symbol registry
+    // requires the calling thread to use AutoAccessAtomsZone.
     js::ExclusiveAccessLockOrGCTaskData<js::SymbolRegistry> symbolRegistry_;
 
   public:
     bool initializeAtoms(JSContext* cx);
     void finishAtoms();
     bool atomsAreFinished() const { return !atoms_; }
 
     js::AtomSet* atomsForSweeping() {
         MOZ_ASSERT(JS::RuntimeHeapIsCollecting());
         return atoms_;
     }
 
-    js::AtomSet& atoms(js::AutoLockForExclusiveAccess& lock) {
+    js::AtomSet& atoms(const js::AutoAccessAtomsZone& access) {
         MOZ_ASSERT(atoms_);
         return *atoms_;
     }
     js::AtomSet& unsafeAtoms() {
         MOZ_ASSERT(atoms_);
         return *atoms_;
     }
 
     bool createAtomsAddedWhileSweepingTable();
     void destroyAtomsAddedWhileSweepingTable();
     js::AtomSet* atomsAddedWhileSweeping() {
         return atomsAddedWhileSweeping_;
     }
 
-    const JS::Zone* atomsZone(const js::AutoLockForExclusiveAccess& lock) const {
+    const JS::Zone* atomsZone(const js::AutoAccessAtomsZone& access) const {
         return gc.atomsZone;
     }
-    JS::Zone* atomsZone(const js::AutoLockForExclusiveAccess& lock) {
+    JS::Zone* atomsZone(const js::AutoAccessAtomsZone& access) {
         return gc.atomsZone;
     }
     JS::Zone* unsafeAtomsZone() {
         return gc.atomsZone;
     }
 
     bool isAtomsZone(const JS::Zone* zone) const {
         return zone == gc.atomsZone;
     }
 
     bool activeGCInAtomsZone();
 
-    js::SymbolRegistry& symbolRegistry(js::AutoLockForExclusiveAccess& lock) {
+    js::SymbolRegistry& symbolRegistry(const js::AutoAccessAtomsZone& access) {
         return symbolRegistry_.ref();
     }
     js::SymbolRegistry& unsafeSymbolRegistry() {
         return symbolRegistry_.ref();
     }
 
     // Permanent atoms are fixed during initialization of the runtime and are
     // not modified or collected until the runtime is destroyed. These may be
@@ -852,16 +856,21 @@ struct JSRuntime : public js::MallocProv
 
     void addSizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf, JS::RuntimeSizes* rtSizes);
 
   private:
     // Settings for how helper threads can be used.
     mozilla::Atomic<bool> offthreadIonCompilationEnabled_;
     mozilla::Atomic<bool> parallelParsingEnabled_;
 
+#ifdef DEBUG
+    mozilla::Atomic<uint32_t> offThreadParsesRunning_;
+    mozilla::Atomic<bool> offThreadParsingBlocked_;
+#endif
+
     js::MainThreadData<bool> autoWritableJitCodeActive_;
 
   public:
 
     // Note: these values may be toggled dynamically (in response to about:config
     // prefs changing).
     void setOffthreadIonCompilationEnabled(bool value) {
         offthreadIonCompilationEnabled_ = value;
@@ -871,16 +880,48 @@ struct JSRuntime : public js::MallocProv
     }
     void setParallelParsingEnabled(bool value) {
         parallelParsingEnabled_ = value;
     }
     bool canUseParallelParsing() const {
         return parallelParsingEnabled_;
     }
 
+#ifdef DEBUG
+
+    bool isOffThreadParseRunning() const {
+        return offThreadParsesRunning_;
+    }
+
+    void incOffThreadParsesRunning() {
+        MOZ_ASSERT(!isOffThreadParsingBlocked());
+        offThreadParsesRunning_++;
+    }
+
+    void decOffThreadParsesRunning() {
+        MOZ_ASSERT(isOffThreadParseRunning());
+        offThreadParsesRunning_--;
+    }
+
+    bool isOffThreadParsingBlocked() const {
+        return offThreadParsingBlocked_;
+    }
+    void setOffThreadParsingBlocked(bool blocked) {
+        MOZ_ASSERT(offThreadParsingBlocked_ != blocked);
+        MOZ_ASSERT(!isOffThreadParseRunning());
+        offThreadParsingBlocked_ = blocked;
+    }
+
+#else
+
+    void incOffThreadParsesRunning() {}
+    void decOffThreadParsesRunning() {}
+
+#endif
+
     void toggleAutoWritableJitCodeActive(bool b) {
         MOZ_ASSERT(autoWritableJitCodeActive_ != b, "AutoWritableJitCode should not be nested.");
         autoWritableJitCodeActive_ = b;
     }
 
     /* See comment for JS::SetOutOfMemoryCallback in jsapi.h. */
     js::MainThreadData<JS::OutOfMemoryCallback> oomCallback;
     js::MainThreadData<void*> oomCallbackData;
@@ -916,17 +957,17 @@ struct JSRuntime : public js::MallocProv
     }
     void setStackFormat(js::StackFormat format) {
         MOZ_ASSERT(!parentRuntime);
         MOZ_ASSERT(format != js::StackFormat::Default);
         stackFormat_ = format;
     }
 
     // For inherited heap state accessors.
-    friend class js::gc::AutoTraceSession;
+    friend class js::gc::AutoHeapSession;
     friend class JS::AutoEnterCycleCollection;
 
   private:
     js::MainThreadData<js::RuntimeCaches> caches_;
   public:
     js::RuntimeCaches& caches() { return caches_.ref(); }
 
     // List of all the live wasm::Instances in the runtime. Equal to the union
--- a/js/src/vm/SymbolType.cpp
+++ b/js/src/vm/SymbolType.cpp
@@ -15,19 +15,19 @@
 
 #include "vm/Realm-inl.h"
 
 using JS::Symbol;
 using namespace js;
 
 Symbol*
 Symbol::newInternal(JSContext* cx, JS::SymbolCode code, uint32_t hash, JSAtom* description,
-                    AutoLockForExclusiveAccess& lock)
+                    const AutoAccessAtomsZone& access)
 {
-    MOZ_ASSERT(cx->zone() == cx->atomsZone(lock));
+    MOZ_ASSERT(cx->zone() == cx->atomsZone(access));
 
     // Following js::AtomizeString, we grudgingly forgo last-ditch GC here.
     Symbol* p = Allocate<JS::Symbol, NoGC>(cx);
     if (!p) {
         ReportOutOfMemory(cx);
         return nullptr;
     }
     return new (p) Symbol(code, hash, description);
--- a/js/src/vm/SymbolType.h
+++ b/js/src/vm/SymbolType.h
@@ -20,17 +20,17 @@
 #include "js/HeapAPI.h"
 #include "js/RootingAPI.h"
 #include "js/TypeDecls.h"
 #include "js/Utility.h"
 #include "vm/Printer.h"
 #include "vm/StringType.h"
 
 namespace js {
-class AutoLockForExclusiveAccess;
+class AutoAccessAtomsZone;
 } // namespace js
 
 namespace JS {
 
 class Symbol : public js::gc::TenuredCell
 {
   private:
     SymbolCode code_;
@@ -55,17 +55,17 @@ class Symbol : public js::gc::TenuredCel
                       "JS::shadow::Symbol::WellKnownAPILimit must match SymbolCode::WellKnownAPILimit");
     }
 
     Symbol(const Symbol&) = delete;
     void operator=(const Symbol&) = delete;
 
     static Symbol*
     newInternal(JSContext* cx, SymbolCode code, js::HashNumber hash,
-                JSAtom* description, js::AutoLockForExclusiveAccess& lock);
+                JSAtom* description, const js::AutoAccessAtomsZone& access);
 
   public:
     static Symbol* new_(JSContext* cx, SymbolCode code, JSString* description);
     static Symbol* for_(JSContext* cx, js::HandleString description);
 
     JSAtom* description() const { return description_; }
     SymbolCode code() const { return code_; }
     js::HashNumber hash() const { return hash_; }
--- a/layout/style/ServoBindingList.h
+++ b/layout/style/ServoBindingList.h
@@ -506,22 +506,16 @@ SERVO_BINDING_FUNC(Servo_AnimationValue_
                    RawServoAnimationValueBorrowed value)
 SERVO_BINDING_FUNC(Servo_AnimationValue_Compute,
                    RawServoAnimationValueStrong,
                    RawGeckoElementBorrowed element,
                    RawServoDeclarationBlockBorrowed declarations,
                    ComputedStyleBorrowed style,
                    RawServoStyleSetBorrowed raw_data)
 
-// There's no reason we couldn't expose more stuff here, but GetCssText is
-// pretty much all we'd ever want.
-SERVO_BINDING_FUNC(Servo_UnlockedDeclarationBlock_GetCssText, void,
-                   const RawServoUnlockedDeclarationBlock* declarations,
-                   nsAString* result)
-
 // Style attribute
 SERVO_BINDING_FUNC(Servo_ParseStyleAttribute, RawServoDeclarationBlockStrong,
                    const nsACString* data,
                    RawGeckoURLExtraData* extra_data,
                    nsCompatibility quirks_mode,
                    mozilla::css::Loader* loader)
 SERVO_BINDING_FUNC(Servo_DeclarationBlock_CreateEmpty,
                    RawServoDeclarationBlockStrong)
--- a/layout/style/ServoBindingTypes.h
+++ b/layout/style/ServoBindingTypes.h
@@ -78,29 +78,22 @@ typedef nsStyleAutoArray<mozilla::StyleA
 typedef nsTArray<nsFontFaceRuleContainer> RawGeckoFontFaceRuleList;
 typedef mozilla::AnimationPropertySegment RawGeckoAnimationPropertySegment;
 typedef mozilla::ComputedTiming RawGeckoComputedTiming;
 typedef nsTArray<const RawServoStyleRule*> RawGeckoServoStyleRuleList;
 typedef nsTArray<nsCSSPropertyID> RawGeckoCSSPropertyIDList;
 typedef mozilla::gfx::Float RawGeckoGfxMatrix4x4[16];
 typedef mozilla::dom::StyleChildrenIterator RawGeckoStyleChildrenIterator;
 
-// A struct which to be used as an opaque pointer to a DeclarationBlock that has
-// been read.
-//
-// This is effectively a *const PropertyDeclarationBlock in Rust.
-struct RawServoUnlockedDeclarationBlock;
-
 // A callback that can be sent via FFI which will be invoked _right before_
 // being mutated, and at most once.
 struct DeclarationBlockMutationClosure
 {
-  // The callback function, first argument is the unlocked servo declaration
-  // block, second is `data`.
-  void (*function)(const RawServoUnlockedDeclarationBlock*, void*) = nullptr;
+  // The callback function. The argument is `data`.
+  void (*function)(void*) = nullptr;
   void* data = nullptr;
 };
 
 // We have these helper types so that we can directly generate
 // things like &T or Borrowed<T> on the Rust side in the function, providing
 // additional safety benefits.
 //
 // FFI has a problem with templated types, so we just use raw pointers here.
--- a/layout/style/ServoBindings.toml
+++ b/layout/style/ServoBindings.toml
@@ -420,17 +420,16 @@ mapped-generic-types = [
     { generic = false, gecko = "ServoNodeData", servo = "AtomicRefCell<ElementData>" },
     { generic = false, gecko = "mozilla::ServoWritingMode", servo = "::logical_geometry::WritingMode" },
     { generic = false, gecko = "mozilla::ServoCustomPropertiesMap", servo = "Option<::servo_arc::Arc<::custom_properties::CustomPropertiesMap>>" },
     { generic = false, gecko = "mozilla::ServoRuleNode", servo = "Option<::rule_tree::StrongRuleNode>" },
     { generic = false, gecko = "mozilla::ServoVisitedStyle", servo = "Option<::servo_arc::RawOffsetArc<::properties::ComputedValues>>" },
     { generic = false, gecko = "mozilla::ServoComputedValueFlags", servo = "::properties::computed_value_flags::ComputedValueFlags" },
     { generic = true, gecko = "mozilla::ServoRawOffsetArc", servo = "::servo_arc::RawOffsetArc" },
     { generic = false, gecko = "ComputedStyleStrong", servo = "::gecko_bindings::sugar::ownership::Strong<::properties::ComputedValues>" },
-    { generic = false, gecko = "RawServoUnlockedDeclarationBlock", servo = "::properties::PropertyDeclarationBlock" },
 ]
 fixups = [
     { pat = "\\broot\\s*::\\s*nsString\\b", rep = "::nsstring::nsStringRepr" },
     { pat = "\\broot\\s*::\\s*nsTString\\s*<\\s*u16\\s*>", rep = "::nsstring::nsStringRepr" },
 ]
 
 [bindings]
 headers = ["mozilla/ServoBindings.h"]
@@ -464,17 +463,16 @@ structs-types = [
     "mozilla::FontStretch",
     "mozilla::FontSlantStyle",
     "mozilla::FontWeight",
     "mozilla::MallocSizeOf",
     "mozilla::OriginFlags",
     "mozilla::UniquePtr",
     "ServoRawOffsetArc",
     "DeclarationBlockMutationClosure",
-    "RawServoUnlockedDeclarationBlock",
     "nsIContent",
     "nsINode",
     "nsIDocument",
     "nsIDocument_DocumentTheme",
     "nsSimpleContentList",
     "MediumFeaturesChangedResult",
     "RawGeckoAnimationPropertySegment",
     "RawGeckoComputedTiming",
--- a/layout/style/nsComputedDOMStyle.cpp
+++ b/layout/style/nsComputedDOMStyle.cpp
@@ -63,22 +63,23 @@ using namespace mozilla::dom;
 #endif
 
 /*
  * This is the implementation of the readonly CSSStyleDeclaration that is
  * returned by the getComputedStyle() function.
  */
 
 already_AddRefed<nsComputedDOMStyle>
-NS_NewComputedDOMStyle(dom::Element* aElement, const nsAString& aPseudoElt,
-                       nsIPresShell* aPresShell,
+NS_NewComputedDOMStyle(dom::Element* aElement,
+                       const nsAString& aPseudoElt,
+                       nsIDocument* aDocument,
                        nsComputedDOMStyle::StyleType aStyleType)
 {
   RefPtr<nsComputedDOMStyle> computedStyle =
-    new nsComputedDOMStyle(aElement, aPseudoElt, aPresShell, aStyleType);
+    new nsComputedDOMStyle(aElement, aPseudoElt, aDocument, aStyleType);
   return computedStyle.forget();
 }
 
 static nsDOMCSSValueList*
 GetROCSSValueList(bool aCommaDelimited)
 {
   return new nsDOMCSSValueList(aCommaDelimited, true);
 }
@@ -112,17 +113,17 @@ DocumentNeedsRestyle(
   nsIPresShell* shell = aDocument->GetShell();
   if (!shell) {
     return true;
   }
 
   nsPresContext* presContext = shell->GetPresContext();
   MOZ_ASSERT(presContext);
 
-  // Unfortunately we don't know if the sheet change affects mContent or not, so
+  // Unfortunately we don't know if the sheet change affects mElement or not, so
   // just assume it will and that we need to flush normally.
   ServoStyleSet* styleSet = shell->StyleSet();
   if (styleSet->StyleSheetsHaveChanged()) {
     return true;
   }
 
   // Pending media query updates can definitely change style on the element. For
   // example, if you change the zoom factor and then call getComputedStyle, you
@@ -307,53 +308,54 @@ ComputedStyleMap::Update()
       mIndexMap[index++] = i;
     }
   }
   mExposedPropertyCount = index;
 }
 
 nsComputedDOMStyle::nsComputedDOMStyle(dom::Element* aElement,
                                        const nsAString& aPseudoElt,
-                                       nsIPresShell* aPresShell,
+                                       nsIDocument* aDocument,
                                        StyleType aStyleType)
   : mDocumentWeak(nullptr)
   , mOuterFrame(nullptr)
   , mInnerFrame(nullptr)
   , mPresShell(nullptr)
   , mStyleType(aStyleType)
   , mComputedStyleGeneration(0)
   , mExposeVisitedStyle(false)
   , mResolvedComputedStyle(false)
 #ifdef DEBUG
   , mFlushedPendingReflows(false)
 #endif
 {
-  MOZ_ASSERT(aElement && aPresShell);
-  MOZ_ASSERT(aPresShell->GetPresContext());
-
-  mDocumentWeak = do_GetWeakReference(aPresShell->GetDocument());
-  mContent = aElement;
+  MOZ_ASSERT(aElement);
+  MOZ_ASSERT(aDocument);
+  // TODO(emilio, bug 548397, https://github.com/w3c/csswg-drafts/issues/2403):
+  // Should use aElement->OwnerDoc() instead.
+  mDocumentWeak = do_GetWeakReference(aDocument);
+  mElement = aElement;
   mPseudo = nsCSSPseudoElements::GetPseudoAtom(aPseudoElt);
 }
 
 nsComputedDOMStyle::~nsComputedDOMStyle()
 {
   ClearComputedStyle();
 }
 
 NS_IMPL_CYCLE_COLLECTION_CLASS(nsComputedDOMStyle)
 
 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsComputedDOMStyle)
-  tmp->ClearComputedStyle();  // remove observer before clearing mContent
-  NS_IMPL_CYCLE_COLLECTION_UNLINK(mContent)
+  tmp->ClearComputedStyle();  // remove observer before clearing mElement
+  NS_IMPL_CYCLE_COLLECTION_UNLINK(mElement)
   NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
 
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsComputedDOMStyle)
-  NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mContent)
+  NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mElement)
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
 
 NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(nsComputedDOMStyle)
 
 NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_BEGIN(nsComputedDOMStyle)
   return tmp->HasKnownLiveWrapper();
 NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_END
 
@@ -407,24 +409,26 @@ nsComputedDOMStyle::SetCssText(const nsA
                                ErrorResult& aRv)
 {
   aRv.Throw(NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR);
 }
 
 uint32_t
 nsComputedDOMStyle::Length()
 {
-  uint32_t length = GetComputedStyleMap()->Length();
-
   // Make sure we have up to date style so that we can include custom
   // properties.
   UpdateCurrentStyleSources(false);
-  if (mComputedStyle) {
-    length += Servo_GetCustomPropertiesCount(mComputedStyle);
-  }
+  if (!mComputedStyle) {
+    return 0;
+  }
+
+  uint32_t length =
+    GetComputedStyleMap()->Length() +
+    Servo_GetCustomPropertiesCount(mComputedStyle);
 
   ClearCurrentStyleSources();
 
   return length;
 }
 
 css::Rule*
 nsComputedDOMStyle::GetParentRule()
@@ -447,17 +451,17 @@ nsComputedDOMStyle::GetPropertyValue(con
     if (!entry) {
       return NS_OK;
     }
   }
 
   const bool layoutFlushIsNeeded = entry && entry->IsLayoutFlushNeeded();
   UpdateCurrentStyleSources(layoutFlushIsNeeded);
   if (!mComputedStyle) {
-    return NS_ERROR_NOT_AVAILABLE;
+    return NS_OK;
   }
 
   auto cleanup = mozilla::MakeScopeExit([&] {
     ClearCurrentStyleSources();
   });
 
   if (!entry) {
     MOZ_ASSERT(nsCSSProps::IsCustomPropertyName(aPropertyName));
@@ -754,17 +758,16 @@ nsComputedDOMStyle::GetCSSImageURLs(cons
   if (prop == eCSSProperty_UNKNOWN) {
     aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
     return;
   }
 
   UpdateCurrentStyleSources(false);
 
   if (!mComputedStyle) {
-    aRv.Throw(NS_ERROR_NOT_AVAILABLE);
     return;
   }
 
   CollectImageURLsForProperty(prop, *mComputedStyle, aImageURLs);
   ClearCurrentStyleSources();
 }
 
 // nsDOMCSSDeclaration abstract methods which should never be called
@@ -795,28 +798,28 @@ nsComputedDOMStyle::GetParsingEnvironmen
   MOZ_CRASH("called nsComputedDOMStyle::GetParsingEnvironment");
 }
 
 void
 nsComputedDOMStyle::ClearComputedStyle()
 {
   if (mResolvedComputedStyle) {
     mResolvedComputedStyle = false;
-    mContent->RemoveMutationObserver(this);
+    mElement->RemoveMutationObserver(this);
   }
   mComputedStyle = nullptr;
 }
 
 void
 nsComputedDOMStyle::SetResolvedComputedStyle(RefPtr<ComputedStyle>&& aContext,
                                             uint64_t aGeneration)
 {
   if (!mResolvedComputedStyle) {
     mResolvedComputedStyle = true;
-    mContent->AddMutationObserver(this);
+    mElement->AddMutationObserver(this);
   }
   mComputedStyle = aContext;
   mComputedStyleGeneration = aGeneration;
 }
 
 void
 nsComputedDOMStyle::SetFrameComputedStyle(mozilla::ComputedStyle* aStyle,
                                          uint64_t aGeneration)
@@ -824,28 +827,28 @@ nsComputedDOMStyle::SetFrameComputedStyl
   ClearComputedStyle();
   mComputedStyle = aStyle;
   mComputedStyleGeneration = aGeneration;
 }
 
 bool
 nsComputedDOMStyle::NeedsToFlush(nsIDocument* aDocument) const
 {
-  // If mContent is not in the same document, we could do some checks to know if
+  // If mElement is not in the same document, we could do some checks to know if
   // there are some pending restyles can be ignored across documents (since we
   // will use the caller document's style), but it can be complicated and should
   // be an edge case, so we just don't bother to do the optimization in this
   // case.
   //
   // FIXME(emilio): This is likely to want GetComposedDoc() instead of
   // OwnerDoc().
-  if (aDocument != mContent->OwnerDoc()) {
+  if (aDocument != mElement->OwnerDoc()) {
     return true;
   }
-  if (DocumentNeedsRestyle(aDocument, mContent->AsElement(), mPseudo)) {
+  if (DocumentNeedsRestyle(aDocument, mElement, mPseudo)) {
     return true;
   }
   // If parent document is there, also needs to check if there is some change
   // that needs to flush this document (e.g. size change for iframe).
   while (nsIDocument* parentDocument = aDocument->GetParentDocument()) {
     Element* element = parentDocument->FindContentForSubDocument(aDocument);
     if (DocumentNeedsRestyle(parentDocument, element, nullptr)) {
       return true;
@@ -870,28 +873,28 @@ nsComputedDOMStyle::UpdateCurrentStyleSo
   //  * https://github.com/w3c/csswg-drafts/issues/1964
   //  * https://github.com/w3c/csswg-drafts/issues/1548
 
   // If the property we are computing relies on layout, then we must flush.
   const bool needsToFlush = aNeedsLayoutFlush || NeedsToFlush(document);
   if (needsToFlush) {
     // Flush _before_ getting the presshell, since that could create a new
     // presshell.  Also note that we want to flush the style on the document
-    // we're computing style in, not on the document mContent is in -- the two
+    // we're computing style in, not on the document mElement is in -- the two
     // may be different.
     document->FlushPendingNotifications(
       aNeedsLayoutFlush ? FlushType::Layout : FlushType::Style);
   }
 
 #ifdef DEBUG
   mFlushedPendingReflows = aNeedsLayoutFlush;
 #endif
 
   nsCOMPtr<nsIPresShell> presShellForContent =
-    nsContentUtils::GetPresShellForContent(mContent);
+    nsContentUtils::GetPresShellForContent(mElement);
   if (presShellForContent && presShellForContent->GetDocument() != document) {
     presShellForContent->GetDocument()->FlushPendingNotifications(FlushType::Style);
     if (presShellForContent->IsDestroying()) {
       presShellForContent = nullptr;
     }
   }
 
   mPresShell = document->GetShell();
@@ -908,45 +911,45 @@ nsComputedDOMStyle::UpdateCurrentStyleSo
   // undisplayed elements.
   // As for Gecko, GetUndisplayedRestyleGeneration is effectively equal to
   // GetRestyleGeneration, since the generation is incremented whenever we
   // process restyles.
   uint64_t currentGeneration =
     mPresShell->GetPresContext()->GetUndisplayedRestyleGeneration();
 
   if (mComputedStyle) {
-    // We can't rely on the undisplayed restyle generation if mContent is
+    // We can't rely on the undisplayed restyle generation if mElement is
     // out-of-document, since that generation is not incremented for DOM changes
     // on out-of-document elements.
     //
     // So we always need to update the style to ensure it it up-to-date.
-    if (mComputedStyleGeneration == currentGeneration
-        && mContent->IsInComposedDoc()) {
+    if (mComputedStyleGeneration == currentGeneration &&
+        mElement->IsInComposedDoc()) {
       // Our cached style is still valid.
       return;
     }
     // We've processed some restyles, so the cached style might be out of date.
     mComputedStyle = nullptr;
   }
 
-  // XXX the !mContent->IsHTMLElement(nsGkAtoms::area)
+  // XXX the !mElement->IsHTMLElement(nsGkAtoms::area)
   // check is needed due to bug 135040 (to avoid using
   // mPrimaryFrame). Remove it once that's fixed.
-  if (mStyleType == eAll && !mContent->IsHTMLElement(nsGkAtoms::area)) {
+  if (mStyleType == eAll && !mElement->IsHTMLElement(nsGkAtoms::area)) {
     mOuterFrame = nullptr;
 
     if (!mPseudo) {
-      mOuterFrame = mContent->GetPrimaryFrame();
+      mOuterFrame = mElement->GetPrimaryFrame();
     } else if (mPseudo == nsCSSPseudoElements::before ||
                mPseudo == nsCSSPseudoElements::after) {
       nsAtom* property = mPseudo == nsCSSPseudoElements::before
                             ? nsGkAtoms::beforePseudoProperty
                             : nsGkAtoms::afterPseudoProperty;
 
-      auto* pseudo = static_cast<Element*>(mContent->GetProperty(property));
+      auto* pseudo = static_cast<Element*>(mElement->GetProperty(property));
       mOuterFrame = pseudo ? pseudo->GetPrimaryFrame() : nullptr;
     }
 
     mInnerFrame = mOuterFrame;
     if (mOuterFrame) {
       LayoutFrameType type = mOuterFrame->Type();
       if (type == LayoutFrameType::TableWrapper) {
         // If the frame is a table wrapper frame then we should get the style
@@ -962,17 +965,17 @@ nsComputedDOMStyle::UpdateCurrentStyleSo
       NS_ASSERTION(mComputedStyle, "Frame without style?");
     }
   }
 
   if (!mComputedStyle || MustReresolveStyle(mComputedStyle)) {
     // Need to resolve a style.
     RefPtr<ComputedStyle> resolvedComputedStyle =
       DoGetComputedStyleNoFlush(
-          mContent->AsElement(),
+          mElement,
           mPseudo,
           presShellForContent ? presShellForContent.get() : mPresShell,
           mStyleType);
     if (!resolvedComputedStyle) {
       ClearComputedStyle();
       return;
     }
 
@@ -5690,17 +5693,17 @@ nsComputedDOMStyle::GetLineHeightCoord(n
       GetCBContentHeight(blockHeight);
     }
   }
 
   nsPresContext* presContext = mPresShell->GetPresContext();
 
   // lie about font size inflation since we lie about font size (since
   // the inflation only applies to text)
-  aCoord = ReflowInput::CalcLineHeight(mContent,
+  aCoord = ReflowInput::CalcLineHeight(mElement,
                                        mComputedStyle,
                                        presContext,
                                        blockHeight, 1.0f);
 
   // CalcLineHeight uses font->mFont.size, but we want to use
   // font->mSize as the font size.  Adjust for that.  Also adjust for
   // the text zoom, if any.
   const nsStyleFont* font = StyleFont();
@@ -7169,17 +7172,17 @@ static void
 MarkComputedStyleMapDirty(const char* aPref, void* aData)
 {
   static_cast<ComputedStyleMap*>(aData)->MarkDirty();
 }
 
 void
 nsComputedDOMStyle::ParentChainChanged(nsIContent* aContent)
 {
-  NS_ASSERTION(mContent == aContent, "didn't we register mContent?");
+  NS_ASSERTION(mElement == aContent, "didn't we register mElement?");
   NS_ASSERTION(mResolvedComputedStyle,
                "should have only registered an observer when "
                "mResolvedComputedStyle is true");
 
   ClearComputedStyle();
 }
 
 /* static */ ComputedStyleMap*
--- a/layout/style/nsComputedDOMStyle.h
+++ b/layout/style/nsComputedDOMStyle.h
@@ -75,22 +75,22 @@ public:
 
   enum StyleType {
     eDefaultOnly, // Only includes UA and user sheets
     eAll // Includes all stylesheets
   };
 
   nsComputedDOMStyle(mozilla::dom::Element* aElement,
                      const nsAString& aPseudoElt,
-                     nsIPresShell* aPresShell,
+                     nsIDocument* aDocument,
                      StyleType aStyleType);
 
-  virtual nsINode *GetParentObject() override
+  nsINode* GetParentObject() override
   {
-    return mContent;
+    return mElement;
   }
 
   static already_AddRefed<mozilla::ComputedStyle>
   GetComputedStyle(mozilla::dom::Element* aElement, nsAtom* aPseudo,
                    StyleType aStyleType = eAll);
 
   static already_AddRefed<mozilla::ComputedStyle>
   GetComputedStyleNoFlush(mozilla::dom::Element* aElement,
@@ -713,19 +713,19 @@ private:
   // restyles does not affect mContent).
   bool NeedsToFlush(nsIDocument* aDocument) const;
 
 
   static ComputedStyleMap* GetComputedStyleMap();
 
   // We don't really have a good immutable representation of "presentation".
   // Given the way GetComputedStyle is currently used, we should just grab the
-  // 0th presshell, if any, from the document.
+  // presshell, if any, from the document.
   nsWeakPtr mDocumentWeak;
-  nsCOMPtr<nsIContent> mContent;
+  RefPtr<mozilla::dom::Element> mElement;
 
   /**
    * Strong reference to the ComputedStyle we access data from.  This can be
    * either a ComputedStyle we resolved ourselves or a ComputedStyle we got
    * from our frame.
    *
    * If we got the ComputedStyle from the frame, we clear out mComputedStyle
    * in ClearCurrentStyleSources.  If we resolved one ourselves, then
@@ -781,13 +781,13 @@ private:
 #ifdef DEBUG
   bool mFlushedPendingReflows;
 #endif
 };
 
 already_AddRefed<nsComputedDOMStyle>
 NS_NewComputedDOMStyle(mozilla::dom::Element* aElement,
                        const nsAString& aPseudoElt,
-                       nsIPresShell* aPresShell,
+                       nsIDocument* aDocument,
                        nsComputedDOMStyle::StyleType aStyleType =
                          nsComputedDOMStyle::eAll);
 
 #endif /* nsComputedDOMStyle_h__ */
--- a/mfbt/tests/TestPair.cpp
+++ b/mfbt/tests/TestPair.cpp
@@ -28,23 +28,37 @@ using mozilla::Pair;
                 "second method should work on Pair<" #T2 ", " #T1 ">"); \
   static_assert(sizeof(name##_2) == (size), \
                 "Pair<" #T2 ", " #T1 "> has an unexpected size");
 
 INSTANTIATE(int, int, prim1, 2 * sizeof(int));
 INSTANTIATE(int, long, prim2, 2 * sizeof(long));
 
 struct EmptyClass { explicit EmptyClass(int) {} };
-struct NonEmpty { char mC; explicit NonEmpty(int) {} };
+struct NonEmpty
+{
+  char mC;
+  explicit NonEmpty(int)
+    : mC('\0')
+  {
+  }
+};
 
 INSTANTIATE(int, EmptyClass, both1, sizeof(int));
 INSTANTIATE(int, NonEmpty, both2, 2 * sizeof(int));
 INSTANTIATE(EmptyClass, NonEmpty, both3, 1);
 
-struct A { char dummy; explicit A(int) {} };
+struct A
+{
+  char dummy;
+  explicit A(int)
+    : dummy('\0')
+  {
+  }
+};
 struct B : A { explicit B(int aI) : A(aI) {} };
 
 INSTANTIATE(A, A, class1, 2);
 INSTANTIATE(A, B, class2, 2);
 INSTANTIATE(A, EmptyClass, class3, 1);
 
 struct OtherEmpty : EmptyClass { explicit OtherEmpty(int aI) : EmptyClass(aI) {} };
 
--- a/security/certverifier/CertVerifier.h
+++ b/security/certverifier/CertVerifier.h
@@ -6,16 +6,17 @@
 
 #ifndef CertVerifier_h
 #define CertVerifier_h
 
 #include "BRNameMatchingPolicy.h"
 #include "CTPolicyEnforcer.h"
 #include "CTVerifyResult.h"
 #include "OCSPCache.h"
+#include "RootCertificateTelemetryUtils.h"
 #include "ScopedNSSTypes.h"
 #include "mozilla/Telemetry.h"
 #include "mozilla/TimeStamp.h"
 #include "mozilla/UniquePtr.h"
 #include "nsString.h"
 #include "pkix/pkixtypes.h"
 
 #if defined(_MSC_VER)
@@ -73,33 +74,43 @@ enum DistrustedCAPolicy : uint32_t {
 // update this to account for new entries in DistrustedCAPolicy.
 const uint32_t DistrustedCAPolicyMaxAllowedValueMask = 0b0011;
 
 enum class NetscapeStepUpPolicy : uint32_t;
 
 class PinningTelemetryInfo
 {
 public:
-  PinningTelemetryInfo() { Reset(); }
+  PinningTelemetryInfo()
+    : certPinningResultBucket(0)
+    , rootBucket(ROOT_CERTIFICATE_UNKNOWN)
+  {
+    Reset();
+  }
 
   // Should we accumulate pinning telemetry for the result?
   bool accumulateResult;
-  Telemetry::HistogramID certPinningResultHistogram;
+  Maybe<Telemetry::HistogramID> certPinningResultHistogram;
   int32_t certPinningResultBucket;
   // Should we accumulate telemetry for the root?
   bool accumulateForRoot;
   int32_t rootBucket;
 
   void Reset() { accumulateForRoot = false; accumulateResult = false; }
 };
 
 class CertificateTransparencyInfo
 {
 public:
-  CertificateTransparencyInfo() { Reset(); }
+  CertificateTransparencyInfo()
+    : enabled(false)
+    , policyCompliance(mozilla::ct::CTPolicyCompliance::Unknown)
+  {
+    Reset();
+  }
 
   // Was CT enabled?
   bool enabled;
   // Verification result of the processed SCTs.
   mozilla::ct::CTVerifyResult verifyResult;
   // Connection compliance to the CT Policy.
   mozilla::ct::CTPolicyCompliance policyCompliance;
 
--- a/security/manager/ssl/PublicKeyPinningService.cpp
+++ b/security/manager/ssl/PublicKeyPinningService.cpp
@@ -300,17 +300,17 @@ CheckPinsForHostname(const RefPtr<nsNSSC
           ? Telemetry::CERT_PINNING_MOZ_TEST_RESULTS_BY_HOST
           : Telemetry::CERT_PINNING_MOZ_RESULTS_BY_HOST;
         pinningTelemetryInfo->certPinningResultBucket = bucket;
       } else {
         pinningTelemetryInfo->certPinningResultBucket =
             enforceTestModeResult ? 1 : 0;
       }
       pinningTelemetryInfo->accumulateResult = true;
-      pinningTelemetryInfo->certPinningResultHistogram = histogram;
+      pinningTelemetryInfo->certPinningResultHistogram = Some(histogram);
     }
 
     // We only collect per-CA pinning statistics upon failures.
     nsCOMPtr<nsIX509Cert> rootCert;
     rv = certList->GetRootCertificate(rootCert);
     if (NS_FAILED(rv)) {
       return rv;
     }
--- a/security/manager/ssl/SSLServerCertVerification.cpp
+++ b/security/manager/ssl/SSLServerCertVerification.cpp
@@ -1426,17 +1426,18 @@ AuthCertificate(CertVerifier& certVerifi
   }
 
   if (pinningTelemetryInfo.accumulateForRoot) {
     Telemetry::Accumulate(Telemetry::CERT_PINNING_FAILURES_BY_CA,
                           pinningTelemetryInfo.rootBucket);
   }
 
   if (pinningTelemetryInfo.accumulateResult) {
-    Telemetry::Accumulate(pinningTelemetryInfo.certPinningResultHistogram,
+    MOZ_ASSERT(pinningTelemetryInfo.certPinningResultHistogram.isSome());
+    Telemetry::Accumulate(pinningTelemetryInfo.certPinningResultHistogram.value(),
                           pinningTelemetryInfo.certPinningResultBucket);
   }
 
   if (rv == Success) {
     // Certificate verification succeeded. Delete any potential record of
     // certificate error bits.
     RememberCertErrorsTable::GetInstance().RememberCertHasError(infoObject,
                                                                 nullptr,
--- a/security/manager/ssl/moz.build
+++ b/security/manager/ssl/moz.build
@@ -63,16 +63,17 @@ EXPORTS += [
     'nsClientAuthRemember.h',
     'nsNSSCallbacks.h',
     'nsNSSCertificate.h',
     'nsNSSComponent.h',
     'nsNSSHelper.h',
     'nsRandomGenerator.h',
     'nsSecurityHeaderParser.h',
     'NSSErrorsService.h',
+    'RootCertificateTelemetryUtils.h',
     'ScopedNSSTypes.h',
     'SharedCertVerifier.h',
 ]
 
 EXPORTS.mozilla += [
     'DataStorage.h',
     'DataStorageList.h',
     'PublicSSL.h',
--- a/security/pkix/lib/pkixbuild.cpp
+++ b/security/pkix/lib/pkixbuild.cpp
@@ -56,16 +56,17 @@ public:
     : trustDomain(aTrustDomain)
     , subject(aSubject)
     , time(aTime)
     , requiredEKUIfPresent(aRequiredEKUIfPresent)
     , requiredPolicy(aRequiredPolicy)
     , stapledOCSPResponse(aStapledOCSPResponse)
     , subCACount(aSubCACount)
     , deferredSubjectError(aDeferredSubjectError)
+    , subjectSignaturePublicKeyAlg(der::PublicKeyAlgorithm::Uninitialized)
     , result(Result::FATAL_ERROR_LIBRARY_FAILURE)
     , resultWasSet(false)
     , buildForwardCallBudget(aBuildForwardCallBudget)
   {
   }
 
   Result Check(Input potentialIssuerDER,
                /*optional*/ const Input* additionalNameConstraints,
--- a/security/pkix/lib/pkixcheck.cpp
+++ b/security/pkix/lib/pkixcheck.cpp
@@ -112,17 +112,21 @@ CheckSignatureAlgorithm(TrustDomain& tru
     }
 
     case der::PublicKeyAlgorithm::ECDSA:
       // In theory, we could implement a similar early-pruning optimization for
       // ECDSA curves. However, since there has been no similar deprecation for
       // for any curve that we support, the chances of us encountering a curve
       // during path building is too low to be worth bothering with.
       break;
-
+    case der::PublicKeyAlgorithm::Uninitialized:
+    {
+      assert(false);
+      return Result::FATAL_ERROR_LIBRARY_FAILURE;
+    }
     MOZILLA_PKIX_UNREACHABLE_DEFAULT_ENUM
   }
 
   return Success;
 }
 
 // 4.1.2.4 Issuer
 
--- a/security/pkix/lib/pkixder.h
+++ b/security/pkix/lib/pkixder.h
@@ -452,17 +452,17 @@ CertificateSerialNumber(Reader& input, /
   //   gracefully handle such certificates."
   return internal::IntegralBytes(
            input, INTEGER, internal::IntegralValueRestriction::NoRestriction,
            value);
 }
 
 // x.509 and OCSP both use this same version numbering scheme, though OCSP
 // only supports v1.
-enum class Version { v1 = 0, v2 = 1, v3 = 2, v4 = 3 };
+enum class Version { v1 = 0, v2 = 1, v3 = 2, v4 = 3, Uninitialized = 255 };
 
 // X.509 Certificate and OCSP ResponseData both use
 // "[0] EXPLICIT Version DEFAULT v1". Although an explicit encoding of v1 is
 // illegal, we support it because some real-world OCSP responses explicitly
 // encode it.
 Result OptionalVersion(Reader& input, /*out*/ Version& version);
 
 template <typename ExtensionHandler>
@@ -517,16 +517,17 @@ OptionalExtensions(Reader& input, uint8_
 
 Result DigestAlgorithmIdentifier(Reader& input,
                                  /*out*/ DigestAlgorithm& algorithm);
 
 enum class PublicKeyAlgorithm
 {
   RSA_PKCS1,
   ECDSA,
+  Uninitialized
 };
 
 Result SignatureAlgorithmIdentifierValue(
          Reader& input,
          /*out*/ PublicKeyAlgorithm& publicKeyAlgorithm,
          /*out*/ DigestAlgorithm& digestAlgorithm);
 
 struct SignedDataWithSignature final
--- a/security/pkix/lib/pkixutil.h
+++ b/security/pkix/lib/pkixutil.h
@@ -37,21 +37,23 @@ namespace mozilla { namespace pkix {
 //
 // Each BackCert contains pointers to all the given certificate's extensions
 // so that we can parse the extension block once and then process the
 // extensions in an order that may be different than they appear in the cert.
 class BackCert final
 {
 public:
   // certDER and childCert must be valid for the lifetime of BackCert.
-  BackCert(Input aCertDER, EndEntityOrCA aEndEntityOrCA,
+  BackCert(Input aCertDER,
+           EndEntityOrCA aEndEntityOrCA,
            const BackCert* aChildCert)
     : der(aCertDER)
     , endEntityOrCA(aEndEntityOrCA)
     , childCert(aChildCert)
+    , version(der::Version::Uninitialized)
   {
   }
 
   Result Init();
 
   const Input GetDER() const { return der; }
   const der::SignedDataWithSignature& GetSignedData() const {
     return signedData;
--- a/security/pkix/lib/pkixverify.cpp
+++ b/security/pkix/lib/pkixverify.cpp
@@ -74,16 +74,19 @@ VerifySignedDigest(TrustDomain& trustDom
 {
   switch (publicKeyAlg) {
     case der::PublicKeyAlgorithm::ECDSA:
       return trustDomain.VerifyECDSASignedDigest(signedDigest,
                                                  signerSubjectPublicKeyInfo);
     case der::PublicKeyAlgorithm::RSA_PKCS1:
       return trustDomain.VerifyRSAPKCS1SignedDigest(signedDigest,
                                                     signerSubjectPublicKeyInfo);
+    case der::PublicKeyAlgorithm::Uninitialized:
+      assert(false);
+      return Result::FATAL_ERROR_LIBRARY_FAILURE;
     MOZILLA_PKIX_UNREACHABLE_DEFAULT_ENUM
   }
 }
 
 Result
 VerifySignedData(TrustDomain& trustDomain,
                  const der::SignedDataWithSignature& signedData,
                  Input signerSubjectPublicKeyInfo)
--- a/servo/components/style/properties/declaration_block.rs
+++ b/servo/components/style/properties/declaration_block.rs
@@ -559,61 +559,81 @@ impl PropertyDeclarationBlock {
         if let Some(id) = longhand_id {
             self.longhands.insert(id);
         }
         self.declarations.push(declaration);
         self.declarations_importance.push(importance.important());
         true
     }
 
+    /// Returns the first declaration that would be removed by removing
+    /// `property`.
+    #[inline]
+    pub fn first_declaration_to_remove(
+        &self,
+        property: &PropertyId,
+    ) -> Option<usize> {
+        if let Some(id) = property.longhand_id() {
+            if !self.longhands.contains(id) {
+                return None;
+            }
+        }
+
+        self.declarations.iter().position(|declaration| {
+            declaration.id().is_or_is_longhand_of(property)
+        })
+    }
+
+    /// Removes a given declaration at a given index.
+    #[inline]
+    fn remove_declaration_at(&mut self, i: usize) {
+        {
+            let id = self.declarations[i].id();
+            if let PropertyDeclarationId::Longhand(id) = id {
+                self.longhands.remove(id);
+            }
+            self.declarations_importance.remove(i);
+        }
+        self.declarations.remove(i);
+    }
+
     /// <https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-removeproperty>
     ///
-    /// Returns whether any declaration was actually removed.
-    pub fn remove_property<C>(
+    /// `first_declaration` needs to be the result of
+    /// `first_declaration_to_remove`.
+    #[inline]
+    pub fn remove_property(
         &mut self,
         property: &PropertyId,
-        mut before_change_callback: C,
-    ) -> bool
-    where
-        C: FnMut(&Self),
-    {
-        let longhand_id = property.longhand_id();
-        if let Some(id) = longhand_id {
-            if !self.longhands.contains(id) {
-                return false
-            }
-        }
-        let mut removed_at_least_one = false;
-        let mut i = 0;
+        first_declaration: usize,
+    ) {
+        debug_assert_eq!(
+            Some(first_declaration),
+            self.first_declaration_to_remove(property)
+        );
+        debug_assert!(self.declarations[first_declaration].id().is_or_is_longhand_of(property));
+
+        self.remove_declaration_at(first_declaration);
+
+        let shorthand = match property.as_shorthand() {
+            Ok(s) => s,
+            Err(_longhand_or_custom) => return,
+        };
+
+        let mut i = first_declaration;
         let mut len = self.len();
         while i < len {
-            {
-                let id = self.declarations[i].id();
-                if !id.is_or_is_longhand_of(property) {
-                    i += 1;
-                    continue;
-                }
+            if !self.declarations[i].id().is_longhand_of(shorthand) {
+                i += 1;
+                continue;
+            }
 
-                if !removed_at_least_one {
-                    before_change_callback(&*self);
-                }
-                removed_at_least_one = true;
-                if let PropertyDeclarationId::Longhand(id) = id {
-                    self.longhands.remove(id);
-                }
-                self.declarations_importance.remove(i);
-            }
-            self.declarations.remove(i);
+            self.remove_declaration_at(i);
             len -= 1;
         }
-
-        if longhand_id.is_some() {
-            debug_assert!(removed_at_least_one);
-        }
-        removed_at_least_one
     }
 
     /// Take a declaration block known to contain a single property and serialize it.
     pub fn single_value_to_css(
         &self,
         property: &PropertyId,
         dest: &mut CssStringWriter,
         computed_values: Option<&ComputedValues>,
@@ -722,19 +742,17 @@ impl PropertyDeclarationBlock {
         for declaration in self.normal_declaration_iter() {
             if let PropertyDeclaration::Custom(ref declaration) = *declaration {
                 builder.cascade(&declaration.name, declaration.value.borrow());
             }
         }
 
         builder.build()
     }
-}
 
-impl PropertyDeclarationBlock {
     /// Like the method on ToCss, but without the type parameter to avoid
     /// accidentally monomorphizing this large function multiple times for
     /// different writers.
     ///
     /// https://drafts.csswg.org/cssom/#serialize-a-css-declaration-block
     pub fn to_css(&self, dest: &mut CssStringWriter) -> fmt::Result {
         use std::iter::Cloned;
         use std::slice;
--- a/servo/ports/geckolib/glue.rs
+++ b/servo/ports/geckolib/glue.rs
@@ -162,24 +162,24 @@ use style::values::generics::rect::Rect;
 use style::values::specified;
 use style::values::specified::gecko::{IntersectionObserverRootMargin, PixelOrPercentage};
 use style::values::specified::source_size_list::SourceSizeList;
 use style_traits::{CssType, CssWriter, ParsingMode, StyleParseErrorKind, ToCss};
 use super::error_reporter::ErrorReporter;
 use super::stylesheet_loader::{AsyncStylesheetParser, StylesheetLoader};
 
 trait ClosureHelper {
-    fn invoke(&self, decls: &PropertyDeclarationBlock);
+    fn invoke(&self);
 }
 
 impl ClosureHelper for DeclarationBlockMutationClosure {
     #[inline]
-    fn invoke(&self, decls: &PropertyDeclarationBlock) {
+    fn invoke(&self) {
         if let Some(function) = self.function.as_ref() {
-            unsafe { function(decls, self.data) };
+            unsafe { function(self.data) };
         }
     }
 }
 
 /*
  * For Gecko->Servo function calls, we need to redeclare the same signature that was declared in
  * the C header in Gecko. In order to catch accidental mismatches, we run rust-bindgen against
  * those signatures as well, giving us a second declaration of all the Servo_* functions in this
@@ -1598,17 +1598,19 @@ pub extern "C" fn Servo_StyleSheet_GetSo
     let contents = StylesheetContents::as_arc(&sheet);
     let url_opt = contents.source_url.read();
     if let Some(ref url) = *url_opt {
         write!(unsafe { &mut *result }, "{}", url).unwrap();
     }
 }
 
 fn read_locked_arc<T, R, F>(raw: &<Locked<T> as HasFFI>::FFIType, func: F) -> R
-    where Locked<T>: HasArcFFI, F: FnOnce(&T) -> R
+where
+    Locked<T>: HasArcFFI,
+    F: FnOnce(&T) -> R,
 {
     let global_style_data = &*GLOBAL_STYLE_DATA;
     let guard = global_style_data.shared_lock.read();
     func(Locked::<T>::as_arc(&raw).read_with(&guard))
 }
 
 #[cfg(debug_assertions)]
 unsafe fn read_locked_arc_unchecked<T, R, F>(raw: &<Locked<T> as HasFFI>::FFIType, func: F) -> R
@@ -3407,25 +3409,16 @@ pub unsafe extern "C" fn Servo_Declarati
     result: *mut nsAString,
 ) {
     read_locked_arc(declarations, |decls: &PropertyDeclarationBlock| {
         decls.to_css(&mut *result).unwrap()
     })
 }
 
 #[no_mangle]
-pub unsafe extern "C" fn Servo_UnlockedDeclarationBlock_GetCssText(
-    declarations: *const structs::RawServoUnlockedDeclarationBlock,
-    result: *mut nsAString,
-) {
-    (*declarations).to_css(&mut *result).unwrap()
-}
-
-
-#[no_mangle]
 pub extern "C" fn Servo_DeclarationBlock_SerializeOneValue(
     declarations: RawServoDeclarationBlockBorrowed,
     property_id: nsCSSPropertyID, buffer: *mut nsAString,
     computed_values: ComputedStyleBorrowedOrNull,
     custom_properties: RawServoDeclarationBlockBorrowedOrNull,
 ) {
     let property_id = get_property_id_from_nscsspropertyid!(property_id, ());
 
@@ -3562,19 +3555,20 @@ fn set_property(
         quirks_mode,
         &reporter,
     );
 
     if result.is_err() {
         return false;
     }
 
+    before_change_closure.invoke();
+
     let importance = if is_important { Importance::Important } else { Importance::Normal };
     write_locked_arc(declarations, |decls: &mut PropertyDeclarationBlock| {
-        before_change_closure.invoke(&*decls);
         decls.extend(
             source_declarations.drain(),
             importance,
             DeclarationSource::CssOm
         )
     })
 }
 
@@ -3642,21 +3636,32 @@ pub unsafe extern "C" fn Servo_Declarati
     )
 }
 
 fn remove_property(
     declarations: RawServoDeclarationBlockBorrowed,
     property_id: PropertyId,
     before_change_closure: DeclarationBlockMutationClosure,
 ) -> bool {
+    let first_declaration =
+        read_locked_arc(declarations, |decls: &PropertyDeclarationBlock| {
+            decls.first_declaration_to_remove(&property_id)
+        });
+
+    let first_declaration = match first_declaration {
+        Some(i) => i,
+        None => return false,
+    };
+
+    before_change_closure.invoke();
     write_locked_arc(declarations, |decls: &mut PropertyDeclarationBlock| {
-        decls.remove_property(&property_id, |decls| {
-            before_change_closure.invoke(decls)
-        })
-    })
+        decls.remove_property(&property_id, first_declaration)
+    });
+
+    true
 }
 
 #[no_mangle]
 pub unsafe extern "C" fn Servo_DeclarationBlock_RemoveProperty(
     declarations: RawServoDeclarationBlockBorrowed,
     property: *const nsACString,
     before_change_closure: DeclarationBlockMutationClosure,
 ) -> bool {
--- a/taskcluster/ci/source-test/jsshell.yml
+++ b/taskcluster/ci/source-test/jsshell.yml
@@ -39,8 +39,20 @@ bench-sixspeed:
         symbol: js-bench(6speed)
     run:
         command: >
             cd $USE_ARTIFACT_PATH/build &&
             unzip -qo -d jsshell target.jsshell.zip &&
             export JSSHELL=$USE_ARTIFACT_PATH/build/jsshell/js &&
             cd $GECKO_PATH &&
             ./mach jsshell-bench --binary $JSSHELL --perfherder six-speed
+
+bench-asmjsapps:
+    description: asm.js Apps shell benchmark suite
+    treeherder:
+        symbol: js-bench(asm.js-apps)
+    run:
+        command: >
+            cd $USE_ARTIFACT_PATH/build &&
+            unzip -q -d jsshell target.jsshell.zip &&
+            export JSSHELL=$USE_ARTIFACT_PATH/build/jsshell/js &&
+            cd $GECKO_PATH &&
+            ./mach jsshell-bench --binary $JSSHELL --perfherder asmjs-apps
--- a/testing/jsshell/benchmark.py
+++ b/testing/jsshell/benchmark.py
@@ -194,19 +194,76 @@ class SixSpeed(Benchmark):
             for score, values in scores.items():
                 test_name = "{}-{}".format(self.name, score)
                 total = sum(values) / len(values)
                 self.suite['subtests'].append({'name': test_name, 'value': total})
                 bench_total += int(sum(values))
         self.suite['value'] = bench_total
 
 
+class AsmJSApps(Benchmark):
+    name = 'asmjsapps'
+    path = os.path.join('third_party', 'webkit', 'PerformanceTests', 'asmjs-apps')
+    units = 'ms'
+
+    @property
+    def command(self):
+        if not self.args:
+            self.args = []
+        full_args = ['bash', 'harness.sh', self.shell + " " + " ".join(self.args)]
+        return full_args
+
+    def reset(self):
+        super(AsmJSApps, self).reset()
+
+        # Scores are of the form:
+        # {<bench_name>: {<score_name>: [<values>]}}
+        self.scores = defaultdict(lambda: defaultdict(list))
+
+    def process_results(self, output):
+        total = 0.0
+        tests = []
+        for line in output.splitlines():
+            m = re.search("(.+) - (\d+(\.\d+)?)", line)
+            if not m:
+                continue
+            name = m.group(1)
+            score = m.group(2)
+            total += float(score)
+            tests.append({ 'name': name, 'time': score })
+        tests.append({ 'name': '__total__', 'time': total })
+        return tests
+
+    def process_line(self, output):
+        m = re.search("(.+) - (\d+(\.\d+)?)", output)
+        if not m:
+            return
+        subtest = m.group(1)
+        score = m.group(2)
+        if subtest not in self.scores[self.name]:
+            self.scores[self.name][subtest] = []
+        self.scores[self.name][subtest].append(int(score))
+
+
+    def collect_results(self):
+        bench_total = 0
+        # NOTE: for this benchmark we run the test once, so we have a single value array
+        for bench, scores in self.scores.items():
+            for score, values in scores.items():
+                test_name = "{}-{}".format(self.name, score)
+                total = sum(values) / len(values)
+                self.suite['subtests'].append({'name': test_name, 'value': total})
+                bench_total += int(sum(values))
+        self.suite['value'] = bench_total
+
+
 all_benchmarks = {
     'ares6': Ares6,
     'six-speed': SixSpeed,
+    'asmjs-apps': AsmJSApps,
 }
 
 
 def run(benchmark, binary=None, extra_args=None, perfherder=False):
     if not binary:
         try:
             binary = os.path.join(build.bindir, 'js' + build.substs['BIN_SUFFIX'])
         except BuildEnvironmentNotFoundException:
--- a/testing/web-platform/meta/service-workers/service-worker/fetch-canvas-tainting-video-cache.https.html.ini
+++ b/testing/web-platform/meta/service-workers/service-worker/fetch-canvas-tainting-video-cache.https.html.ini
@@ -1,7 +1,10 @@
 [fetch-canvas-tainting-video-cache.https.html]
+  disabled:
+    if (os == "linux"): https://bugzilla.mozilla.org/show_bug.cgi?id=1464898
+    if (os == "win") and (version == "6.1.7601") and (bits == 32): https://bugzilla.mozilla.org/show_bug.cgi?id=1464898
   [url "https://web-platform.test:8443/service-workers/service-worker/resources/fetch-access-control.py?VIDEO&cache=true&mode=cors&credentials=same-origin&url=https%3A%2F%2Fwww1.web-platform.test%3A8443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FVIDEO%26cache%3Dtrue%26ACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8443" with crossOrigin "" should be NOT_TAINTED]
     expected: FAIL
 
   [url "https://www1.web-platform.test:8443/service-workers/service-worker/resources/fetch-access-control.py?VIDEO&cache=true&mode=cors&credentials=same-origin&url=https%3A%2F%2Fwww1.web-platform.test%3A8443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FVIDEO%26cache%3Dtrue%26ACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8443" with crossOrigin "" should be NOT_TAINTED]
     expected: FAIL
 
--- a/testing/web-platform/tests/css/cssom/getComputedStyle-detached-subtree.html
+++ b/testing/web-platform/tests/css/cssom/getComputedStyle-detached-subtree.html
@@ -7,32 +7,36 @@
 <script src=/resources/testharnessreport.js></script>
 <div id="host">
   <div id="non-slotted">
     <div id="non-slotted-descendant"></div>
   </div>
 </div>
 <iframe srcdoc="<html></html>" style="display: none"></iframe>
 <script>
-function testNoComputedStyle(element, description) {
+function testNoComputedStyle(element, description, global) {
   test(function() {
     assert_true(!!element);
-    let style = getComputedStyle(element);
+    let style = (global ? global : window).getComputedStyle(element);
     assert_true(!!style);
     assert_true(style.length === 0);
     assert_equals(style.color, "");
   }, `getComputedStyle returns no style for ${description}`);
 }
 
 let detached = document.createElement('div');
 testNoComputedStyle(detached, "detached element");
 
 testNoComputedStyle(document.querySelector('iframe').contentDocument.documentElement,
                     "element in non-rendered iframe (display: none)");
 
+testNoComputedStyle(document.querySelector('iframe').contentDocument.documentElement,
+                    "element in non-rendered iframe (display: none) from iframe's window",
+                    document.querySelector('iframe').contentWindow);
+
 host.attachShadow({ mode: "open" });
 testNoComputedStyle(document.getElementById('non-slotted'),
                     "element outside the flat tree");
 
 testNoComputedStyle(document.getElementById('non-slotted-descendant'),
                     "descendant outside the flat tree");
 
 let shadowRoot = detached.attachShadow({ mode: "open" });
new file mode 100644
--- /dev/null
+++ b/third_party/webkit/PerformanceTests/asmjs-apps/README_MOZILLA
@@ -0,0 +1,9 @@
+This is intended to run in jsshell-bench.  We are migrating this from arewefastyet:
+https://github.com/mozilla/arewefastyet/tree/master/benchmarks/asmjs-apps
+
+There is no documentation on where this was pulled from, but it appears to be related to:
+https://github.com/kripken/Massive
+
+This benchmark has .js files which are 'minified' and to save space, we have removed the raw files
+which were stored in directories.  For example, box2d.js comes from the files in box2d/*.  We only
+have box2d.js in here.
new file mode 100644
--- /dev/null
+++ b/third_party/webkit/PerformanceTests/asmjs-apps/VERSION
@@ -0,0 +1,1 @@
+0.20.2
new file mode 100644
--- /dev/null
+++ b/third_party/webkit/PerformanceTests/asmjs-apps/box2d.js
@@ -0,0 +1,197 @@
+function e(a){throw a;}var i=void 0,l=!0,m=null,n=!1;function p(){return function(){}}var q;q||(q=eval("(function() { try { return Module || {} } catch(e) { return {} } })()"));var ba={},s;for(s in q)q.hasOwnProperty(s)&&(ba[s]=q[s]);var u="object"===typeof process&&"function"===typeof require,ca="object"===typeof window,da="function"===typeof importScripts,ea=!ca&&!u&&!da;
+if(u){q.print||(q.print=function(a){process.stdout.write(a+"\n")});q.printErr||(q.printErr=function(a){process.stderr.write(a+"\n")});var fa=require("fs"),ga=require("path");q.read=function(a,b){var a=ga.normalize(a),c=fa.readFileSync(a);!c&&a!=ga.resolve(a)&&(a=path.join(__dirname,"..","src",a),c=fa.readFileSync(a));c&&!b&&(c=c.toString());return c};q.readBinary=function(a){return q.read(a,l)};q.load=function(a){ha(read(a))};q.arguments=process.argv.slice(2);module.exports=q}else ea?(q.print||(q.print=
+print),"undefined"!=typeof printErr&&(q.printErr=printErr),q.read="undefined"!=typeof read?read:function(){e("no read() available (jsc?)")},q.readBinary=function(a){return read(a,"binary")},"undefined"!=typeof scriptArgs?q.arguments=scriptArgs:"undefined"!=typeof arguments&&(q.arguments=arguments),this.Module=q,eval("if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined")):ca||da?(q.read=function(a){var b=new XMLHttpRequest;b.open("GET",a,n);b.send(m);return b.responseText},
+"undefined"!=typeof arguments&&(q.arguments=arguments),"undefined"!==typeof console?(q.print||(q.print=function(a){console.log(a)}),q.printErr||(q.printErr=function(a){console.log(a)})):q.print||(q.print=p()),ca?window.Module=q:q.load=importScripts):e("Unknown runtime environment. Where are we?");function ha(a){eval.call(m,a)}"undefined"==!q.load&&q.read&&(q.load=function(a){ha(q.read(a))});q.print||(q.print=p());q.printErr||(q.printErr=q.print);q.arguments||(q.arguments=[]);q.print=q.print;q.K=q.printErr;
+q.preRun=[];q.postRun=[];for(s in ba)ba.hasOwnProperty(s)&&(q[s]=ba[s]);
+var x={wc:function(a){ia=a},cc:function(){return ia},Wa:function(){return v},Va:function(a){v=a},Le:function(a,b){b=b||4;return 1==b?a:isNumber(a)&&isNumber(b)?Math.ceil(a/b)*b:isNumber(b)&&isPowerOfTwo(b)?"((("+a+")+"+(b-1)+")&"+-b+")":"Math.ceil(("+a+")/"+b+")*"+b},jc:function(a){return a in x.Qb||a in x.Ob},kc:function(a){return"*"==a[a.length-1]},lc:function(a){return isPointerType(a)?n:isArrayType(a)||/<?\{ ?[^}]* ?\}>?/.test(a)?l:"%"==a[0]},Qb:{i1:0,i8:0,i16:0,i32:0,i64:0},Ob:{"float":0,"double":0},
+bf:function(a,b){return(a|0|b|0)+4294967296*(Math.round(a/4294967296)|Math.round(b/4294967296))},Ae:function(a,b){return((a|0)&(b|0))+4294967296*(Math.round(a/4294967296)&Math.round(b/4294967296))},hf:function(a,b){return((a|0)^(b|0))+4294967296*(Math.round(a/4294967296)^Math.round(b/4294967296))},La:function(a){switch(a){case "i1":case "i8":return 1;case "i16":return 2;case "i32":return 4;case "i64":return 8;case "float":return 4;case "double":return 8;default:return"*"===a[a.length-1]?x.Q:"i"===
+a[0]?(a=parseInt(a.substr(1)),z(0===a%8),a/8):0}},pb:function(a){return Math.max(x.La(a),x.Q)},Zb:function(a,b){var c={};return b?a.filter(function(a){return c[a[b]]?n:c[a[b]]=l}):a.filter(function(a){return c[a]?n:c[a]=l})},set:function(){for(var a="object"===typeof arguments[0]?arguments[0]:arguments,b={},c=0;c<a.length;c++)b[a[c]]=0;return b},qe:8,Ka:function(a,b,c){return!c&&("i64"==a||"double"==a)?8:!a?Math.min(b,8):Math.min(b||(a?x.pb(a):0),x.Q)},Vb:function(a){a.D=0;a.V=0;var b=[],c=-1,d=0;
+a.nb=a.Ha.map(function(f){d++;var g,h;x.jc(f)||x.kc(f)?(g=x.La(f),h=x.Ka(f,g)):x.lc(f)?"0"===f[1]?(g=0,h=Types.types[f]?x.Ka(m,Types.types[f].V):a.V||QUANTUM_SIZE):(g=Types.types[f].D,h=x.Ka(m,Types.types[f].V)):"b"==f[0]?(g=f.substr(1)|0,h=1):"<"===f[0]?g=h=Types.types[f].D:"i"===f[0]?(g=h=parseInt(f.substr(1))/8,z(0===g%1,"cannot handle non-byte-size field "+f)):z(n,"invalid type for calculateStructAlignment");a.cf&&(h=1);a.V=Math.max(a.V,h);f=x.U(a.D,h);a.D=f+g;0<=c&&b.push(f-c);return c=f});a.vb&&
+"["===a.vb[0]&&(a.D=parseInt(a.vb.substr(1))*a.D/2);a.D=x.U(a.D,a.V);0==b.length?a.mb=a.D:1==x.Zb(b).length&&(a.mb=b[0]);a.Ye=1!=a.mb;return a.nb},ac:function(a,b,c){var d,f;if(b){c=c||0;d=("undefined"===typeof Types?x.gf:Types.types)[b];if(!d)return m;if(d.Ha.length!=a.length)return printErr("Number of named fields must match the type for "+b+": possibly duplicate struct names. Cannot return structInfo"),m;f=d.nb}else d={Ha:a.map(function(a){return a[0]})},f=x.Vb(d);var g={se:d.D};b?a.forEach(function(a,
+b){if("string"===typeof a)g[a]=f[b]+c;else{var j,y;for(y in a)j=y;g[j]=x.ac(a[j],d.Ha[b],f[b])}}):a.forEach(function(a,b){g[a[1]]=f[b]});return g},ba:function(a,b,c){return c&&c.length?(c.splice||(c=Array.prototype.slice.call(c)),c.splice(0,0,b),q["dynCall_"+a].apply(m,c)):q["dynCall_"+a].call(m,b)},pa:[],te:function(a){for(var b=0;b<x.pa.length;b++)if(!x.pa[b])return x.pa[b]=a,2*(1+b);e("Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.")},ef:function(a){x.pa[(a-
+2)/2]=m},Me:function(a,b){x.Fa||(x.Fa={});var c=x.Fa[a];if(c)return c;for(var c=[],d=0;d<b;d++)c.push(String.fromCharCode(36)+d);d=B(a);'"'===d[0]&&(d.indexOf('"',1)===d.length-1?d=d.substr(1,d.length-2):E("invalid EM_ASM input |"+d+"|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)"));try{var f=eval("(function("+c.join(",")+"){ "+d+" })")}catch(g){q.K("error in executing inline EM_ASM code: "+g+" on: \n\n"+d+"\n\nwith args |"+c+"| (make sure to use the right one out of EM_ASM, EM_ASM_ARGS, etc.)"),
+e(g)}return x.Fa[a]=f},fa:function(a){x.fa.Ta||(x.fa.Ta={});x.fa.Ta[a]||(x.fa.Ta[a]=1,q.K(a))},Ja:{},Oe:function(a,b){z(b);x.Ja[a]||(x.Ja[a]=function(){return x.ba(b,a,arguments)});return x.Ja[a]},Ea:function(){var a=[],b=0;this.Pa=function(c){c&=255;if(0==a.length){if(0==(c&128))return String.fromCharCode(c);a.push(c);b=192==(c&224)?1:224==(c&240)?2:3;return""}if(b&&(a.push(c),b--,0<b))return"";var c=a[0],d=a[1],f=a[2],g=a[3];2==a.length?c=String.fromCharCode((c&31)<<6|d&63):3==a.length?c=String.fromCharCode((c&
+15)<<12|(d&63)<<6|f&63):(c=(c&7)<<18|(d&63)<<12|(f&63)<<6|g&63,c=String.fromCharCode(Math.floor((c-65536)/1024)+55296,(c-65536)%1024+56320));a.length=0;return c};this.rc=function(a){for(var a=unescape(encodeURIComponent(a)),b=[],f=0;f<a.length;f++)b.push(a.charCodeAt(f));return b}},Ne:function(){e("You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work")},Ua:function(a){var b=v;v=v+a|0;v=v+7&-8;return b},Cb:function(a){var b=ja;
+ja=ja+a|0;ja=ja+7&-8;return b},ca:function(a){var b=G;G=G+a|0;G=G+7&-8;G>=ka&&E("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+ka+", (2) compile with ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.");return b},U:function(a,b){return Math.ceil(a/(b?b:8))*(b?b:8)},nc:function(a,b,c){return c?+(a>>>0)+4294967296*+(b>>>0):+(a>>>0)+4294967296*+(b|
+0)},Pb:8,Q:4,re:0};q.Runtime=x;var J=n,la,ma,ia;function z(a,b){a||E("Assertion failed: "+b)}q.ccall=function(a,b,c,d){return na(oa(a),b,c,d)};function oa(a){try{var b=q["_"+a];b||(b=eval("_"+a))}catch(c){}z(b,"Cannot call unknown function "+a+" (perhaps LLVM optimizations or closure removed it?)");return b}
+function na(a,b,c,d){function f(a,b){if("string"==b){if(a===m||a===i||0===a)return 0;a=K(a);b="array"}if("array"==b){g||(g=x.Wa());var c=x.Ua(a.length);pa(a,c);return c}return a}var g=0,h=0,d=d?d.map(function(a){return f(a,c[h++])}):[];a=a.apply(m,d);"string"==b?b=B(a):(z("array"!=b),b=a);g&&x.Va(g);return b}q.cwrap=function(a,b,c){var d=oa(a);return function(){return na(d,b,c,Array.prototype.slice.call(arguments))}};
+function qa(a,b,c){c=c||"i8";"*"===c.charAt(c.length-1)&&(c="i32");switch(c){case "i1":L[a>>0]=b;break;case "i8":L[a>>0]=b;break;case "i16":ra[a>>1]=b;break;case "i32":M[a>>2]=b;break;case "i64":ma=[b>>>0,(la=b,1<=+sa(la)?0<la?(ta(+ua(la/4294967296),4294967295)|0)>>>0:~~+va((la-+(~~la>>>0))/4294967296)>>>0:0)];M[a>>2]=ma[0];M[a+4>>2]=ma[1];break;case "float":wa[a>>2]=b;break;case "double":xa[a>>3]=b;break;default:E("invalid type for setValue: "+c)}}q.setValue=qa;
+q.getValue=function(a,b){b=b||"i8";"*"===b.charAt(b.length-1)&&(b="i32");switch(b){case "i1":return L[a>>0];case "i8":return L[a>>0];case "i16":return ra[a>>1];case "i32":return M[a>>2];case "i64":return M[a>>2];case "float":return wa[a>>2];case "double":return xa[a>>3];default:E("invalid type for setValue: "+b)}return m};var ya=1,N=2,za=4;q.ALLOC_NORMAL=0;q.ALLOC_STACK=ya;q.ALLOC_STATIC=N;q.ALLOC_DYNAMIC=3;q.ALLOC_NONE=za;
+function O(a,b,c,d){var f,g;"number"===typeof a?(f=l,g=a):(f=n,g=a.length);var h="string"===typeof b?b:m,c=c==za?d:[Aa,x.Ua,x.Cb,x.ca][c===i?N:c](Math.max(g,h?1:b.length));if(f){d=c;z(0==(c&3));for(a=c+(g&-4);d<a;d+=4)M[d>>2]=0;for(a=c+g;d<a;)L[d++>>0]=0;return c}if("i8"===h)return a.subarray||a.slice?P.set(a,c):P.set(new Uint8Array(a),c),c;for(var d=0,k,j;d<g;){var y=a[d];"function"===typeof y&&(y=x.Pe(y));f=h||b[d];0===f?d++:("i64"==f&&(f="i32"),qa(c+d,y,f),j!==f&&(k=x.La(f),j=f),d+=k)}return c}
+q.allocate=O;function B(a,b){for(var c=n,d,f=0;;){d=P[a+f>>0];if(128<=d)c=l;else if(0==d&&!b)break;f++;if(b&&f==b)break}b||(b=f);var g="";if(!c){for(;0<b;)d=String.fromCharCode.apply(String,P.subarray(a,a+Math.min(b,1024))),g=g?g+d:d,a+=1024,b-=1024;return g}c=new x.Ea;for(f=0;f<b;f++)d=P[a+f>>0],g+=c.Pa(d);return g}q.Pointer_stringify=B;q.UTF16ToString=function(a){for(var b=0,c="";;){var d=ra[a+2*b>>1];if(0==d)return c;++b;c+=String.fromCharCode(d)}};
+q.stringToUTF16=function(a,b){for(var c=0;c<a.length;++c)ra[b+2*c>>1]=a.charCodeAt(c);ra[b+2*a.length>>1]=0};q.UTF32ToString=function(a){for(var b=0,c="";;){var d=M[a+4*b>>2];if(0==d)return c;++b;65536<=d?(d-=65536,c+=String.fromCharCode(55296|d>>10,56320|d&1023)):c+=String.fromCharCode(d)}};q.stringToUTF32=function(a,b){for(var c=0,d=0;d<a.length;++d){var f=a.charCodeAt(d);if(55296<=f&&57343>=f)var g=a.charCodeAt(++d),f=65536+((f&1023)<<10)|g&1023;M[b+4*c>>2]=f;++c}M[b+4*c>>2]=0};
+function Ba(a){function b(h,j,y){var j=j||Infinity,F="",r=[],w;if("N"===a[c]){c++;"K"===a[c]&&c++;for(w=[];"E"!==a[c];)if("S"===a[c]){c++;var C=a.indexOf("_",c);w.push(f[a.substring(c,C)||0]||"?");c=C+1}else if("C"===a[c])w.push(w[w.length-1]),c+=2;else{var C=parseInt(a.substr(c)),H=C.toString().length;if(!C||!H){c--;break}var I=a.substr(c+H,C);w.push(I);f.push(I);c+=H+C}c++;w=w.join("::");j--;if(0===j)return h?[w]:w}else if(("K"===a[c]||g&&"L"===a[c])&&c++,C=parseInt(a.substr(c)))H=C.toString().length,
+w=a.substr(c+H,C),c+=H+C;g=n;"I"===a[c]?(c++,C=b(l),H=b(l,1,l),F+=H[0]+" "+w+"<"+C.join(", ")+">"):F=w;a:for(;c<a.length&&0<j--;)if(w=a[c++],w in d)r.push(d[w]);else switch(w){case "P":r.push(b(l,1,l)[0]+"*");break;case "R":r.push(b(l,1,l)[0]+"&");break;case "L":c++;C=a.indexOf("E",c)-c;r.push(a.substr(c,C));c+=C+2;break;case "A":C=parseInt(a.substr(c));c+=C.toString().length;"_"!==a[c]&&e("?");c++;r.push(b(l,1,l)[0]+" ["+C+"]");break;case "E":break a;default:F+="?"+w;break a}!y&&(1===r.length&&"void"===
+r[0])&&(r=[]);return h?(F&&r.push(F+"?"),r):F+("("+r.join(", ")+")")}var c=3,d={v:"void",b:"bool",c:"char",s:"short",i:"int",l:"long",f:"float",d:"double",w:"wchar_t",a:"signed char",h:"unsigned char",t:"unsigned short",j:"unsigned int",m:"unsigned long",x:"long long",y:"unsigned long long",z:"..."},f=[],g=l;try{if("Object._main"==a||"_main"==a)return"main()";"number"===typeof a&&(a=B(a));if("_"!==a[0]||"_"!==a[1]||"Z"!==a[2])return a;switch(a[3]){case "n":return"operator new()";case "d":return"operator delete()"}return b()}catch(h){return a}}
+function Ca(){var a=Error().stack;return a?a.replace(/__Z[\w\d_]+/g,function(a){var c=Ba(a);return a===c?a:a+" ["+c+"]"}):"(no stack trace available)"}for(var L,P,ra,Da,M,Ea,wa,xa,Fa=0,ja=0,Ga=0,v=0,Ha=0,Ia=0,G=0,Ja=q.TOTAL_STACK||5242880,ka=q.TOTAL_MEMORY||134217728,Q=4096;Q<ka||Q<2*Ja;)Q=16777216>Q?2*Q:Q+16777216;Q!==ka&&(q.K("increasing TOTAL_MEMORY to "+Q+" to be more reasonable"),ka=Q);
+z("undefined"!==typeof Int32Array&&"undefined"!==typeof Float64Array&&!!(new Int32Array(1)).subarray&&!!(new Int32Array(1)).set,"JS engine does not provide full typed array support");var R=new ArrayBuffer(ka);L=new Int8Array(R);ra=new Int16Array(R);M=new Int32Array(R);P=new Uint8Array(R);Da=new Uint16Array(R);Ea=new Uint32Array(R);wa=new Float32Array(R);xa=new Float64Array(R);M[0]=255;z(255===P[0]&&0===P[3],"Typed arrays 2 must be run on a little-endian system");q.HEAP=i;q.HEAP8=L;q.HEAP16=ra;
+q.HEAP32=M;q.HEAPU8=P;q.HEAPU16=Da;q.HEAPU32=Ea;q.HEAPF32=wa;q.HEAPF64=xa;function Ka(a){for(;0<a.length;){var b=a.shift();if("function"==typeof b)b();else{var c=b.R;"number"===typeof c?b.ka===i?x.ba("v",c):x.ba("vi",c,[b.ka]):c(b.ka===i?m:b.ka)}}}var La=[],Ma=[],Na=[],Oa=[],Pa=[],Qa=n;function Ra(a){La.unshift(a)}q.addOnPreRun=q.ye=Ra;q.addOnInit=q.ve=function(a){Ma.unshift(a)};q.addOnPreMain=q.xe=function(a){Na.unshift(a)};q.addOnExit=q.ue=function(a){Oa.unshift(a)};
+function Sa(a){Pa.unshift(a)}q.addOnPostRun=q.we=Sa;function K(a,b,c){a=(new x.Ea).rc(a);c&&(a.length=c);b||a.push(0);return a}q.intArrayFromString=K;q.intArrayToString=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c];255<d&&(d&=255);b.push(String.fromCharCode(d))}return b.join("")};q.writeStringToMemory=function(a,b,c){a=K(a,c);for(c=0;c<a.length;)L[b+c>>0]=a[c],c+=1};function pa(a,b){for(var c=0;c<a.length;c++)L[b+c>>0]=a[c]}q.writeArrayToMemory=pa;
+q.writeAsciiToMemory=function(a,b,c){for(var d=0;d<a.length;d++)L[b+d>>0]=a.charCodeAt(d);c||(L[b+a.length>>0]=0)};function Ta(a,b){return 0<=a?a:32>=b?2*Math.abs(1<<b-1)+a:Math.pow(2,b)+a}function Ua(a,b){if(0>=a)return a;var c=32>=b?Math.abs(1<<b-1):Math.pow(2,b-1);if(a>=c&&(32>=b||a>c))a=-2*c+a;return a}if(!Math.imul||-5!==Math.imul(4294967295,5))Math.imul=function(a,b){var c=a&65535,d=b&65535;return c*d+((a>>>16)*d+c*(b>>>16)<<16)|0};Math.Se=Math.imul;
+var sa=Math.abs,Va=Math.cos,Wa=Math.sin,Xa=Math.sqrt,va=Math.ceil,ua=Math.floor,ta=Math.min,S=0,Ya=m,Za=m;function $a(){S++;q.monitorRunDependencies&&q.monitorRunDependencies(S)}q.addRunDependency=$a;function ab(){S--;q.monitorRunDependencies&&q.monitorRunDependencies(S);if(0==S&&(Ya!==m&&(clearInterval(Ya),Ya=m),Za)){var a=Za;Za=m;a()}}q.removeRunDependency=ab;q.preloadedImages={};q.preloadedAudios={};var bb=7024,cb=7064,Fa=8,ja=Fa+x.U(7731);Ma.push();
+O([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,118,72,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,114,114,111,114,58,32,37,100,92,110,0,0,0,0,0,102,114,97,109,101,32,97,118,101,114,97,103,101,115,58,32,37,46,51,102,32,43,45,32,37,46,51,102,44,32,114,97,110,103,101,58,32,37,46,51,102,32,116,111,32,37,46,51,102,32,10,0,0,0,0,0,105,102,32,40,77,111,100,117,108,101,46,114,101,112,111,114,116,67,111,109,112,108,101,116,105,111,110,41,32,
+77,111,100,117,108,101,46,114,101,112,111,114,116,67,111,109,112,108,101,116,105,111,110,40,41,0,0,114,101,115,112,111,110,115,105,118,101,32,109,97,105,110,32,108,111,111,112,0,0,0,0,0,0,0,0,56,1,0,0,1,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,49,49,98,50,69,100,103,101,83,104,97,112,101,0,0,0,55,98,50,83,104,97,112,101,0,0,0,0,0,0,0,0,120,27,0,0,32,1,0,0,160,27,0,0,16,1,0,0,48,1,0,0,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,83,104,97,112,101,115,47,98,
+50,80,111,108,121,103,111,110,83,104,97,112,101,46,99,112,112,0,0,0,0,0,0,0,48,46,48,102,32,60,61,32,108,111,119,101,114,32,38,38,32,108,111,119,101,114,32,60,61,32,105,110,112,117,116,46,109,97,120,70,114,97,99,116,105,111,110,0,0,0,0,0,82,97,121,67,97,115,116,0,109,95,118,101,114,116,101,120,67,111,117,110,116,32,62,61,32,51,0,0,0,0,0,0,67,111,109,112,117,116,101,77,97,115,115,0,0,0,0,0,97,114,101,97,32,62,32,49,46,49,57,50,48,57,50,57,48,101,45,48,55,70,0,0,0,0,0,0,48,2,0,0,3,0,0,0,4,0,0,0,2,0,
+0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,49,52,98,50,80,111,108,121,103,111,110,83,104,97,112,101,0,0,0,0,0,0,0,0,160,27,0,0,24,2,0,0,48,1,0,0,0,0,0,0,16,0,0,0,32,0,0,0,64,0,0,0,96,0,0,0,128,0,0,0,160,0,0,0,192,0,0,0,224,0,0,0,0,1,0,0,64,1,0,0,128,1,0,0,192,1,0,0,0,2,0,0,128,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,32,60,32,98,50,95,98,108,111,99,107,83,105,122,101,115,0,0,0,0,0,0,0,66,111,120,50,68,47,67,111,109,109,111,110,47,98,50,66,108,111,99,107,65,108,108,111,99,97,116,111,114,46,99,112,112,0,0,0,0,0,0,0,98,50,66,108,111,99,107,65,108,108,111,99,97,116,111,114,0,0,0,0,0,0,0,0,48,32,60,32,115,105,122,101,0,0,0,0,0,0,0,0,65,108,108,111,99,97,116,101,0,0,0,0,0,0,0,0,48,32,60,61,32,105,110,100,101,120,32,38,38,
+32,105,110,100,101,120,32,60,32,98,50,95,98,108,111,99,107,83,105,122,101,115,0,0,0,0,0,98,108,111,99,107,67,111,117,110,116,32,42,32,98,108,111,99,107,83,105,122,101,32,60,61,32,98,50,95,99,104,117,110,107,83,105,122,101,0,0,70,114,101,101,0,0,0,0,98,100,45,62,112,111,115,105,116,105,111,110,46,73,115,86,97,108,105,100,40,41,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,98,50,66,111,100,121,46,99,112,112,0,0,0,0,0,0,0,98,50,66,111,100,121,0,0,98,100,45,62,108,105,110,101,97,114,86,101,
+108,111,99,105,116,121,46,73,115,86,97,108,105,100,40,41,0,0,0,0,98,50,73,115,86,97,108,105,100,40,98,100,45,62,97,110,103,108,101,41,0,0,0,0,98,50,73,115,86,97,108,105,100,40,98,100,45,62,97,110,103,117,108,97,114,86,101,108,111,99,105,116,121,41,0,0,98,50,73,115,86,97,108,105,100,40,98,100,45,62,97,110,103,117,108,97,114,68,97,109,112,105,110,103,41,32,38,38,32,98,100,45,62,97,110,103,117,108,97,114,68,97,109,112,105,110,103,32,62,61,32,48,46,48,102,0,0,0,0,0,98,50,73,115,86,97,108,105,100,40,98,
+100,45,62,108,105,110,101,97,114,68,97,109,112,105,110,103,41,32,38,38,32,98,100,45,62,108,105,110,101,97,114,68,97,109,112,105,110,103,32,62,61,32,48,46,48,102,0,0,0,0,0,0,0,109,95,119,111,114,108,100,45,62,73,115,76,111,99,107,101,100,40,41,32,61,61,32,102,97,108,115,101,0,0,0,0,67,114,101,97,116,101,70,105,120,116,117,114,101,0,0,0,109,95,116,121,112,101,32,61,61,32,98,50,95,100,121,110,97,109,105,99,66,111,100,121,0,0,0,0,0,0,0,0,82,101,115,101,116,77,97,115,115,68,97,116,97,0,0,0,109,95,73,32,
+62,32,48,46,48,102,0,0,0,0,0,0,0,10,0,0,0,0,0,0,240,7,0,0,0,0,0,0,48,32,60,61,32,112,114,111,120,121,73,100,32,38,38,32,112,114,111,120,121,73,100,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,0,0,0,0,0,0,46,47,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,68,121,110,97,109,105,99,84,114,101,101,46,104,0,0,0,0,0,0,0,71,101,116,85,115,101,114,68,97,116,97,0,0,0,0,0,71,101,116,70,97,116,65,65,66,66,0,0,0,0,0,0,0,0,0,0,32,8,0,0,5,0,0,0,6,0,0,0,1,0,0,0,2,0,0,0,1,0,
+0,0,2,0,0,0,49,55,98,50,67,111,110,116,97,99,116,76,105,115,116,101,110,101,114,0,0,0,0,0,120,27,0,0,8,8,0,0,109,95,112,114,111,120,121,67,111,117,110,116,32,61,61,32,48,0,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,98,50,70,105,120,116,117,114,101,46,99,112,112,0,0,0,0,67,114,101,97,116,101,80,114,111,120,105,101,115,0,0,0,73,115,76,111,99,107,101,100,40,41,32,61,61,32,102,97,108,115,101,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,98,50,87,111,114,108,100,46,
+99,112,112,0,0,0,0,0,0,67,114,101,97,116,101,66,111,100,121,0,0,0,0,0,0,98,45,62,73,115,65,99,116,105,118,101,40,41,32,61,61,32,116,114,117,101,0,0,0,83,111,108,118,101,0,0,0,115,116,97,99,107,67,111,117,110,116,32,60,32,115,116,97,99,107,83,105,122,101,0,0,116,121,112,101,65,32,61,61,32,98,50,95,100,121,110,97,109,105,99,66,111,100,121,32,124,124,32,116,121,112,101,66,32,61,61,32,98,50,95,100,121,110,97,109,105,99,66,111,100,121,0,0,0,0,0,0,83,111,108,118,101,84,79,73,0,0,0,0,0,0,0,0,97,108,112,
+104,97,48,32,60,32,49,46,48,102,0,0,0,46,47,66,111,120,50,68,47,67,111,109,109,111,110,47,98,50,77,97,116,104,46,104,0,65,100,118,97,110,99,101,0,109,95,106,111,105,110,116,67,111,117,110,116,32,60,32,109,95,106,111,105,110,116,67,97,112,97,99,105,116,121,0,0,46,47,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,98,50,73,115,108,97,110,100,46,104,0,0,0,0,0,65,100,100,0,0,0,0,0,109,95,99,111,110,116,97,99,116,67,111,117,110,116,32,60,32,109,95,99,111,110,116,97,99,116,67,97,112,97,99,105,116,121,
+0,0,0,0,0,0,109,95,98,111,100,121,67,111,117,110,116,32,60,32,109,95,98,111,100,121,67,97,112,97,99,105,116,121,0,0,0,0,0,0,0,0,40,10,0,0,7,0,0,0,8,0,0,0,3,0,0,0,0,0,0,0,49,53,98,50,67,111,110,116,97,99,116,70,105,108,116,101,114,0,0,0,0,0,0,0,120,27,0,0,16,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,32,60,61,32,105,110,100,101,120,32,38,38,32,105,110,100,101,120,32,60,32,99,104,97,105,110,45,62,109,95,99,111,117,110,116,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,
+47,98,50,68,105,115,116,97,110,99,101,46,99,112,112,0,0,83,101,116,0,0,0,0,0,102,97,108,115,101,0,0,0,98,50,68,105,115,116,97,110,99,101,0,0,0,0,0,0,71,101,116,77,101,116,114,105,99,0,0,0,0,0,0,0,71,101,116,87,105,116,110,101,115,115,80,111,105,110,116,115,0,0,0,0,0,0,0,0,48,32,60,61,32,105,110,100,101,120,32,38,38,32,105,110,100,101,120,32,60,32,109,95,99,111,117,110,116,0,0,0,46,47,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,68,105,115,116,97,110,99,101,46,104,0,0,71,101,116,
+86,101,114,116,101,120,0,0,0,0,0,0,0,71,101,116,67,108,111,115,101,115,116,80,111,105,110,116,0,99,97,99,104,101,45,62,99,111,117,110,116,32,60,61,32,51,0,0,0,0,0,0,0,82,101,97,100,67,97,99,104,101,0,0,0,0,0,0,0,109,95,110,111,100,101,67,111,117,110,116,32,61,61,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,68,121,110,97,109,105,99,84,114,101,101,46,99,112,112,0,0,0,0,0,0,0,65,108,108,111,99,97,116,101,78,111,100,101,0,
+0,0,0,48,32,60,61,32,110,111,100,101,73,100,32,38,38,32,110,111,100,101,73,100,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,70,114,101,101,78,111,100,101,0,0,0,0,0,0,0,0,48,32,60,32,109,95,110,111,100,101,67,111,117,110,116,0,48,32,60,61,32,112,114,111,120,121,73,100,32,38,38,32,112,114,111,120,121,73,100,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,0,0,0,0,0,0,109,95,110,111,100,101,115,91,112,114,111,120,121,73,100,93,46,73,115,76,101,97,102,40,41,0,0,0,0,0,
+0,0,77,111,118,101,80,114,111,120,121,0,0,0,0,0,0,0,99,104,105,108,100,49,32,33,61,32,40,45,49,41,0,0,73,110,115,101,114,116,76,101,97,102,0,0,0,0,0,0,99,104,105,108,100,50,32,33,61,32,40,45,49,41,0,0,105,65,32,33,61,32,40,45,49,41,0,0,0,0,0,0,66,97,108,97,110,99,101,0,48,32,60,61,32,105,66,32,38,38,32,105,66,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,48,32,60,61,32,105,67,32,38,38,32,105,67,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,48,32,60,61,32,105,70,
+32,38,38,32,105,70,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,48,32,60,61,32,105,71,32,38,38,32,105,71,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,109,95,110,111,100,101,115,91,67,45,62,112,97,114,101,110,116,93,46,99,104,105,108,100,50,32,61,61,32,105,65,0,48,32,60,61,32,105,68,32,38,38,32,105,68,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,48,32,60,61,32,105,69,32,38,38,32,105,69,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,
+121,0,0,109,95,110,111,100,101,115,91,66,45,62,112,97,114,101,110,116,93,46,99,104,105,108,100,50,32,61,61,32,105,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,116,97,114,103,101,116,32,62,32,116,111,108,101,114,97,110,99,101,0,0,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,84,105,109,101,79,102,73,109,112,97,99,116,46,99,112,112,0,0,0,0,0,0,98,50,84,105,109,101,79,102,73,109,112,97,99,116,0,0,102,97,108,115,101,0,0,0,69,118,97,108,
+117,97,116,101,0,0,0,0,0,0,0,0,48,32,60,61,32,105,110,100,101,120,32,38,38,32,105,110,100,101,120,32,60,32,109,95,99,111,117,110,116,0,0,0,46,47,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,68,105,115,116,97,110,99,101,46,104,0,0,71,101,116,86,101,114,116,101,120,0,0,0,0,0,0,0,70,105,110,100,77,105,110,83,101,112,97,114,97,116,105,111,110,0,0,0,0,0,0,0,48,32,60,32,99,111,117,110,116,32,38,38,32,99,111,117,110,116,32,60,32,51,0,0,73,110,105,116,105,97,108,105,122,101,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,109,95,105,110,100,101,120,32,61,61,32,48,0,0,0,0,66,111,120,50,68,47,67,111,109,109,111,110,47,98,50,83,116,97,99,107,65,108,108,111,99,97,116,111,114,46,99,112,112,0,0,0,0,0,0,0,126,98,50,83,116,97,99,107,65,108,108,111,99,97,116,111,114,0,0,0,0,0,0,0,109,95,101,110,116,114,121,67,111,117,110,116,32,61,61,32,48,0,0,0,0,0,0,0,109,95,101,110,116,114,121,67,111,117,110,116,32,60,32,98,50,95,109,97,120,83,116,97,99,107,69,110,116,114,105,101,115,0,0,0,0,0,0,0,65,108,108,111,99,97,116,
+101,0,0,0,0,0,0,0,0,109,95,101,110,116,114,121,67,111,117,110,116,32,62,32,48,0,0,0,0,0,0,0,0,70,114,101,101,0,0,0,0,112,32,61,61,32,101,110,116,114,121,45,62,100,97,116,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,32,60,61,32,116,121,112,101,49,32,38,38,32,116,121,112,101,49,32,60,32,98,50,83,104,97,112,101,58,58,101,95,116,121,112,101,67,111,117,110,116,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,67,111,110,116,97,99,116,46,99,112,112,0,0,0,48,32,60,61,32,116,121,112,101,50,32,38,38,32,116,121,112,101,50,32,60,32,98,50,83,104,97,112,101,58,58,101,95,116,121,112,
+101,67,111,117,110,116,0,0,0,0,0,0,67,114,101,97,116,101,0,0,115,95,105,110,105,116,105,97,108,105,122,101,100,32,61,61,32,116,114,117,101,0,0,0,68,101,115,116,114,111,121,0,48,32,60,61,32,116,121,112,101,65,32,38,38,32,116,121,112,101,66,32,60,32,98,50,83,104,97,112,101,58,58,101,95,116,121,112,101,67,111,117,110,116,0,0,0,0,0,0,0,0,0,0,120,17,0,0,1,0,0,0,9,0,0,0,10,0,0,0,0,0,0,0,57,98,50,67,111,110,116,97,99,116,0,0,0,0,0,0,120,27,0,0,104,17,0,0,0,0,0,0,104,18,0,0,3,0,0,0,11,0,0,0,12,0,0,0,0,0,
+0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,101,100,103,101,0,0,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,69,100,103,101,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,0,0,98,50,69,100,103,101,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,
+40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,105,114,99,108,101,0,0,0,0,0,0,50,50,98,50,69,100,103,101,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,0,0,0,0,0,0,160,27,0,0,72,18,0,0,120,17,0,0,0,0,0,0,0,0,0,0,96,19,0,0,4,0,0,0,13,0,0,0,14,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,101,100,103,101,0,0,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,
+116,97,99,116,115,47,98,50,69,100,103,101,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,0,98,50,69,100,103,101,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,112,111,108,121,103,111,110,0,0,0,0,0,50,51,98,50,69,100,103,101,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,0,0,0,0,0,0,160,27,0,0,64,19,0,
+0,120,17,0,0,0,0,0,0,0,0,0,0,96,20,0,0,5,0,0,0,15,0,0,0,16,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,112,111,108,121,103,111,110,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,80,111,108,121,103,111,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,46,99,112,112,0,0,0,98,50,80,111,108,121,103,111,110,65,110,100,67,105,114,99,108,101,67,111,
+110,116,97,99,116,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,105,114,99,108,101,0,0,0,0,0,0,50,53,98,50,80,111,108,121,103,111,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,0,0,0,160,27,0,0,64,20,0,0,120,17,0,0,0,0,0,0,0,0,0,0,72,21,0,0,6,0,0,0,17,0,0,0,18,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,
+58,58,101,95,112,111,108,121,103,111,110,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,80,111,108,121,103,111,110,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,98,50,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,112,111,108,121,103,111,110,0,0,0,0,0,49,54,98,50,80,111,108,121,103,111,110,67,111,110,
+116,97,99,116,0,0,0,0,0,0,160,27,0,0,48,21,0,0,120,17,0,0,0,0,0,0,116,111,105,73,110,100,101,120,65,32,60,32,109,95,98,111,100,121,67,111,117,110,116,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,98,50,73,115,108,97,110,100,46,99,112,112,0,0,0,0,0,83,111,108,118,101,84,79,73,0,0,0,0,0,0,0,0,116,111,105,73,110,100,101,120,66,32,60,32,109,95,98,111,100,121,67,111,117,110,116,0,100,101,110,32,62,32,48,46,48,102,0,0,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,67,111,
+108,108,105,100,101,69,100,103,101,46,99,112,112,0,0,0,0,0,0,0,98,50,67,111,108,108,105,100,101,69,100,103,101,65,110,100,67,105,114,99,108,101,0,0,48,32,60,61,32,101,100,103,101,49,32,38,38,32,101,100,103,101,49,32,60,32,112,111,108,121,49,45,62,109,95,118,101,114,116,101,120,67,111,117,110,116,0,0,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,67,111,108,108,105,100,101,80,111,108,121,103,111,110,46,99,112,112,0,0,0,0,98,50,70,105,110,100,73,110,99,105,100,101,110,116,69,
+100,103,101,0,0,0,0,0,0,98,50,69,100,103,101,83,101,112,97,114,97,116,105,111,110,0,0,0,0,0,0,0,0,0,0,0,0,120,23,0,0,7,0,0,0,19,0,0,0,20,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,104,97,105,110,0,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,67,104,97,105,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,0,98,
+50,67,104,97,105,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,105,114,99,108,101,0,0,0,0,0,0,50,51,98,50,67,104,97,105,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,0,0,0,0,0,160,27,0,0,88,23,0,0,120,17,0,0,0,0,0,0,0,0,0,0,120,24,0,0,8,0,0,0,21,0,0,0,22,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,
+101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,104,97,105,110,0,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,67,104,97,105,110,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,98,50,67,104,97,105,110,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,
+58,101,95,112,111,108,121,103,111,110,0,0,0,0,0,50,52,98,50,67,104,97,105,110,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,0,0,0,0,0,160,27,0,0,88,24,0,0,120,17,0,0,0,0,0,0,0,0,0,0,88,25,0,0,9,0,0,0,23,0,0,0,24,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,105,114,99,108,101,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,67,105,
+114,99,108,101,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,0,98,50,67,105,114,99,108,101,67,111,110,116,97,99,116,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,105,114,99,108,101,0,0,0,0,0,0,49,53,98,50,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,0,0,0,0,0,160,27,0,0,64,25,0,0,120,17,0,0,0,0,0,0,112,111,105,110,116,67,111,117,110,116,32,62,32,48,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,
+111,110,116,97,99,116,115,47,98,50,67,111,110,116,97,99,116,83,111,108,118,101,114,46,99,112,112,0,0,0,0,0,98,50,67,111,110,116,97,99,116,83,111,108,118,101,114,0,109,97,110,105,102,111,108,100,45,62,112,111,105,110,116,67,111,117,110,116,32,62,32,48,0,0,0,0,0,0,0,0,73,110,105,116,105,97,108,105,122,101,86,101,108,111,99,105,116,121,67,111,110,115,116,114,97,105,110,116,115,0,0,0,112,111,105,110,116,67,111,117,110,116,32,61,61,32,49,32,124,124,32,112,111,105,110,116,67,111,117,110,116,32,61,61,32,
+50,0,0,0,0,0,0,83,111,108,118,101,86,101,108,111,99,105,116,121,67,111,110,115,116,114,97,105,110,116,115,0,0,0,0,0,0,0,0,97,46,120,32,62,61,32,48,46,48,102,32,38,38,32,97,46,121,32,62,61,32,48,46,48,102,0,0,0,0,0,0,112,99,45,62,112,111,105,110,116,67,111,117,110,116,32,62,32,48,0,0,0,0,0,0,73,110,105,116,105,97,108,105,122,101,0,0,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,83,104,97,112,101,115,47,98,50,67,104,97,105,110,83,104,97,112,101,46,99,112,112,0,48,32,60,61,32,105,
+110,100,101,120,32,38,38,32,105,110,100,101,120,32,60,32,109,95,99,111,117,110,116,32,45,32,49,0,0,0,0,0,0,0,71,101,116,67,104,105,108,100,69,100,103,101,0,0,0,0,83,116,57,116,121,112,101,95,105,110,102,111,0,0,0,0,120,27,0,0,232,26,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,115,104,105,109,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,0,0,0,160,27,0,0,0,27,0,0,248,26,0,0,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,99,108,97,115,115,95,116,121,112,101,95,105,
+110,102,111,69,0,0,0,0,0,0,0,160,27,0,0,56,27,0,0,40,27,0,0,0,0,0,0,0,0,0,0,96,27,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,4,0,0,0,1,0,0,0,1,0,0,0,10,0,0,0,0,0,0,0,232,27,0,0,25,0,0,0,29,0,0,0,27,0,0,0,28,0,0,0,4,0,0,0,2,0,0,0,2,0,0,0,11,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,115,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,160,27,0,0,192,27,0,0,96,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,30,0,0,30,0,0,0,31,0,0,0,3,0,0,0,0,0,0,0,115,116,100,58,58,98,97,100,95,
+97,108,108,111,99,0,0,83,116,57,98,97,100,95,97,108,108,111,99,0,0,0,0,160,27,0,0,24,30,0,0,0,0,0,0,0,0,0,0],"i8",za,x.Pb);var db=x.U(O(12,"i8",N),8);z(0==db%8);function eb(){return!!eb.Xa}
+function fb(a){var b=n;try{a==__ZTIi&&(b=l)}catch(c){}try{a==__ZTIj&&(b=l)}catch(d){}try{a==__ZTIl&&(b=l)}catch(f){}try{a==__ZTIm&&(b=l)}catch(g){}try{a==__ZTIx&&(b=l)}catch(h){}try{a==__ZTIy&&(b=l)}catch(k){}try{a==__ZTIf&&(b=l)}catch(j){}try{a==__ZTId&&(b=l)}catch(y){}try{a==__ZTIe&&(b=l)}catch(F){}try{a==__ZTIc&&(b=l)}catch(r){}try{a==__ZTIa&&(b=l)}catch(w){}try{a==__ZTIh&&(b=l)}catch(C){}try{a==__ZTIs&&(b=l)}catch(H){}try{a==__ZTIt&&(b=l)}catch(I){}return b}
+function gb(a,b,c){if(0==c)return n;if(0==b||b==a)return l;switch(fb(b)?b:M[M[b>>2]-8>>2]){case 0:return 0==M[M[a>>2]-8>>2]?gb(M[a+8>>2],M[b+8>>2],c):n;case 1:return n;case 2:return gb(a,M[b+8>>2],c);default:return n}}var hb=0,ib=8;
+function jb(a,b,c){if(!jb.gc){try{M[__ZTVN10__cxxabiv119__pointer_type_infoE>>2]=0}catch(d){}try{M[bb>>2]=1}catch(f){}try{M[cb>>2]=2}catch(g){}jb.gc=l}var h=a-ib;M[h>>2]=b;M[h+4>>2]=c;hb=a;"uncaught_exception"in eb?eb.Xa++:eb.Xa=1;e(a+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.")}q._memset=kb;function lb(a){q.exit(a)}
+var T={aa:1,ia:2,de:3,bd:4,P:5,cb:6,zc:7,zd:8,ha:9,Mc:10,$:11,ne:11,Mb:12,Fb:13,Xc:14,Ld:15,Za:16,$a:17,oe:18,ab:19,Nb:20,Aa:21,u:22,ud:23,Lb:24,Pd:25,ke:26,Yc:27,Hd:28,Da:29,ae:30,nd:31,Ud:32,Uc:33,Yd:34,Dd:42,$c:43,Nc:44,dd:45,ed:46,fd:47,md:48,le:49,xd:50,cd:51,Sc:35,Ad:37,Ec:52,Hc:53,pe:54,vd:55,Ic:56,Jc:57,Tc:35,Kc:59,Jd:60,yd:61,he:62,Id:63,Ed:64,Fd:65,$d:66,Bd:67,Cc:68,ee:69,Oc:70,Vd:71,pd:72,Vc:73,Gc:74,Qd:76,Fc:77,Zd:78,gd:79,hd:80,ld:81,kd:82,jd:83,Kd:38,bb:39,qd:36,Ba:40,Ca:95,Td:96,Rc:104,
+wd:105,Dc:97,Xd:91,Nd:88,Gd:92,be:108,Qc:111,Ac:98,Pc:103,td:101,rd:100,ie:110,Zc:112,Ib:113,Jb:115,Gb:114,Hb:89,od:90,Wd:93,ce:94,Bc:99,sd:102,Kb:106,ja:107,je:109,me:87,Wc:122,fe:116,Od:95,Cd:123,ad:84,Rd:75,Lc:125,Md:131,Sd:130,ge:86},mb={"0":"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",
+12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",
+34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",
+53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",
+74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can   access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",
+90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",
+107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"},nb=0;function ob(a){return M[nb>>2]=a}
+function pb(a,b){for(var c=0,d=a.length-1;0<=d;d--){var f=a[d];"."===f?a.splice(d,1):".."===f?(a.splice(d,1),c++):c&&(a.splice(d,1),c--)}if(b)for(;c--;c)a.unshift("..");return a}function U(a){var b="/"===a.charAt(0),c="/"===a.substr(-1),a=pb(a.split("/").filter(function(a){return!!a}),!b).join("/");!a&&!b&&(a=".");a&&c&&(a+="/");return(b?"/":"")+a}function rb(a){if("/"===a)return"/";var b=a.lastIndexOf("/");return-1===b?a:a.substr(b+1)}
+function sb(){for(var a="",b=n,c=arguments.length-1;-1<=c&&!b;c--){var d=0<=c?arguments[c]:"/";"string"!==typeof d&&e(new TypeError("Arguments to path.resolve must be strings"));d&&(a=d+"/"+a,b="/"===d.charAt(0))}a=pb(a.split("/").filter(function(a){return!!a}),!b).join("/");return(b?"/":"")+a||"."}var tb=[];function ub(a,b){tb[a]={input:[],T:[],da:b};vb[a]={k:wb}}
+var wb={open:function(a){var b=tb[a.e.va];b||e(new V(T.ab));a.C=b;a.seekable=n},close:function(a){a.C.T.length&&a.C.da.ua(a.C,10)},O:function(a,b,c,d){(!a.C||!a.C.da.rb)&&e(new V(T.cb));for(var f=0,g=0;g<d;g++){var h;try{h=a.C.da.rb(a.C)}catch(k){e(new V(T.P))}h===i&&0===f&&e(new V(T.$));if(h===m||h===i)break;f++;b[c+g]=h}f&&(a.e.timestamp=Date.now());return f},write:function(a,b,c,d){(!a.C||!a.C.da.ua)&&e(new V(T.cb));for(var f=0;f<d;f++)try{a.C.da.ua(a.C,b[c+f])}catch(g){e(new V(T.P))}d&&(a.e.timestamp=
+Date.now());return f}},W={F:m,Eb:1,za:2,Ya:3,N:function(){return W.createNode(m,"/",16895,0)},createNode:function(a,b,c,d){(24576===(c&61440)||4096===(c&61440))&&e(new V(T.aa));W.F||(W.F={dir:{e:{M:W.n.M,A:W.n.A,Na:W.n.Na,ra:W.n.ra,rename:W.n.rename,Db:W.n.Db,Bb:W.n.Bb,yb:W.n.yb,ya:W.n.ya},G:{S:W.k.S}},file:{e:{M:W.n.M,A:W.n.A},G:{S:W.k.S,O:W.k.O,write:W.k.write,fb:W.k.fb,ub:W.k.ub}},link:{e:{M:W.n.M,A:W.n.A,wa:W.n.wa},G:{}},ib:{e:{M:W.n.M,A:W.n.A},G:xb}});c=yb(a,b,c,d);16384===(c.mode&61440)?(c.n=
+W.F.dir.e,c.k=W.F.dir.G,c.o={}):32768===(c.mode&61440)?(c.n=W.F.file.e,c.k=W.F.file.G,c.o=[],c.ma=W.za):40960===(c.mode&61440)?(c.n=W.F.link.e,c.k=W.F.link.G):8192===(c.mode&61440)&&(c.n=W.F.ib.e,c.k=W.F.ib.G);c.timestamp=Date.now();a&&(a.o[b]=c);return c},Ga:function(a){a.ma!==W.za&&(a.o=Array.prototype.slice.call(a.o),a.ma=W.za)},n:{M:function(a){var b={};b.Ie=8192===(a.mode&61440)?a.id:1;b.Te=a.id;b.mode=a.mode;b.Ze=1;b.uid=0;b.Re=0;b.va=a.va;b.size=16384===(a.mode&61440)?4096:32768===(a.mode&
+61440)?a.o.length:40960===(a.mode&61440)?a.link.length:0;b.Be=new Date(a.timestamp);b.Xe=new Date(a.timestamp);b.Ge=new Date(a.timestamp);b.Ub=4096;b.Ce=Math.ceil(b.size/b.Ub);return b},A:function(a,b){b.mode!==i&&(a.mode=b.mode);b.timestamp!==i&&(a.timestamp=b.timestamp);if(b.size!==i){W.Ga(a);var c=a.o;if(b.size<c.length)c.length=b.size;else for(;b.size>c.length;)c.push(0)}},Na:function(){e(zb[T.ia])},ra:function(a,b,c,d){return W.createNode(a,b,c,d)},rename:function(a,b,c){if(16384===(a.mode&61440)){var d;
+try{d=Ab(b,c)}catch(f){}if(d)for(var g in d.o)e(new V(T.bb))}delete a.parent.o[a.name];a.name=c;b.o[c]=a;a.parent=b},Db:function(a,b){delete a.o[b]},Bb:function(a,b){var c=Ab(a,b),d;for(d in c.o)e(new V(T.bb));delete a.o[b]},yb:function(a){var b=[".",".."],c;for(c in a.o)a.o.hasOwnProperty(c)&&b.push(c);return b},ya:function(a,b,c){a=W.createNode(a,b,41471,0);a.link=c;return a},wa:function(a){40960!==(a.mode&61440)&&e(new V(T.u));return a.link}},k:{O:function(a,b,c,d,f){a=a.e.o;if(f>=a.length)return 0;
+d=Math.min(a.length-f,d);z(0<=d);if(8<d&&a.subarray)b.set(a.subarray(f,f+d),c);else for(var g=0;g<d;g++)b[c+g]=a[f+g];return d},write:function(a,b,c,d,f,g){var h=a.e;h.timestamp=Date.now();a=h.o;if(d&&0===a.length&&0===f&&b.subarray)return g&&0===c?(h.o=b,h.ma=b.buffer===L.buffer?W.Eb:W.Ya):(h.o=new Uint8Array(b.subarray(c,c+d)),h.ma=W.Ya),d;W.Ga(h);for(a=h.o;a.length<f;)a.push(0);for(g=0;g<d;g++)a[f+g]=b[c+g];return d},S:function(a,b,c){1===c?b+=a.position:2===c&&32768===(a.e.mode&61440)&&(b+=a.e.o.length);
+0>b&&e(new V(T.u));a.xc=[];return a.position=b},fb:function(a,b,c){W.Ga(a.e);a=a.e.o;for(b+=c;b>a.length;)a.push(0)},ub:function(a,b,c,d,f,g,h){32768!==(a.e.mode&61440)&&e(new V(T.ab));a=a.e.o;if(!(h&2)&&(a.buffer===b||a.buffer===b.buffer))f=n,d=a.byteOffset;else{if(0<f||f+d<a.length)a=a.subarray?a.subarray(f,f+d):Array.prototype.slice.call(a,f,f+d);f=l;(d=Aa(d))||e(new V(T.Mb));b.set(a,d)}return{df:d,ze:f}}}},Bb=O(1,"i32*",N),Cb=O(1,"i32*",N),Db=O(1,"i32*",N),Eb=m,vb=[m],X=[],Fb=1,Gb=m,Hb=l,Ib={},
+V=m,zb={};function Jb(a){a instanceof V||e(a+" : "+Ca());ob(a.kb)}
+function Y(a,b){var a=sb("/",a),b=b||{},c={ob:l,Qa:0},d;for(d in c)b[d]===i&&(b[d]=c[d]);8<b.Qa&&e(new V(T.Ba));var c=pb(a.split("/").filter(function(a){return!!a}),n),f=Eb,g="/";for(d=0;d<c.length;d++){var h=d===c.length-1;if(h&&b.parent)break;f=Ab(f,c[d]);g=U(g+"/"+c[d]);if(f.sa&&(!h||h&&b.ob))f=f.sa.root;if(!h||b.Ia)for(h=0;40960===(f.mode&61440);){f=Y(g).e;f.n.wa||e(new V(T.u));var f=f.n.wa(f),k=sb;var j=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(g).slice(1),g=j[0],j=
+j[1];!g&&!j?g=".":(j&&(j=j.substr(0,j.length-1)),g+=j);g=k(g,f);f=Y(g,{Qa:b.Qa}).e;40<h++&&e(new V(T.Ba))}}return{path:g,e:f}}function Kb(a){for(var b;;){if(a===a.parent)return a=a.N.oc,!b?a:"/"!==a[a.length-1]?a+"/"+b:a+b;b=b?a.name+"/"+b:a.name;a=a.parent}}function Lb(a,b){for(var c=0,d=0;d<b.length;d++)c=(c<<5)-c+b.charCodeAt(d)|0;return(a+c>>>0)%Gb.length}
+function Ab(a,b){var c=Mb(a,"x");c&&e(new V(c));for(c=Gb[Lb(a.id,b)];c;c=c.qc){var d=c.name;if(c.parent.id===a.id&&d===b)return c}return a.n.Na(a,b)}
+function yb(a,b,c,d){Nb||(Nb=function(a,b,c,d){a||(a=this);this.parent=a;this.N=a.N;this.sa=m;this.id=Fb++;this.name=b;this.mode=c;this.n={};this.k={};this.va=d},Nb.prototype={},Object.defineProperties(Nb.prototype,{O:{get:function(){return 365===(this.mode&365)},set:function(a){a?this.mode|=365:this.mode&=-366}},write:{get:function(){return 146===(this.mode&146)},set:function(a){a?this.mode|=146:this.mode&=-147}},ic:{get:function(){return 16384===(this.mode&61440)}},hc:{get:function(){return 8192===
+(this.mode&61440)}}}));a=new Nb(a,b,c,d);b=Lb(a.parent.id,a.name);a.qc=Gb[b];return Gb[b]=a}var Ob={r:0,rs:1052672,"r+":2,w:577,wx:705,xw:705,"w+":578,"wx+":706,"xw+":706,a:1089,ax:1217,xa:1217,"a+":1090,"ax+":1218,"xa+":1218};function Pb(a){var b=Ob[a];"undefined"===typeof b&&e(Error("Unknown file open mode: "+a));return b}function Mb(a,b){return Hb?0:-1!==b.indexOf("r")&&!(a.mode&292)||-1!==b.indexOf("w")&&!(a.mode&146)||-1!==b.indexOf("x")&&!(a.mode&73)?T.Fb:0}
+function Qb(a,b){try{return Ab(a,b),T.$a}catch(c){}return Mb(a,"wx")}function Rb(a,b,c){Sb||(Sb=p(),Sb.prototype={},Object.defineProperties(Sb.prototype,{object:{get:function(){return this.e},set:function(a){this.e=a}},Ve:{get:function(){return 1!==(this.L&2097155)}},We:{get:function(){return 0!==(this.L&2097155)}},Ue:{get:function(){return this.L&1024}}}));var d=new Sb,f;for(f in a)d[f]=a[f];var a=d,g;a:{b=b||0;for(c=c||4096;b<=c;b++)if(!X[b]){g=b;break a}e(new V(T.Lb))}a.B=g;return X[g]=a}
+var xb={open:function(a){a.k=vb[a.e.va].k;a.k.open&&a.k.open(a)},S:function(){e(new V(T.Da))}};function Tb(a,b){var c="/"===b,d=!b,f;c&&Eb&&e(new V(T.Za));!c&&!d&&(f=Y(b,{ob:n}),b=f.path,f=f.e,f.sa&&e(new V(T.Za)),16384!==(f.mode&61440)&&e(new V(T.Nb)));var d={type:a,af:{},oc:b,pc:[]},g=a.N(d);g.N=d;d.root=g;c?Eb=g:f&&(f.sa=d,f.N&&f.N.pc.push(d));return g}function Ub(a,b,c){var d=Y(a,{parent:l}).e,a=rb(a),f=Qb(d,a);f&&e(new V(f));d.n.ra||e(new V(T.aa));return d.n.ra(d,a,b,c)}
+function Vb(a,b){b=(b!==i?b:438)&4095;b|=32768;return Ub(a,b,0)}function Wb(a,b){b=(b!==i?b:511)&1023;b|=16384;return Ub(a,b,0)}function Xb(a,b,c){"undefined"===typeof c&&(c=b,b=438);return Ub(a,b|8192,c)}function Yb(a,b){var c=Y(b,{parent:l}).e,d=rb(b),f=Qb(c,d);f&&e(new V(f));c.n.ya||e(new V(T.aa));return c.n.ya(c,d,a)}function Zb(a,b){var c;c="string"===typeof a?Y(a,{Ia:l}).e:a;c.n.A||e(new V(T.aa));c.n.A(c,{mode:b&4095|c.mode&-4096,timestamp:Date.now()})}
+function $b(a,b){var c,b="string"===typeof b?Pb(b):b;c=b&64?("undefined"===typeof c?438:c)&4095|32768:0;var d;if("object"===typeof a)d=a;else{a=U(a);try{d=Y(a,{Ia:!(b&131072)}).e}catch(f){}}b&64&&(d?b&128&&e(new V(T.$a)):d=Ub(a,c,0));d||e(new V(T.ia));8192===(d.mode&61440)&&(b&=-513);d?40960===(d.mode&61440)?c=T.Ba:16384===(d.mode&61440)&&(0!==(b&2097155)||b&512)?c=T.Aa:(c=["r","w","rw"][b&2097155],b&512&&(c+="w"),c=Mb(d,c)):c=T.ia;c&&e(new V(c));if(b&512){c=d;c="string"===typeof c?Y(c,{Ia:l}).e:
+c;c.n.A||e(new V(T.aa));16384===(c.mode&61440)&&e(new V(T.Aa));32768!==(c.mode&61440)&&e(new V(T.u));var g=Mb(c,"w");g&&e(new V(g));c.n.A(c,{size:0,timestamp:Date.now()})}b&=-641;d=Rb({e:d,path:Kb(d),L:b,seekable:l,position:0,k:d.k,xc:[],error:n},i,i);d.k.open&&d.k.open(d);q.logReadFiles&&!(b&1)&&(ac||(ac={}),a in ac||(ac[a]=1,q.printErr("read file: "+a)));try{Ib.onOpenFile&&(c=0,1!==(b&2097155)&&(c|=1),0!==(b&2097155)&&(c|=2),Ib.onOpenFile(a,c))}catch(h){console.log("FS.trackingDelegate['onOpenFile']('"+
+a+"', flags) threw an exception: "+h.message)}return d}function bc(a){try{a.k.close&&a.k.close(a)}catch(b){e(b)}finally{X[a.B]=m}}
+function cc(a,b,c,d,f,g){(0>d||0>f)&&e(new V(T.u));0===(a.L&2097155)&&e(new V(T.ha));16384===(a.e.mode&61440)&&e(new V(T.Aa));a.k.write||e(new V(T.u));var h=l;"undefined"===typeof f?(f=a.position,h=n):a.seekable||e(new V(T.Da));a.L&1024&&((!a.seekable||!a.k.S)&&e(new V(T.Da)),a.k.S(a,0,2));b=a.k.write(a,b,c,d,f,g);h||(a.position+=b);try{if(a.path&&Ib.onWriteToFile)Ib.onWriteToFile(a.path)}catch(k){console.log("FS.trackingDelegate['onWriteToFile']('"+path+"') threw an exception: "+k.message)}return b}
+function dc(){V||(V=function(a){this.kb=a;for(var b in T)if(T[b]===a){this.code=b;break}this.message=mb[a]},V.prototype=Error(),[T.ia].forEach(function(a){zb[a]=new V(a);zb[a].stack="<generic error, no stack>"}))}var ec;function fc(a,b){var c=0;a&&(c|=365);b&&(c|=146);return c}
+function gc(a,b,c,d,f,g){a=b?U(("string"===typeof a?a:Kb(a))+"/"+b):a;d=fc(d,f);f=Vb(a,d);if(c){if("string"===typeof c){for(var a=Array(c.length),b=0,h=c.length;b<h;++b)a[b]=c.charCodeAt(b);c=a}Zb(f,d|146);a=$b(f,"w");cc(a,c,0,c.length,0,g);bc(a);Zb(f,d)}return f}
+function hc(a,b,c,d){a=U(("string"===typeof a?a:Kb(a))+"/"+b);b=fc(!!c,!!d);hc.tb||(hc.tb=64);var f;f=hc.tb++<<8|0;vb[f]={k:{open:function(a){a.seekable=n},close:function(){d&&(d.buffer&&d.buffer.length)&&d(10)},O:function(a,b,d,f){for(var y=0,F=0;F<f;F++){var r;try{r=c()}catch(w){e(new V(T.P))}r===i&&0===y&&e(new V(T.$));if(r===m||r===i)break;y++;b[d+F]=r}y&&(a.e.timestamp=Date.now());return y},write:function(a,b,c,f){for(var y=0;y<f;y++)try{d(b[c+y])}catch(F){e(new V(T.P))}f&&(a.e.timestamp=Date.now());
+return y}}};return Xb(a,b,f)}function ic(a){if(a.hc||a.ic||a.link||a.o)return l;var b=l;"undefined"!==typeof XMLHttpRequest&&e(Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."));if(q.read)try{a.o=K(q.read(a.url),l)}catch(c){b=n}else e(Error("Cannot load without read() or XMLHttpRequest."));b||ob(T.P);return b}var Nb,Sb,ac;function jc(){e("TODO")}
+var Z={N:function(){return yb(m,"/",16895,0)},Yb:function(a,b,c){c&&z(1==b==(6==c));a={$b:a,type:b,protocol:c,p:m,ea:{},Oa:[],W:[],Y:Z.q};b=Z.ta();c=yb(Z.root,b,49152,0);c.X=a;b=Rb({path:b,e:c,L:Pb("r+"),seekable:n,k:Z.k});a.G=b;return a},bc:function(a){a=X[a];return!a||49152!==(a.e.mode&49152)?m:a.e.X},k:{xb:function(a){a=a.e.X;return a.Y.xb(a)},sb:function(a,b,c){a=a.e.X;return a.Y.sb(a,b,c)},O:function(a,b,c,d){a=a.e.X;d=a.Y.sc(a,d);if(!d)return 0;b.set(d.buffer,c);return d.buffer.length},write:function(a,
+b,c,d){a=a.e.X;return a.Y.uc(a,b,c,d)},close:function(a){a=a.e.X;a.Y.close(a)}},ta:function(){Z.ta.jb||(Z.ta.jb=0);return"socket["+Z.ta.jb++ +"]"},q:{na:function(a,b,c){var d;"object"===typeof b&&(d=b,c=b=m);if(d)d._socket?(b=d._socket.remoteAddress,c=d._socket.remotePort):((c=/ws[s]?:\/\/([^:]+):(\d+)/.exec(d.url))||e(Error("WebSocket URL must be in the format ws(s)://address:port")),b=c[1],c=parseInt(c[2],10));else try{var f=q.websocket&&"object"===typeof q.websocket,g="ws:#".replace("#","//");
+f&&"string"===typeof q.websocket.url&&(g=q.websocket.url);if("ws://"===g||"wss://"===g)g=g+b+":"+c;var h="binary";f&&"string"===typeof q.websocket.subprotocol&&(h=q.websocket.subprotocol);var h=h.replace(/^ +| +$/g,"").split(/ *, */),k=u?{protocol:h.toString()}:h;d=new (u?require("ws"):window.WebSocket)(g,k);d.binaryType="arraybuffer"}catch(j){e(new V(T.Ib))}b={H:b,port:c,g:d,oa:[]};Z.q.eb(a,b);Z.q.ec(a,b);2===a.type&&"undefined"!==typeof a.Z&&b.oa.push(new Uint8Array([255,255,255,255,112,111,114,
+116,(a.Z&65280)>>8,a.Z&255]));return b},qa:function(a,b,c){return a.ea[b+":"+c]},eb:function(a,b){a.ea[b.H+":"+b.port]=b},zb:function(a,b){delete a.ea[b.H+":"+b.port]},ec:function(a,b){function c(){try{for(var a=b.oa.shift();a;)b.g.send(a),a=b.oa.shift()}catch(c){b.g.close()}}function d(c){z("string"!==typeof c&&c.byteLength!==i);var c=new Uint8Array(c),d=f;f=n;d&&10===c.length&&255===c[0]&&255===c[1]&&255===c[2]&&255===c[3]&&112===c[4]&&111===c[5]&&114===c[6]&&116===c[7]?(c=c[8]<<8|c[9],Z.q.zb(a,
+b),b.port=c,Z.q.eb(a,b)):a.W.push({H:b.H,port:b.port,data:c})}var f=l;u?(b.g.on("open",c),b.g.on("message",function(a,b){b.binary&&d((new Uint8Array(a)).buffer)}),b.g.on("error",p())):(b.g.onopen=c,b.g.onmessage=function(a){d(a.data)})},xb:function(a){if(1===a.type&&a.p)return a.Oa.length?65:0;var b=0,c=1===a.type?Z.q.qa(a,a.I,a.J):m;if(a.W.length||!c||c&&c.g.readyState===c.g.ga||c&&c.g.readyState===c.g.CLOSED)b|=65;if(!c||c&&c.g.readyState===c.g.OPEN)b|=4;if(c&&c.g.readyState===c.g.ga||c&&c.g.readyState===
+c.g.CLOSED)b|=16;return b},sb:function(a,b,c){switch(b){case 21531:return b=0,a.W.length&&(b=a.W[0].data.length),M[c>>2]=b,0;default:return T.u}},close:function(a){if(a.p){try{a.p.close()}catch(b){}a.p=m}for(var c=Object.keys(a.ea),d=0;d<c.length;d++){var f=a.ea[c[d]];try{f.g.close()}catch(g){}Z.q.zb(a,f)}return 0},bind:function(a,b,c){("undefined"!==typeof a.Sa||"undefined"!==typeof a.Z)&&e(new V(T.u));a.Sa=b;a.Z=c||jc();if(2===a.type){a.p&&(a.p.close(),a.p=m);try{a.Y.mc(a,0)}catch(d){d instanceof
+V||e(d),d.kb!==T.Ca&&e(d)}}},Ee:function(a,b,c){a.p&&e(new V(ERRNO_CODS.Ca));if("undefined"!==typeof a.I&&"undefined"!==typeof a.J){var d=Z.q.qa(a,a.I,a.J);d&&(d.g.readyState===d.g.CONNECTING&&e(new V(T.Gb)),e(new V(T.Kb)))}b=Z.q.na(a,b,c);a.I=b.H;a.J=b.port;e(new V(T.Jb))},mc:function(a){u||e(new V(T.Ca));a.p&&e(new V(T.u));var b=require("ws").Server;a.p=new b({host:a.Sa,port:a.Z});a.p.on("connection",function(b){if(1===a.type){var d=Z.Yb(a.$b,a.type,a.protocol),b=Z.q.na(d,b);d.I=b.H;d.J=b.port;
+a.Oa.push(d)}else Z.q.na(a,b)});a.p.on("closed",function(){a.p=m});a.p.on("error",p())},accept:function(a){a.p||e(new V(T.u));var b=a.Oa.shift();b.G.L=a.G.L;return b},Qe:function(a,b){var c,d;b?((a.I===i||a.J===i)&&e(new V(T.ja)),c=a.I,d=a.J):(c=a.Sa||0,d=a.Z||0);return{H:c,port:d}},uc:function(a,b,c,d,f,g){if(2===a.type){if(f===i||g===i)f=a.I,g=a.J;(f===i||g===i)&&e(new V(T.Hb))}else f=a.I,g=a.J;var h=Z.q.qa(a,f,g);1===a.type&&((!h||h.g.readyState===h.g.ga||h.g.readyState===h.g.CLOSED)&&e(new V(T.ja)),
+h.g.readyState===h.g.CONNECTING&&e(new V(T.$)));b=b instanceof Array||b instanceof ArrayBuffer?b.slice(c,c+d):b.buffer.slice(b.byteOffset+c,b.byteOffset+c+d);if(2===a.type&&(!h||h.g.readyState!==h.g.OPEN)){if(!h||h.g.readyState===h.g.ga||h.g.readyState===h.g.CLOSED)h=Z.q.na(a,f,g);h.oa.push(b);return d}try{return h.g.send(b),d}catch(k){e(new V(T.u))}},sc:function(a,b){1===a.type&&a.p&&e(new V(T.ja));var c=a.W.shift();if(!c){if(1===a.type){var d=Z.q.qa(a,a.I,a.J);if(d){if(d.g.readyState===d.g.ga||
+d.g.readyState===d.g.CLOSED)return m;e(new V(T.$))}e(new V(T.ja))}e(new V(T.$))}var d=c.data.byteLength||c.data.length,f=c.data.byteOffset||0,g=c.data.buffer||c.data,h=Math.min(b,d),k={buffer:new Uint8Array(g,f,h),H:c.H,port:c.port};1===a.type&&h<d&&(c.data=new Uint8Array(g,f+h,d-h),a.W.unshift(c));return k}}};function kc(a,b,c){a=X[a];if(!a)return ob(T.ha),-1;try{return cc(a,L,b,c)}catch(d){return Jb(d),-1}}function lc(a){a=X[a-1];return!a?-1:a.B}
+function mc(a,b,c,d){c*=b;if(0==c)return 0;a=kc(lc(d),a,c);if(-1==a){if(b=X[d-1])b.error=l;return 0}return Math.floor(a/b)}q._strlen=nc;function oc(a){return 0>a||0===a&&-Infinity===1/a}
+function pc(a,b){function c(a){var c;"double"===a?c=xa[b+f>>3]:"i64"==a?c=[M[b+f>>2],M[b+(f+4)>>2]]:(a="i32",c=M[b+f>>2]);f+=x.pb(a);return c}for(var d=a,f=0,g=[],h,k;;){var j=d;h=L[d>>0];if(0===h)break;k=L[d+1>>0];if(37==h){var y=n,F=n,r=n,w=n,C=n;a:for(;;){switch(k){case 43:y=l;break;case 45:F=l;break;case 35:r=l;break;case 48:if(w)break a;else{w=l;break}case 32:C=l;break;default:break a}d++;k=L[d+1>>0]}var H=0;if(42==k)H=c("i32"),d++,k=L[d+1>>0];else for(;48<=k&&57>=k;)H=10*H+(k-48),d++,k=L[d+
+1>>0];var I=n,D=-1;if(46==k){D=0;I=l;d++;k=L[d+1>>0];if(42==k)D=c("i32"),d++;else for(;;){k=L[d+1>>0];if(48>k||57<k)break;D=10*D+(k-48);d++}k=L[d+1>>0]}0>D&&(D=6,I=n);var A;switch(String.fromCharCode(k)){case "h":k=L[d+2>>0];104==k?(d++,A=1):A=2;break;case "l":k=L[d+2>>0];108==k?(d++,A=8):A=4;break;case "L":case "q":case "j":A=8;break;case "z":case "t":case "I":A=4;break;default:A=m}A&&d++;k=L[d+1>>0];switch(String.fromCharCode(k)){case "d":case "i":case "u":case "o":case "x":case "X":case "p":j=
+100==k||105==k;A=A||4;h=c("i"+8*A);var t;8==A&&(h=x.nc(h[0],h[1],117==k));4>=A&&(h=(j?Ua:Ta)(h&Math.pow(256,A)-1,8*A));var aa=Math.abs(h),j="";if(100==k||105==k)t=Ua(h,8*A).toString(10);else if(117==k)t=Ta(h,8*A).toString(10),h=Math.abs(h);else if(111==k)t=(r?"0":"")+aa.toString(8);else if(120==k||88==k){j=r&&0!=h?"0x":"";if(0>h){h=-h;t=(aa-1).toString(16);aa=[];for(r=0;r<t.length;r++)aa.push((15-parseInt(t[r],16)).toString(16));for(t=aa.join("");t.length<2*A;)t="f"+t}else t=aa.toString(16);88==k&&
+(j=j.toUpperCase(),t=t.toUpperCase())}else 112==k&&(0===aa?t="(nil)":(j="0x",t=aa.toString(16)));if(I)for(;t.length<D;)t="0"+t;0<=h&&(y?j="+"+j:C&&(j=" "+j));"-"==t.charAt(0)&&(j="-"+j,t=t.substr(1));for(;j.length+t.length<H;)F?t+=" ":w?t="0"+t:j=" "+j;t=j+t;t.split("").forEach(function(a){g.push(a.charCodeAt(0))});break;case "f":case "F":case "e":case "E":case "g":case "G":h=c("double");if(isNaN(h))t="nan",w=n;else if(isFinite(h)){I=n;A=Math.min(D,20);if(103==k||71==k)I=l,D=D||1,A=parseInt(h.toExponential(A).split("e")[1],
+10),D>A&&-4<=A?(k=(103==k?"f":"F").charCodeAt(0),D-=A+1):(k=(103==k?"e":"E").charCodeAt(0),D--),A=Math.min(D,20);if(101==k||69==k)t=h.toExponential(A),/[eE][-+]\d$/.test(t)&&(t=t.slice(0,-1)+"0"+t.slice(-1));else if(102==k||70==k)t=h.toFixed(A),0===h&&oc(h)&&(t="-"+t);j=t.split("e");if(I&&!r)for(;1<j[0].length&&-1!=j[0].indexOf(".")&&("0"==j[0].slice(-1)||"."==j[0].slice(-1));)j[0]=j[0].slice(0,-1);else for(r&&-1==t.indexOf(".")&&(j[0]+=".");D>A++;)j[0]+="0";t=j[0]+(1<j.length?"e"+j[1]:"");69==k&&
+(t=t.toUpperCase());0<=h&&(y?t="+"+t:C&&(t=" "+t))}else t=(0>h?"-":"")+"inf",w=n;for(;t.length<H;)t=F?t+" ":w&&("-"==t[0]||"+"==t[0])?t[0]+"0"+t.slice(1):(w?"0":" ")+t;97>k&&(t=t.toUpperCase());t.split("").forEach(function(a){g.push(a.charCodeAt(0))});break;case "s":w=(y=c("i8*"))?nc(y):6;I&&(w=Math.min(w,D));if(!F)for(;w<H--;)g.push(32);if(y)for(r=0;r<w;r++)g.push(P[y++>>0]);else g=g.concat(K("(null)".substr(0,w),l));if(F)for(;w<H--;)g.push(32);break;case "c":for(F&&g.push(c("i8"));0<--H;)g.push(32);
+F||g.push(c("i8"));break;case "n":F=c("i32*");M[F>>2]=g.length;break;case "%":g.push(h);break;default:for(r=j;r<d+2;r++)g.push(L[r>>0])}d+=2}else g.push(h),d+=1}return g}function qc(a,b,c){c=pc(b,c);b=x.Wa();a=mc(O(c,"i8",ya),1,c.length,a);x.Va(b);return a}var rc=ua;function sc(a,b){return kc(lc(b),a,nc(a))}function tc(a,b){var c=Ta(a&255);L[tc.Ab>>0]=c;if(-1==kc(lc(b),tc.Ab,1)){if(c=X[b-1])c.error=l;return-1}return c}
+function uc(){uc.start===i&&(uc.start=Date.now());return Math.floor(1E3*(Date.now()-uc.start))}var vc=[];q._memcpy=wc;var xc=m,yc="",zc=n,Ac=n,Bc=[],Cc={},Dc,Ec,Fc=n,Gc=n,Hc=n,Ic=i,Jc=i;
+function Kc(a){"undefined"===typeof window?setTimeout(a,1E3/60):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||window.setTimeout),window.requestAnimationFrame(a))}
+function Lc(a){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[a.substr(a.lastIndexOf(".")+1)]}var Mc=[];function Nc(){var a=q.canvas;Mc.forEach(function(b){b(a.width,a.height)})}
+function Oc(a,b,c){b&&c?(a.yc=b,a.fc=c):(b=a.yc,c=a.fc);var d=b,f=c;q.forcedAspectRatio&&0<q.forcedAspectRatio&&(d/f<q.forcedAspectRatio?d=Math.round(f*q.forcedAspectRatio):f=Math.round(d/q.forcedAspectRatio));if((document.webkitFullScreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.mozFullscreenElement||document.fullScreenElement||document.fullscreenElement||document.msFullScreenElement||document.msFullscreenElement||document.webkitCurrentFullScreenElement)===
+a.parentNode&&"undefined"!=typeof screen)var g=Math.min(screen.width/d,screen.height/f),d=Math.round(d*g),f=Math.round(f*g);Jc?(a.width!=d&&(a.width=d),a.height!=f&&(a.height=f),"undefined"!=typeof a.style&&(a.style.removeProperty("width"),a.style.removeProperty("height"))):(a.width!=b&&(a.width=b),a.height!=c&&(a.height=c),"undefined"!=typeof a.style&&(d!=b||f!=c?(a.style.setProperty("width",d+"px","important"),a.style.setProperty("height",f+"px","important")):(a.style.removeProperty("width"),a.style.removeProperty("height"))))}
+var Pc,Qc,Rc,Sc;function Tc(a){Tc.Wb||(G=G+4095&-4096,Tc.Wb=l,z(x.ca),Tc.Tb=x.ca,x.ca=function(){E("cannot dynamically allocate, sbrk now has control")});var b=G;0!=a&&Tc.Tb(a);return b}function Aa(a){return x.ca(a+8)+8&4294967288}q._malloc=Aa;var Uc=O([O([1,0,0,0,0,0,0],"i8",N)+8,0],"i32",N);dc();Gb=Array(4096);Tb(W,"/");Wb("/tmp");Wb("/dev");vb[259]={k:{O:function(){return 0},write:function(){return 0}}};Xb("/dev/null",259);
+ub(1280,{rb:function(a){if(!a.input.length){var b=m;if(u){if(b=process.stdin.read(),!b){if(process.stdin._readableState&&process.stdin._readableState.ended)return m;return}}else"undefined"!=typeof window&&"function"==typeof window.prompt?(b=window.prompt("Input: "),b!==m&&(b+="\n")):"function"==typeof readline&&(b=readline(),b!==m&&(b+="\n"));if(!b)return m;a.input=K(b,l)}return a.input.shift()},ua:function(a,b){b===m||10===b?(q.print(a.T.join("")),a.T=[]):a.T.push(Vc.Pa(b))}});
+ub(1536,{ua:function(a,b){b===m||10===b?(q.printErr(a.T.join("")),a.T=[]):a.T.push(Vc.Pa(b))}});Xb("/dev/tty",1280);Xb("/dev/tty1",1536);Wb("/dev/shm");Wb("/dev/shm/tmp");
+Ma.unshift({R:function(){if(!q.noFSInit&&!ec){z(!ec,"FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)");ec=l;dc();q.stdin=q.stdin;q.stdout=q.stdout;q.stderr=q.stderr;q.stdin?hc("/dev","stdin",q.stdin):Yb("/dev/tty","/dev/stdin");q.stdout?hc("/dev","stdout",m,q.stdout):Yb("/dev/tty","/dev/stdout");q.stderr?hc("/dev","stderr",m,q.stderr):Yb("/dev/tty1","/dev/stderr");var a=$b("/dev/stdin",
+"r");M[Bb>>2]=a?a.B+1:0;z(0===a.B,"invalid handle for stdin ("+a.B+")");a=$b("/dev/stdout","w");M[Cb>>2]=a?a.B+1:0;z(1===a.B,"invalid handle for stdout ("+a.B+")");a=$b("/dev/stderr","w");M[Db>>2]=a?a.B+1:0;z(2===a.B,"invalid handle for stderr ("+a.B+")")}}});Na.push({R:function(){Hb=n}});Oa.push({R:function(){ec=n;for(var a=0;a<X.length;a++){var b=X[a];b&&bc(b)}}});q.FS_createFolder=function(a,b,c,d){a=U(("string"===typeof a?a:Kb(a))+"/"+b);return Wb(a,fc(c,d))};
+q.FS_createPath=function(a,b){for(var a="string"===typeof a?a:Kb(a),c=b.split("/").reverse();c.length;){var d=c.pop();if(d){var f=U(a+"/"+d);try{Wb(f)}catch(g){}a=f}}return f};q.FS_createDataFile=gc;
+q.FS_createPreloadedFile=function(a,b,c,d,f,g,h,k,j){function y(c){function t(c){k||gc(a,b,c,d,f,j);g&&g();ab()}var r=n;q.preloadPlugins.forEach(function(a){!r&&a.canHandle(C)&&(a.handle(c,C,t,function(){h&&h();ab()}),r=l)});r||t(c)}q.preloadPlugins||(q.preloadPlugins=[]);if(!Pc&&!da){Pc=l;try{new Blob,Qc=l}catch(F){Qc=n,console.log("warning: no blob constructor, cannot create blobs with mimetypes")}Rc="undefined"!=typeof MozBlobBuilder?MozBlobBuilder:"undefined"!=typeof WebKitBlobBuilder?WebKitBlobBuilder:
+!Qc?console.log("warning: no BlobBuilder"):m;Sc="undefined"!=typeof window?window.URL?window.URL:window.webkitURL:i;!q.wb&&"undefined"===typeof Sc&&(console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available."),q.wb=l);q.preloadPlugins.push({canHandle:function(a){return!q.wb&&/\.(jpg|jpeg|png|bmp)$/i.test(a)},handle:function(a,b,c,d){var f=m;if(Qc)try{f=new Blob([a],{type:Lc(b)}),f.size!==a.length&&(f=new Blob([(new Uint8Array(a)).buffer],
+{type:Lc(b)}))}catch(g){x.fa("Blob constructor present but fails: "+g+"; falling back to blob builder")}f||(f=new Rc,f.append((new Uint8Array(a)).buffer),f=f.getBlob());var h=Sc.createObjectURL(f),k=new Image;k.onload=function(){z(k.complete,"Image "+b+" could not be decoded");var d=document.createElement("canvas");d.width=k.width;d.height=k.height;d.getContext("2d").drawImage(k,0,0);q.preloadedImages[b]=d;Sc.revokeObjectURL(h);c&&c(a)};k.onerror=function(){console.log("Image "+h+" could not be decoded");
+d&&d()};k.src=h}});q.preloadPlugins.push({canHandle:function(a){return!q.$e&&a.substr(-4)in{".ogg":1,".wav":1,".mp3":1}},handle:function(a,b,c,d){function f(d){h||(h=l,q.preloadedAudios[b]=d,c&&c(a))}function g(){h||(h=l,q.preloadedAudios[b]=new Audio,d&&d())}var h=n;if(Qc){try{var k=new Blob([a],{type:Lc(b)})}catch(j){return g()}var k=Sc.createObjectURL(k),r=new Audio;r.addEventListener("canplaythrough",function(){f(r)},n);r.onerror=function(){if(!h){console.log("warning: browser could not fully decode audio "+
+b+", trying slower base64 approach");for(var c="",d=0,g=0,k=0;k<a.length;k++){d=d<<8|a[k];for(g+=8;6<=g;)var j=d>>g-6&63,g=g-6,c=c+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[j]}2==g?(c+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(d&3)<<4],c+="=="):4==g&&(c+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(d&15)<<2],c+="=");r.src="data:audio/x-"+b.substr(-3)+";base64,"+c;f(r)}};r.src=k;q.noExitRuntime=l;setTimeout(function(){J||f(r)},
+1E4)}else return g()}});var r=q.canvas;if(r){r.Ra=r.requestPointerLock||r.mozRequestPointerLock||r.webkitRequestPointerLock||r.msRequestPointerLock||p();r.lb=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||document.msExitPointerLock||p();r.lb=r.lb.bind(document);var w=function(){Gc=document.pointerLockElement===r||document.mozPointerLockElement===r||document.webkitPointerLockElement===r||document.msPointerLockElement===r};document.addEventListener("pointerlockchange",
+w,n);document.addEventListener("mozpointerlockchange",w,n);document.addEventListener("webkitpointerlockchange",w,n);document.addEventListener("mspointerlockchange",w,n);q.elementPointerLock&&r.addEventListener("click",function(a){!Gc&&r.Ra&&(r.Ra(),a.preventDefault())},n)}}var C=b?sb(U(a+"/"+b)):a;$a();if("string"==typeof c){var H=h,I=function(){H?H():e('Loading data file "'+c+'" failed.')},D=new XMLHttpRequest;D.open("GET",c,l);D.responseType="arraybuffer";D.onload=function(){if(200==D.status||0==
+D.status&&D.response){var a=D.response;z(a,'Loading data file "'+c+'" failed (no arrayBuffer).');a=new Uint8Array(a);y(a);ab()}else I()};D.onerror=I;D.send(m);$a()}else y(c)};
+q.FS_createLazyFile=function(a,b,c,d,f){var g,h;function k(){this.Ma=n;this.la=[]}k.prototype.get=function(a){if(!(a>this.length-1||0>a)){var b=a%this.Xb;return this.dc(Math.floor(a/this.Xb))[b]}};k.prototype.vc=function(a){this.dc=a};k.prototype.gb=function(){var a=new XMLHttpRequest;a.open("HEAD",c,n);a.send(m);200<=a.status&&300>a.status||304===a.status||e(Error("Couldn't load "+c+". Status: "+a.status));var b=Number(a.getResponseHeader("Content-length")),d,f=1048576;if(!((d=a.getResponseHeader("Accept-Ranges"))&&
+"bytes"===d))f=b;var g=this;g.vc(function(a){var d=a*f,h=(a+1)*f-1,h=Math.min(h,b-1);if("undefined"===typeof g.la[a]){var k=g.la;d>h&&e(Error("invalid range ("+d+", "+h+") or no bytes requested!"));h>b-1&&e(Error("only "+b+" bytes available! programmer error!"));var j=new XMLHttpRequest;j.open("GET",c,n);b!==f&&j.setRequestHeader("Range","bytes="+d+"-"+h);"undefined"!=typeof Uint8Array&&(j.responseType="arraybuffer");j.overrideMimeType&&j.overrideMimeType("text/plain; charset=x-user-defined");j.send(m);
+200<=j.status&&300>j.status||304===j.status||e(Error("Couldn't load "+c+". Status: "+j.status));d=j.response!==i?new Uint8Array(j.response||[]):K(j.responseText||"",l);k[a]=d}"undefined"===typeof g.la[a]&&e(Error("doXHR failed!"));return g.la[a]});this.Sb=b;this.Rb=f;this.Ma=l};"undefined"!==typeof XMLHttpRequest?(da||e("Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc"),g=new k,Object.defineProperty(g,"length",{get:function(){this.Ma||
+this.gb();return this.Sb}}),Object.defineProperty(g,"chunkSize",{get:function(){this.Ma||this.gb();return this.Rb}}),h=i):(h=c,g=i);var j,a=U(("string"===typeof a?a:Kb(a))+"/"+b);j=Vb(a,fc(d,f));g?j.o=g:h&&(j.o=m,j.url=h);var y={};Object.keys(j.k).forEach(function(a){var b=j.k[a];y[a]=function(){ic(j)||e(new V(T.P));return b.apply(m,arguments)}});y.O=function(a,b,c,d,f){ic(j)||e(new V(T.P));a=a.e.o;if(f>=a.length)return 0;d=Math.min(a.length-f,d);z(0<=d);if(a.slice)for(var g=0;g<d;g++)b[c+g]=a[f+
+g];else for(g=0;g<d;g++)b[c+g]=a.get(f+g);return d};j.k=y;return j};q.FS_createLink=function(a,b,c){a=U(("string"===typeof a?a:Kb(a))+"/"+b);return Yb(c,a)};q.FS_createDevice=hc;nb=x.Cb(4);M[nb>>2]=0;Ma.unshift({R:p()});Oa.push({R:p()});var Vc=new x.Ea;u&&(require("fs"),process.platform.match(/^win/));Ma.push({R:function(){Z.root=Tb(Z,m)}});tc.Ab=O([0],"i8",N);
+q.requestFullScreen=function(a,b){function c(){Fc=n;var a=d.parentNode;(document.webkitFullScreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.mozFullscreenElement||document.fullScreenElement||document.fullscreenElement||document.msFullScreenElement||document.msFullscreenElement||document.webkitCurrentFullScreenElement)===a?(d.hb=document.cancelFullScreen||document.mozCancelFullScreen||document.webkitCancelFullScreen||document.msExitFullscreen||document.exitFullscreen||
+p(),d.hb=d.hb.bind(document),Ic&&d.Ra(),Fc=l,Jc&&("undefined"!=typeof SDL&&(a=Ea[SDL.screen+0*x.Q>>2],M[SDL.screen+0*x.Q>>2]=a|8388608),Nc())):(a.parentNode.insertBefore(d,a),a.parentNode.removeChild(a),Jc&&("undefined"!=typeof SDL&&(a=Ea[SDL.screen+0*x.Q>>2],M[SDL.screen+0*x.Q>>2]=a&-8388609),Nc()));if(q.onFullScreen)q.onFullScreen(Fc);Oc(d)}Ic=a;Jc=b;"undefined"===typeof Ic&&(Ic=l);"undefined"===typeof Jc&&(Jc=n);var d=q.canvas;Hc||(Hc=l,document.addEventListener("fullscreenchange",c,n),document.addEventListener("mozfullscreenchange",
+c,n),document.addEventListener("webkitfullscreenchange",c,n),document.addEventListener("MSFullscreenChange",c,n));var f=document.createElement("div");d.parentNode.insertBefore(f,d);f.appendChild(d);f.tc=f.requestFullScreen||f.mozRequestFullScreen||f.msRequestFullscreen||(f.webkitRequestFullScreen?function(){f.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:m);f.tc()};q.requestAnimationFrame=function(a){Kc(a)};q.setCanvasSize=function(a,b,c){Oc(q.canvas,a,b);c||Nc()};
+q.pauseMainLoop=function(){zc=l};q.resumeMainLoop=function(){Ac&&(Ac=n,xc());zc=n};q.getUserMedia=function(){window.qb||(window.qb=navigator.getUserMedia||navigator.mozGetUserMedia);window.qb(i)};Ga=v=x.U(ja);Ha=Ga+5242880;Ia=G=x.U(Ha);z(Ia<ka,"TOTAL_MEMORY not big enough for stack");ta=Math.min;
+var $=(function(global,env,buffer) {
+// EMSCRIPTEN_START_ASM
+"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.STACKTOP|0;var j=env.STACK_MAX|0;var k=env.tempDoublePtr|0;var l=env.ABORT|0;var m=env.__ZTISt9exception|0;var n=0;var o=0;var p=0;var q=0;var r=+env.NaN,s=+env.Infinity;var t=0,u=0,v=0,w=0,x=0.0,y=0,z=0,A=0,B=0.0;var C=0;var D=0;var E=0;var F=0;var G=0;var H=0;var I=0;var J=0;var K=0;var L=0;var M=global.Math.floor;var N=global.Math.abs;var O=global.Math.sqrt;var P=global.Math.pow;var Q=global.Math.cos;var R=global.Math.sin;var S=global.Math.tan;var T=global.Math.acos;var U=global.Math.asin;var V=global.Math.atan;var W=global.Math.atan2;var X=global.Math.exp;var Y=global.Math.log;var Z=global.Math.ceil;var _=global.Math.imul;var $=env.abort;var aa=env.assert;var ba=env.asmPrintInt;var ca=env.asmPrintFloat;var da=env.min;var ea=env.invoke_iiii;var fa=env.invoke_viiiii;var ga=env.invoke_vi;var ha=env.invoke_vii;var ia=env.invoke_ii;var ja=env.invoke_viii;var ka=env.invoke_v;var la=env.invoke_viid;var ma=env.invoke_viiiiii;var na=env.invoke_iii;var oa=env.invoke_iiiiii;var pa=env.invoke_viiii;var qa=env.___cxa_throw;var ra=env._emscripten_run_script;var sa=env._cosf;var ta=env._send;var ua=env.__ZSt9terminatev;var va=env.__reallyNegative;var wa=env.___cxa_is_number_type;var xa=env.___assert_fail;var ya=env.___cxa_allocate_exception;var za=env.___cxa_find_matching_catch;var Aa=env._fflush;var Ba=env._pwrite;var Ca=env.___setErrNo;var Da=env._sbrk;var Ea=env.___cxa_begin_catch;var Fa=env._sinf;var Ga=env._fileno;var Ha=env.___resumeException;var Ia=env.__ZSt18uncaught_exceptionv;var Ja=env._sysconf;var Ka=env._clock;var La=env._emscripten_memcpy_big;var Ma=env._puts;var Na=env._mkport;var Oa=env._floorf;var Pa=env._sqrtf;var Qa=env._write;var Ra=env._emscripten_set_main_loop;var Sa=env.___errno_location;var Ta=env.__ZNSt9exceptionD2Ev;var Ua=env._printf;var Va=env.___cxa_does_inherit;var Wa=env.__exit;var Xa=env._fputc;var Ya=env._abort;var Za=env._fwrite;var _a=env._time;var $a=env._fprintf;var ab=env._emscripten_cancel_main_loop;var bb=env.__formatString;var cb=env._fputs;var db=env._exit;var eb=env.___cxa_pure_virtual;var fb=0.0;
+// EMSCRIPTEN_START_FUNCS
+function sb(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+7&-8;return b|0}function tb(){return i|0}function ub(a){a=a|0;i=a}function vb(a,b){a=a|0;b=b|0;if((n|0)==0){n=a;o=b}}function wb(b){b=b|0;a[k>>0]=a[b>>0];a[k+1>>0]=a[b+1>>0];a[k+2>>0]=a[b+2>>0];a[k+3>>0]=a[b+3>>0]}function xb(b){b=b|0;a[k>>0]=a[b>>0];a[k+1>>0]=a[b+1>>0];a[k+2>>0]=a[b+2>>0];a[k+3>>0]=a[b+3>>0];a[k+4>>0]=a[b+4>>0];a[k+5>>0]=a[b+5>>0];a[k+6>>0]=a[b+6>>0];a[k+7>>0]=a[b+7>>0]}function yb(a){a=a|0;C=a}function zb(){return C|0}function Ab(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0.0,j=0.0,k=0,l=0.0,m=0,n=0.0;d=i;e=c[4]|0;f=i;i=i+((4*e|0)+15&-16)|0;k=(e|0)>0;if(k){m=0;j=0.0;do{l=+(c[b+(m<<2)>>2]|0)/1.0e6*1.0e3;g[f+(m<<2)>>2]=l;j=j+l;m=m+1|0}while((m|0)<(e|0));h=+(e|0);j=j/h;g[a>>2]=j;if(k){k=0;l=0.0;do{n=+g[f+(k<<2)>>2]-j;l=l+n*n;k=k+1|0}while((k|0)<(e|0))}else{l=0.0}}else{h=+(e|0);g[a>>2]=0.0/h;l=0.0}g[a+4>>2]=+O(+(l/h));i=d;return}function Bb(d,e){d=d|0;e=e|0;var f=0,h=0,j=0,k=0.0,l=0.0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0;f=i;i=i+240|0;j=f;q=f+224|0;h=f+168|0;n=f+160|0;m=f+152|0;a:do{if((d|0)>1){s=a[c[e+4>>2]>>0]|0;switch(s|0){case 49:{c[2]=5;c[4]=35;s=5;t=35;break a};case 50:{c[2]=32;c[4]=161;s=32;t=161;break a};case 51:{r=5;break a};case 52:{c[2]=320;c[4]=2331;s=320;t=2331;break a};case 53:{c[2]=640;c[4]=5661;s=640;t=5661;break a};case 48:{y=0;i=f;return y|0};default:{c[j>>2]=s+ -48;Ua(80,j|0)|0;y=-1;i=f;return y|0}}}else{r=5}}while(0);if((r|0)==5){c[2]=64;c[4]=333;s=64;t=333}r=t+s|0;c[4]=r;c[2]=0;c[8]=Pe(r>>>0>1073741823?-1:r<<2)|0;g[q>>2]=0.0;g[q+4>>2]=-10.0;t=Oe(103028)|0;Ec(t,q);c[6]=t;Gc(t,0);c[j+44>>2]=0;t=j+4|0;s=j+36|0;c[t+0>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;c[t+20>>2]=0;c[t+24>>2]=0;c[t+28>>2]=0;a[s>>0]=1;a[j+37>>0]=1;a[j+38>>0]=0;a[j+39>>0]=0;c[j>>2]=0;a[j+40>>0]=1;g[j+48>>2]=1.0;s=Fc(c[6]|0,j)|0;c[h>>2]=240;c[h+4>>2]=1;g[h+8>>2]=.009999999776482582;t=h+28|0;c[t+0>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;b[t+16>>1]=0;g[n>>2]=-40.0;g[n+4>>2]=0.0;g[m>>2]=40.0;g[m+4>>2]=0.0;Hb(h,n,m);dc(s,h,0.0)|0;c[j>>2]=504;c[j+4>>2]=2;g[j+8>>2]=.009999999776482582;c[j+148>>2]=0;g[j+12>>2]=0.0;g[j+16>>2]=0.0;Pb(j,.5,.5);s=h+44|0;t=h+4|0;m=h+36|0;v=h+37|0;w=h+38|0;x=h+39|0;y=h+40|0;r=h+48|0;q=h+4|0;n=0;p=-7.0;o=.75;while(1){u=n;l=p;k=o;while(1){c[s>>2]=0;c[t+0>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;c[t+20>>2]=0;c[t+24>>2]=0;c[t+28>>2]=0;a[m>>0]=1;a[v>>0]=1;a[w>>0]=0;a[x>>0]=0;a[y>>0]=1;g[r>>2]=1.0;c[h>>2]=2;B=+l;A=+k;z=q;g[z>>2]=B;g[z+4>>2]=A;z=Fc(c[6]|0,h)|0;dc(z,j,5.0)|0;c[14]=z;u=u+1|0;if((u|0)>=40){break}else{l=l+1.125;k=k+0.0}}n=n+1|0;if((n|0)>=40){break}else{p=p+.5625;o=o+1.0}}if((c[2]|0)>0){h=0;do{Jc(c[6]|0,.01666666753590107,3,3);h=h+1|0}while((h|0)<(c[2]|0))}if((d|0)>2){z=(a[c[e+8>>2]>>0]|0)+ -48|0;c[18]=z;if((z|0)!=0){Ma(208)|0;Ra(2,60,1);z=0;i=f;return z|0}}else{c[18]=0}while(1){Eb();if((c[16]|0)>(c[4]|0)){e=0;break}}i=f;return e|0}function Cb(a){a=a|0;return}function Db(a){a=a|0;return}function Eb(){var a=0,b=0,d=0,e=0,f=0.0,j=0.0,l=0.0;a=i;i=i+48|0;b=a;d=a+32|0;e=c[16]|0;if((e|0)>=(c[4]|0)){c[16]=e+1;Ab(d,c[8]|0);l=+g[d+4>>2];j=+(c[10]|0)/1.0e6*1.0e3;f=+(c[12]|0)/1.0e6*1.0e3;h[k>>3]=+g[d>>2];c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];e=b+8|0;h[k>>3]=l;c[e>>2]=c[k>>2];c[e+4>>2]=c[k+4>>2];e=b+16|0;h[k>>3]=j;c[e>>2]=c[k>>2];c[e+4>>2]=c[k+4>>2];e=b+24|0;h[k>>3]=f;c[e>>2]=c[k>>2];c[e+4>>2]=c[k+4>>2];Ua(96,b|0)|0;ra(152);if((c[18]|0)==0){i=a;return}ab();i=a;return}d=Ka()|0;Jc(c[6]|0,.01666666753590107,3,3);d=(Ka()|0)-d|0;b=c[16]|0;c[(c[8]|0)+(b<<2)>>2]=d;if((d|0)<(c[10]|0)){c[10]=d}if((d|0)>(c[12]|0)){c[12]=d}c[16]=b+1;i=a;return}function Fb(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function Gb(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function Hb(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=d;d=c[g+4>>2]|0;f=b+12|0;c[f>>2]=c[g>>2];c[f+4>>2]=d;f=e;e=c[f+4>>2]|0;d=b+20|0;c[d>>2]=c[f>>2];c[d+4>>2]=e;a[b+44>>0]=0;a[b+45>>0]=0;return}function Ib(a,d){a=a|0;d=d|0;var e=0,f=0,h=0,j=0;e=i;d=Xb(d,48)|0;if((d|0)==0){d=0}else{c[d>>2]=240;c[d+4>>2]=1;g[d+8>>2]=.009999999776482582;f=d+28|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;b[f+16>>1]=0}j=a+4|0;h=c[j+4>>2]|0;f=d+4|0;c[f>>2]=c[j>>2];c[f+4>>2]=h;f=d+12|0;a=a+12|0;c[f+0>>2]=c[a+0>>2];c[f+4>>2]=c[a+4>>2];c[f+8>>2]=c[a+8>>2];c[f+12>>2]=c[a+12>>2];c[f+16>>2]=c[a+16>>2];c[f+20>>2]=c[a+20>>2];c[f+24>>2]=c[a+24>>2];c[f+28>>2]=c[a+28>>2];b[f+32>>1]=b[a+32>>1]|0;i=e;return d|0}function Jb(a){a=a|0;return 1}function Kb(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function Lb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0.0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0;e=i;j=+g[d>>2];k=+g[c>>2]-j;m=+g[d+4>>2];f=+g[c+4>>2]-m;o=+g[d+12>>2];h=+g[d+8>>2];l=k*o+f*h;k=o*f-k*h;j=+g[c+8>>2]-j;m=+g[c+12>>2]-m;f=o*j+h*m-l;j=o*m-h*j-k;d=a+12|0;h=+g[d>>2];m=+g[d+4>>2];d=a+20|0;o=+g[d>>2];o=o-h;p=+g[d+4>>2]-m;s=-o;n=o*o+p*p;q=+O(+n);if(q<1.1920928955078125e-7){q=p}else{t=1.0/q;q=p*t;s=t*s}r=(m-k)*s+(h-l)*q;t=j*s+f*q;if(t==0.0){d=0;i=e;return d|0}t=r/t;if(t<0.0){d=0;i=e;return d|0}if(+g[c+16>>2]<t|n==0.0){d=0;i=e;return d|0}p=(o*(l+f*t-h)+p*(k+j*t-m))/n;if(p<0.0|p>1.0){d=0;i=e;return d|0}g[b+8>>2]=t;if(r>0.0){r=+-q;t=+-s;d=b;g[d>>2]=r;g[d+4>>2]=t;d=1;i=e;return d|0}else{r=+q;t=+s;d=b;g[d>>2]=r;g[d+4>>2]=t;d=1;i=e;return d|0}return 0}function Mb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0;d=i;k=+g[c+12>>2];l=+g[a+12>>2];m=+g[c+8>>2];e=+g[a+16>>2];j=+g[c>>2];h=j+(k*l-m*e);n=+g[c+4>>2];e=l*m+k*e+n;l=+g[a+20>>2];f=+g[a+24>>2];j=j+(k*l-m*f);f=n+(m*l+k*f);k=+g[a+8>>2];l=+((h<j?h:j)-k);n=+((e<f?e:f)-k);c=b;g[c>>2]=l;g[c+4>>2]=n;h=+(k+(h>j?h:j));n=+(k+(e>f?e:f));c=b+8|0;g[c>>2]=h;g[c+4>>2]=n;i=d;return}function Nb(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0.0;d=i;g[b>>2]=0.0;e=+((+g[a+12>>2]+ +g[a+20>>2])*.5);c=+((+g[a+16>>2]+ +g[a+24>>2])*.5);a=b+4|0;g[a>>2]=e;g[a+4>>2]=c;g[b+12>>2]=0.0;i=d;return}function Ob(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0;d=i;b=Xb(b,152)|0;if((b|0)==0){b=0}else{c[b>>2]=504;c[b+4>>2]=2;g[b+8>>2]=.009999999776482582;c[b+148>>2]=0;g[b+12>>2]=0.0;g[b+16>>2]=0.0}h=a+4|0;f=c[h+4>>2]|0;e=b+4|0;c[e>>2]=c[h>>2];c[e+4>>2]=f;Xe(b+12|0,a+12|0,140)|0;i=d;return b|0}function Pb(a,b,d){a=a|0;b=+b;d=+d;var e=0.0,f=0.0;c[a+148>>2]=4;e=-b;f=-d;g[a+20>>2]=e;g[a+24>>2]=f;g[a+28>>2]=b;g[a+32>>2]=f;g[a+36>>2]=b;g[a+40>>2]=d;g[a+44>>2]=e;g[a+48>>2]=d;g[a+84>>2]=0.0;g[a+88>>2]=-1.0;g[a+92>>2]=1.0;g[a+96>>2]=0.0;g[a+100>>2]=0.0;g[a+104>>2]=1.0;g[a+108>>2]=-1.0;g[a+112>>2]=0.0;g[a+12>>2]=0.0;g[a+16>>2]=0.0;return}function Qb(a){a=a|0;return 1}function Rb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,j=0,k=0.0,l=0.0,m=0.0;e=i;k=+g[d>>2]- +g[b>>2];l=+g[d+4>>2]- +g[b+4>>2];m=+g[b+12>>2];h=+g[b+8>>2];f=k*m+l*h;h=m*l-k*h;b=c[a+148>>2]|0;if((b|0)>0){d=0}else{j=1;i=e;return j|0}while(1){j=d+1|0;if((f- +g[a+(d<<3)+20>>2])*+g[a+(d<<3)+84>>2]+(h- +g[a+(d<<3)+24>>2])*+g[a+(d<<3)+88>>2]>0.0){b=0;a=4;break}if((j|0)<(b|0)){d=j}else{b=1;a=4;break}}if((a|0)==4){i=e;return b|0}return 0}function Sb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0.0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0;f=i;m=+g[e>>2];l=+g[d>>2]-m;u=+g[e+4>>2];n=+g[d+4>>2]-u;k=e+12|0;t=+g[k>>2];e=e+8|0;v=+g[e>>2];o=l*t+n*v;l=t*n-l*v;m=+g[d+8>>2]-m;u=+g[d+12>>2]-u;n=t*m+v*u-o;m=t*u-v*m-l;d=d+16|0;q=c[a+148>>2]|0;do{if((q|0)>0){s=0;r=-1;p=0.0;t=+g[d>>2];a:while(1){w=+g[a+(s<<3)+84>>2];v=+g[a+(s<<3)+88>>2];u=(+g[a+(s<<3)+20>>2]-o)*w+(+g[a+(s<<3)+24>>2]-l)*v;v=n*w+m*v;do{if(v==0.0){if(u<0.0){a=0;q=18;break a}}else{if(v<0.0?u<p*v:0){r=s;p=u/v;break}if(v>0.0?u<t*v:0){t=u/v}}}while(0);s=s+1|0;if(t<p){a=0;q=18;break}if((s|0)>=(q|0)){q=13;break}}if((q|0)==13){if(p>=0.0){h=r;j=p;break}xa(376,328,249,424)}else if((q|0)==18){i=f;return a|0}}else{h=-1;j=0.0}}while(0);if(!(j<=+g[d>>2])){xa(376,328,249,424)}if(!((h|0)>-1)){s=0;i=f;return s|0}g[b+8>>2]=j;u=+g[k>>2];p=+g[a+(h<<3)+84>>2];t=+g[e>>2];w=+g[a+(h<<3)+88>>2];v=+(u*p-t*w);w=+(p*t+u*w);s=b;g[s>>2]=v;g[s+4>>2]=w;s=1;i=f;return s|0}function Tb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0;e=i;h=+g[d+12>>2];r=+g[a+20>>2];j=+g[d+8>>2];n=+g[a+24>>2];f=+g[d>>2];q=f+(h*r-j*n);k=+g[d+4>>2];n=r*j+h*n+k;d=c[a+148>>2]|0;if((d|0)>1){m=n;l=q;o=q;p=1;do{s=+g[a+(p<<3)+20>>2];q=+g[a+(p<<3)+24>>2];r=f+(h*s-j*q);q=s*j+h*q+k;o=o<r?o:r;m=m<q?m:q;l=l>r?l:r;n=n>q?n:q;p=p+1|0}while((p|0)<(d|0))}else{m=n;o=q;l=q}s=+g[a+8>>2];q=+(o-s);r=+(m-s);p=b;g[p>>2]=q;g[p+4>>2]=r;r=+(l+s);s=+(n+s);p=b+8|0;g[p>>2]=r;g[p+4>>2]=s;i=e;return}function Ub(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0;e=i;f=c[a+148>>2]|0;if((f|0)>2){h=0.0;j=0.0;o=0}else{xa(432,328,306,456)}do{h=h+ +g[a+(o<<3)+20>>2];j=j+ +g[a+(o<<3)+24>>2];o=o+1|0}while((o|0)<(f|0));n=1.0/+(f|0);h=h*n;n=j*n;s=a+20|0;v=a+24|0;l=0.0;m=0.0;j=0.0;k=0.0;t=0;do{u=+g[a+(t<<3)+20>>2]-h;p=+g[a+(t<<3)+24>>2]-n;t=t+1|0;o=(t|0)<(f|0);if(o){q=a+(t<<3)+20|0;r=a+(t<<3)+24|0}else{q=s;r=v}x=+g[q>>2]-h;w=+g[r>>2]-n;y=u*w-p*x;z=y*.5;k=k+z;z=z*.3333333432674408;l=l+(u+x)*z;m=m+(p+w)*z;j=j+y*.0833333358168602*(x*x+(u*u+u*x)+(w*w+(p*p+p*w)))}while(o);p=k*d;g[b>>2]=p;if(k>1.1920928955078125e-7){z=1.0/k;y=l*z;z=m*z;w=h+y;x=n+z;n=+w;u=+x;v=b+4|0;g[v>>2]=n;g[v+4>>2]=u;g[b+12>>2]=j*d+p*(w*w+x*x-(y*y+z*z));i=e;return}else{xa(472,328,352,456)}}function Vb(b){b=b|0;var d=0,e=0,f=0,g=0;e=i;f=b+8|0;c[f>>2]=128;c[b+4>>2]=0;g=Zb(1024)|0;c[b>>2]=g;Ve(g|0,0,c[f>>2]<<3|0)|0;f=b+12|0;b=f+56|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(b|0));if((a[1280]|0)==0){b=1;f=0}else{i=e;return}do{if((f|0)>=14){d=3;break}if((b|0)>(c[576+(f<<2)>>2]|0)){f=f+1|0;a[632+b>>0]=f}else{a[632+b>>0]=f}b=b+1|0}while((b|0)<641);if((d|0)==3){xa(1288,1312,73,1352)}a[1280]=1;i=e;return}function Wb(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;e=c[a>>2]|0;if((c[d>>2]|0)>0){f=0}else{f=e;_b(f);i=b;return}do{_b(c[e+(f<<3)+4>>2]|0);f=f+1|0;e=c[a>>2]|0}while((f|0)<(c[d>>2]|0));_b(e);i=b;return}function Xb(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;if((d|0)==0){l=0;i=e;return l|0}if((d|0)<=0){xa(1376,1312,104,1392)}if((d|0)>640){l=Zb(d)|0;i=e;return l|0}l=a[632+d>>0]|0;g=l&255;if(!((l&255)<14)){xa(1408,1312,112,1392)}d=b+(g<<2)+12|0;f=c[d>>2]|0;if((f|0)!=0){c[d>>2]=c[f>>2];l=f;i=e;return l|0}f=b+4|0;h=c[f>>2]|0;j=b+8|0;if((h|0)==(c[j>>2]|0)){l=c[b>>2]|0;h=h+128|0;c[j>>2]=h;h=Zb(h<<3)|0;c[b>>2]=h;Xe(h|0,l|0,c[f>>2]<<3|0)|0;Ve((c[b>>2]|0)+(c[f>>2]<<3)|0,0,1024)|0;_b(l);h=c[f>>2]|0}l=c[b>>2]|0;j=Zb(16384)|0;b=l+(h<<3)+4|0;c[b>>2]=j;g=c[576+(g<<2)>>2]|0;c[l+(h<<3)>>2]=g;h=16384/(g|0)|0;if((_(h,g)|0)>=16385){xa(1448,1312,140,1392)}h=h+ -1|0;if((h|0)>0){l=0;while(1){k=l+1|0;c[j+(_(l,g)|0)>>2]=j+(_(k,g)|0);j=c[b>>2]|0;if((k|0)==(h|0)){break}else{l=k}}}c[j+(_(h,g)|0)>>2]=0;c[d>>2]=c[c[b>>2]>>2];c[f>>2]=(c[f>>2]|0)+1;l=c[b>>2]|0;i=e;return l|0}function Yb(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=i;if((e|0)==0){i=f;return}if((e|0)<=0){xa(1376,1312,164,1488)}if((e|0)>640){_b(d);i=f;return}e=a[632+e>>0]|0;if(!((e&255)<14)){xa(1408,1312,173,1488)}e=b+((e&255)<<2)+12|0;c[d>>2]=c[e>>2];c[e>>2]=d;i=f;return}function Zb(a){a=a|0;var b=0;b=i;a=Me(a)|0;i=b;return a|0}function _b(a){a=a|0;var b=0;b=i;Ne(a);i=b;return}function $b(d,e,f){d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0;h=i;n=e+4|0;r=+g[n>>2];if(!(r==r&0.0==0.0&r>-s&r<s)){xa(1496,1520,27,1552)}r=+g[e+8>>2];if(!(r==r&0.0==0.0&r>-s&r<s)){xa(1496,1520,27,1552)}k=e+16|0;r=+g[k>>2];if(!(r==r&0.0==0.0&r>-s&r<s)){xa(1560,1520,28,1552)}r=+g[e+20>>2];if(!(r==r&0.0==0.0&r>-s&r<s)){xa(1560,1520,28,1552)}l=e+12|0;r=+g[l>>2];if(!(r==r&0.0==0.0&r>-s&r<s)){xa(1592,1520,29,1552)}m=e+24|0;r=+g[m>>2];if(!(r==r&0.0==0.0&r>-s&r<s)){xa(1616,1520,30,1552)}j=e+32|0;r=+g[j>>2];if(!(r>=0.0)|r==r&0.0==0.0&r>-s&r<s^1){xa(1648,1520,31,1552)}o=e+28|0;r=+g[o>>2];if(!(r>=0.0)|r==r&0.0==0.0&r>-s&r<s^1){xa(1712,1520,32,1552)}p=d+4|0;q=(a[e+39>>0]|0)==0?0:8;b[p>>1]=q;if((a[e+38>>0]|0)!=0){q=(q&65535|16)&65535;b[p>>1]=q}if((a[e+36>>0]|0)!=0){q=(q&65535|4)&65535;b[p>>1]=q}if((a[e+37>>0]|0)!=0){q=(q&65535|2)&65535;b[p>>1]=q}if((a[e+40>>0]|0)!=0){b[p>>1]=q&65535|32}c[d+88>>2]=f;p=n;q=c[p>>2]|0;p=c[p+4>>2]|0;n=d+12|0;c[n>>2]=q;c[n+4>>2]=p;r=+g[l>>2];g[d+20>>2]=+R(+r);g[d+24>>2]=+Q(+r);g[d+28>>2]=0.0;g[d+32>>2]=0.0;n=d+36|0;c[n>>2]=q;c[n+4>>2]=p;n=d+44|0;c[n>>2]=q;c[n+4>>2]=p;g[d+52>>2]=+g[l>>2];g[d+56>>2]=+g[l>>2];g[d+60>>2]=0.0;c[d+108>>2]=0;c[d+112>>2]=0;c[d+92>>2]=0;c[d+96>>2]=0;n=k;p=c[n+4>>2]|0;q=d+64|0;c[q>>2]=c[n>>2];c[q+4>>2]=p;g[d+72>>2]=+g[m>>2];g[d+132>>2]=+g[o>>2];g[d+136>>2]=+g[j>>2];g[d+140>>2]=+g[e+48>>2];g[d+76>>2]=0.0;g[d+80>>2]=0.0;g[d+84>>2]=0.0;g[d+144>>2]=0.0;q=c[e>>2]|0;c[d>>2]=q;j=d+116|0;if((q|0)==2){g[j>>2]=1.0;g[d+120>>2]=1.0;p=d+124|0;g[p>>2]=0.0;p=d+128|0;g[p>>2]=0.0;p=e+44|0;p=c[p>>2]|0;q=d+148|0;c[q>>2]=p;q=d+100|0;c[q>>2]=0;q=d+104|0;c[q>>2]=0;i=h;return}else{g[j>>2]=0.0;g[d+120>>2]=0.0;p=d+124|0;g[p>>2]=0.0;p=d+128|0;g[p>>2]=0.0;p=e+44|0;p=c[p>>2]|0;q=d+148|0;c[q>>2]=p;q=d+100|0;c[q>>2]=0;q=d+104|0;c[q>>2]=0;i=h;return}}function ac(a){a=a|0;var d=0,e=0,f=0,h=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0.0;k=i;i=i+16|0;n=k;m=a+116|0;l=a+120|0;e=a+124|0;f=a+128|0;d=a+28|0;g[d>>2]=0.0;g[a+32>>2]=0.0;c[m+0>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;o=c[a>>2]|0;if((o|0)==1|(o|0)==0){q=a+12|0;p=c[q>>2]|0;q=c[q+4>>2]|0;s=a+36|0;c[s>>2]=p;c[s+4>>2]=q;s=a+44|0;c[s>>2]=p;c[s+4>>2]=q;g[a+52>>2]=+g[a+56>>2];i=k;return}else if((o|0)==2){s=3784;v=+g[s>>2];r=+g[s+4>>2];s=c[a+100>>2]|0;if((s|0)!=0){q=n+4|0;o=n+8|0;p=n+12|0;t=0.0;u=0.0;do{w=+g[s>>2];if(!(w==0.0)){x=c[s+12>>2]|0;nb[c[(c[x>>2]|0)+28>>2]&3](x,n,w);t=+g[n>>2];u=t+ +g[m>>2];g[m>>2]=u;v=v+t*+g[q>>2];r=r+t*+g[o>>2];t=+g[p>>2]+ +g[e>>2];g[e>>2]=t}s=c[s+4>>2]|0}while((s|0)!=0);if(u>0.0){w=1.0/u;g[l>>2]=w;v=v*w;r=r*w}else{h=11}}else{t=0.0;h=11}if((h|0)==11){g[m>>2]=1.0;g[l>>2]=1.0;u=1.0}do{if(t>0.0?(b[a+4>>1]&16)==0:0){t=t-(r*r+v*v)*u;g[e>>2]=t;if(t>0.0){j=1.0/t;break}else{xa(1872,1520,319,1856)}}else{h=17}}while(0);if((h|0)==17){g[e>>2]=0.0;j=0.0}g[f>>2]=j;x=a+44|0;s=x;w=+g[s>>2];t=+g[s+4>>2];y=+v;j=+r;s=d;g[s>>2]=y;g[s+4>>2]=j;j=+g[a+24>>2];y=+g[a+20>>2];u=+g[a+12>>2]+(j*v-y*r);r=v*y+j*r+ +g[a+16>>2];j=+u;v=+r;g[x>>2]=j;g[x+4>>2]=v;x=a+36|0;g[x>>2]=j;g[x+4>>2]=v;v=+g[a+72>>2];x=a+64|0;g[x>>2]=+g[x>>2]-v*(r-t);x=a+68|0;g[x>>2]=v*(u-w)+ +g[x>>2];i=k;return}else{xa(1824,1520,284,1856)}}function bc(a){a=a|0;var b=0,d=0,e=0,f=0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0;b=i;i=i+16|0;e=b;k=+g[a+52>>2];l=+R(+k);g[e+8>>2]=l;k=+Q(+k);g[e+12>>2]=k;m=+g[a+28>>2];h=+g[a+32>>2];j=+(+g[a+36>>2]-(k*m-l*h));h=+(+g[a+40>>2]-(m*l+k*h));d=e;g[d>>2]=j;g[d+4>>2]=h;d=(c[a+88>>2]|0)+102872|0;f=c[a+100>>2]|0;if((f|0)==0){i=b;return}a=a+12|0;do{Dc(f,d,e,a);f=c[f+4>>2]|0}while((f|0)!=0);i=b;return}function cc(a,d){a=a|0;d=d|0;var e=0,f=0,h=0,j=0;f=i;e=a+88|0;h=c[e>>2]|0;if((c[h+102868>>2]&2|0)!=0){xa(1776,1520,153,1808)}j=Xb(h,44)|0;if((j|0)==0){j=0}else{Ac(j)}Bc(j,h,a,d);if(!((b[a+4>>1]&32)==0)){Cc(j,(c[e>>2]|0)+102872|0,a+12|0)}d=a+100|0;c[j+4>>2]=c[d>>2];c[d>>2]=j;d=a+104|0;c[d>>2]=(c[d>>2]|0)+1;c[j+8>>2]=a;if(!(+g[j>>2]>0.0)){d=c[e>>2]|0;d=d+102868|0;h=c[d>>2]|0;h=h|1;c[d>>2]=h;i=f;return j|0}ac(a);d=c[e>>2]|0;d=d+102868|0;h=c[d>>2]|0;h=h|1;c[d>>2]=h;i=f;return j|0}function dc(d,e,f){d=d|0;e=e|0;f=+f;var h=0,j=0;h=i;i=i+32|0;j=h;b[j+22>>1]=1;b[j+24>>1]=-1;b[j+26>>1]=0;c[j+4>>2]=0;g[j+8>>2]=.20000000298023224;g[j+12>>2]=0.0;a[j+20>>0]=0;c[j>>2]=e;g[j+16>>2]=f;e=cc(d,j)|0;i=h;return e|0}function ec(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;if((c[b>>2]|0)!=2?(c[d>>2]|0)!=2:0){d=0}else{f=3}a:do{if((f|0)==3){f=c[b+108>>2]|0;if((f|0)==0){d=1}else{while(1){if((c[f>>2]|0)==(d|0)?(a[(c[f+4>>2]|0)+61>>0]|0)==0:0){d=0;break a}f=c[f+12>>2]|0;if((f|0)==0){d=1;break}}}}}while(0);i=e;return d|0}function fc(a){a=a|0;return}function gc(a){a=a|0;return}function hc(a){a=a|0;var b=0;b=i;Lc(a);c[a+60>>2]=0;c[a+64>>2]=0;c[a+68>>2]=1888;c[a+72>>2]=1896;c[a+76>>2]=0;i=b;return}function ic(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;f=c[(c[b+48>>2]|0)+8>>2]|0;e=c[(c[b+52>>2]|0)+8>>2]|0;g=c[a+72>>2]|0;if((g|0)!=0?(c[b+4>>2]&2|0)!=0:0){jb[c[(c[g>>2]|0)+12>>2]&15](g,b)}h=b+8|0;j=c[h>>2]|0;g=b+12|0;if((j|0)!=0){c[j+12>>2]=c[g>>2]}j=c[g>>2]|0;if((j|0)!=0){c[j+8>>2]=c[h>>2]}h=a+60|0;if((c[h>>2]|0)==(b|0)){c[h>>2]=c[g>>2]}h=b+24|0;j=c[h>>2]|0;g=b+28|0;if((j|0)!=0){c[j+12>>2]=c[g>>2]}j=c[g>>2]|0;if((j|0)!=0){c[j+8>>2]=c[h>>2]}f=f+112|0;if((b+16|0)==(c[f>>2]|0)){c[f>>2]=c[g>>2]}g=b+40|0;h=c[g>>2]|0;f=b+44|0;if((h|0)!=0){c[h+12>>2]=c[f>>2]}h=c[f>>2]|0;if((h|0)!=0){c[h+8>>2]=c[g>>2]}e=e+112|0;if((b+32|0)!=(c[e>>2]|0)){j=a+76|0;j=c[j>>2]|0;md(b,j);j=a+64|0;h=c[j>>2]|0;h=h+ -1|0;c[j>>2]=h;i=d;return}c[e>>2]=c[f>>2];j=a+76|0;j=c[j>>2]|0;md(b,j);j=a+64|0;h=c[j>>2]|0;h=h+ -1|0;c[j>>2]=h;i=d;return}function jc(a){a=a|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=i;l=c[a+60>>2]|0;if((l|0)==0){i=e;return}k=a+12|0;j=a+4|0;h=a+72|0;f=a+68|0;a:while(1){p=c[l+48>>2]|0;n=c[l+52>>2]|0;o=c[l+56>>2]|0;m=c[l+60>>2]|0;s=c[p+8>>2]|0;q=c[n+8>>2]|0;t=l+4|0;do{if((c[t>>2]&8|0)==0){d=11}else{if(!(ec(q,s)|0)){t=c[l+12>>2]|0;ic(a,l);l=t;break}r=c[f>>2]|0;if((r|0)!=0?!(gb[c[(c[r>>2]|0)+8>>2]&7](r,p,n)|0):0){t=c[l+12>>2]|0;ic(a,l);l=t;break}c[t>>2]=c[t>>2]&-9;d=11}}while(0);do{if((d|0)==11){d=0;if((b[s+4>>1]&2)==0){r=0}else{r=(c[s>>2]|0)!=0}if((b[q+4>>1]&2)==0){q=0}else{q=(c[q>>2]|0)!=0}if(!(r|q)){l=c[l+12>>2]|0;break}o=c[(c[p+24>>2]|0)+(o*28|0)+24>>2]|0;m=c[(c[n+24>>2]|0)+(m*28|0)+24>>2]|0;if(!((o|0)>-1)){d=19;break a}n=c[k>>2]|0;if((n|0)<=(o|0)){d=19;break a}p=c[j>>2]|0;if(!((m|0)>-1&(n|0)>(m|0))){d=21;break a}if(+g[p+(m*36|0)>>2]- +g[p+(o*36|0)+8>>2]>0.0|+g[p+(m*36|0)+4>>2]- +g[p+(o*36|0)+12>>2]>0.0|+g[p+(o*36|0)>>2]- +g[p+(m*36|0)+8>>2]>0.0|+g[p+(o*36|0)+4>>2]- +g[p+(m*36|0)+12>>2]>0.0){t=c[l+12>>2]|0;ic(a,l);l=t;break}else{od(l,c[h>>2]|0);l=c[l+12>>2]|0;break}}}while(0);if((l|0)==0){d=25;break}}if((d|0)==19){xa(1904,1952,159,2008)}else if((d|0)==21){xa(1904,1952,159,2008)}else if((d|0)==25){i=e;return}}function kc(a){a=a|0;var b=0;b=i;lc(a,a);i=b;return}function lc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;i=i+16|0;g=e;d=a+52|0;c[d>>2]=0;f=a+40|0;n=c[f>>2]|0;do{if((n|0)>0){k=a+32|0;m=a+56|0;j=a+12|0;l=a+4|0;o=0;while(1){p=c[(c[k>>2]|0)+(o<<2)>>2]|0;c[m>>2]=p;if(!((p|0)==-1)){if(!((p|0)>-1)){j=6;break}if((c[j>>2]|0)<=(p|0)){j=6;break}nc(a,a,(c[l>>2]|0)+(p*36|0)|0);n=c[f>>2]|0}o=o+1|0;if((o|0)>=(n|0)){j=9;break}}if((j|0)==6){xa(1904,1952,159,2008)}else if((j|0)==9){h=c[d>>2]|0;break}}else{h=0}}while(0);c[f>>2]=0;f=a+44|0;p=c[f>>2]|0;c[g>>2]=3;pc(p,p+(h*12|0)|0,g);if((c[d>>2]|0)<=0){i=e;return}g=a+12|0;h=a+4|0;k=0;a:while(1){j=c[f>>2]|0;a=j+(k*12|0)|0;l=c[a>>2]|0;if(!((l|0)>-1)){j=14;break}n=c[g>>2]|0;if((n|0)<=(l|0)){j=14;break}m=c[h>>2]|0;j=j+(k*12|0)+4|0;o=c[j>>2]|0;if(!((o|0)>-1&(n|0)>(o|0))){j=16;break}mc(b,c[m+(l*36|0)+16>>2]|0,c[m+(o*36|0)+16>>2]|0);l=c[d>>2]|0;while(1){k=k+1|0;if((k|0)>=(l|0)){j=21;break a}m=c[f>>2]|0;if((c[m+(k*12|0)>>2]|0)!=(c[a>>2]|0)){continue a}if((c[m+(k*12|0)+4>>2]|0)!=(c[j>>2]|0)){continue a}}}if((j|0)==14){xa(1904,1952,153,1992)}else if((j|0)==16){xa(1904,1952,153,1992)}else if((j|0)==21){i=e;return}}function mc(a,d,f){a=a|0;d=d|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;h=i;k=c[d+16>>2]|0;j=c[f+16>>2]|0;d=c[d+20>>2]|0;f=c[f+20>>2]|0;m=c[k+8>>2]|0;l=c[j+8>>2]|0;if((m|0)==(l|0)){i=h;return}o=c[l+112>>2]|0;a:do{if((o|0)!=0){while(1){if((c[o>>2]|0)==(m|0)){n=c[o+4>>2]|0;q=c[n+48>>2]|0;r=c[n+52>>2]|0;p=c[n+56>>2]|0;n=c[n+60>>2]|0;if((q|0)==(k|0)&(r|0)==(j|0)&(p|0)==(d|0)&(n|0)==(f|0)){n=22;break}if((q|0)==(j|0)&(r|0)==(k|0)&(p|0)==(f|0)&(n|0)==(d|0)){n=22;break}}o=c[o+12>>2]|0;if((o|0)==0){break a}}if((n|0)==22){i=h;return}}}while(0);if(!(ec(l,m)|0)){i=h;return}l=c[a+68>>2]|0;if((l|0)!=0?!(gb[c[(c[l>>2]|0)+8>>2]&7](l,k,j)|0):0){i=h;return}d=ld(k,d,j,f,c[a+76>>2]|0)|0;if((d|0)==0){i=h;return}k=c[(c[d+48>>2]|0)+8>>2]|0;j=c[(c[d+52>>2]|0)+8>>2]|0;c[d+8>>2]=0;l=a+60|0;c[d+12>>2]=c[l>>2];f=c[l>>2]|0;if((f|0)!=0){c[f+8>>2]=d}c[l>>2]=d;m=d+16|0;c[d+20>>2]=d;c[m>>2]=j;c[d+24>>2]=0;f=k+112|0;c[d+28>>2]=c[f>>2];l=c[f>>2]|0;if((l|0)!=0){c[l+8>>2]=m}c[f>>2]=m;f=d+32|0;c[d+36>>2]=d;c[f>>2]=k;c[d+40>>2]=0;l=j+112|0;c[d+44>>2]=c[l>>2];d=c[l>>2]|0;if((d|0)!=0){c[d+8>>2]=f}c[l>>2]=f;d=k+4|0;f=e[d>>1]|0;if((f&2|0)==0){b[d>>1]=f|2;g[k+144>>2]=0.0}k=j+4|0;d=e[k>>1]|0;if((d&2|0)==0){b[k>>1]=d|2;g[j+144>>2]=0.0}r=a+64|0;c[r>>2]=(c[r>>2]|0)+1;i=h;return}function nc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;i=i+1040|0;h=f;e=h+4|0;c[h>>2]=e;j=h+1028|0;c[j>>2]=0;k=h+1032|0;c[k>>2]=256;q=c[h>>2]|0;c[q+(c[j>>2]<<2)>>2]=c[a>>2];r=c[j>>2]|0;s=r+1|0;c[j>>2]=s;a:do{if((r|0)>-1){a=a+4|0;n=d+4|0;o=d+8|0;m=d+12|0;while(1){s=s+ -1|0;c[j>>2]=s;p=c[q+(s<<2)>>2]|0;do{if(!((p|0)==-1)?(l=c[a>>2]|0,!(+g[d>>2]- +g[l+(p*36|0)+8>>2]>0.0|+g[n>>2]- +g[l+(p*36|0)+12>>2]>0.0|+g[l+(p*36|0)>>2]- +g[o>>2]>0.0|+g[l+(p*36|0)+4>>2]- +g[m>>2]>0.0)):0){r=l+(p*36|0)+24|0;if((c[r>>2]|0)==-1){if(!(Oc(b,p)|0)){break a}s=c[j>>2]|0;break}if((s|0)==(c[k>>2]|0)?(c[k>>2]=s<<1,s=Zb(s<<3)|0,c[h>>2]=s,Xe(s|0,q|0,c[j>>2]<<2|0)|0,(q|0)!=(e|0)):0){_b(q)}q=c[h>>2]|0;c[q+(c[j>>2]<<2)>>2]=c[r>>2];r=(c[j>>2]|0)+1|0;c[j>>2]=r;p=l+(p*36|0)+28|0;if((r|0)==(c[k>>2]|0)?(c[k>>2]=r<<1,s=Zb(r<<3)|0,c[h>>2]=s,Xe(s|0,q|0,c[j>>2]<<2|0)|0,(q|0)!=(e|0)):0){_b(q)}c[(c[h>>2]|0)+(c[j>>2]<<2)>>2]=c[p>>2];s=(c[j>>2]|0)+1|0;c[j>>2]=s}}while(0);if((s|0)<=0){break a}q=c[h>>2]|0}}}while(0);b=c[h>>2]|0;if((b|0)==(e|0)){i=f;return}_b(b);c[h>>2]=0;i=f;return}function oc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;f=c[a>>2]|0;e=c[b>>2]|0;if((f|0)>=(e|0)){if((f|0)==(e|0)){a=(c[a+4>>2]|0)<(c[b+4>>2]|0)}else{a=0}}else{a=1}i=d;return a|0}function pc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=i;i=i+16|0;e=f;a:while(1){j=b;g=b+ -12|0;b:while(1){k=a;m=j-k|0;switch((m|0)/12|0|0){case 3:{h=6;break a};case 5:{h=15;break a};case 2:{h=4;break a};case 4:{h=14;break a};case 1:case 0:{h=67;break a};default:{}}if((m|0)<372){h=21;break a}n=(m|0)/24|0;l=a+(n*12|0)|0;do{if((m|0)>11988){p=(m|0)/48|0;m=a+(p*12|0)|0;p=a+((p+n|0)*12|0)|0;n=qc(a,m,l,p,d)|0;if(pb[c[d>>2]&3](g,p)|0){c[e+0>>2]=c[p+0>>2];c[e+4>>2]=c[p+4>>2];c[e+8>>2]=c[p+8>>2];c[p+0>>2]=c[g+0>>2];c[p+4>>2]=c[g+4>>2];c[p+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];o=n+1|0;if(pb[c[d>>2]&3](p,l)|0){c[e+0>>2]=c[l+0>>2];c[e+4>>2]=c[l+4>>2];c[e+8>>2]=c[l+8>>2];c[l+0>>2]=c[p+0>>2];c[l+4>>2]=c[p+4>>2];c[l+8>>2]=c[p+8>>2];c[p+0>>2]=c[e+0>>2];c[p+4>>2]=c[e+4>>2];c[p+8>>2]=c[e+8>>2];o=n+2|0;if(pb[c[d>>2]&3](l,m)|0){c[e+0>>2]=c[m+0>>2];c[e+4>>2]=c[m+4>>2];c[e+8>>2]=c[m+8>>2];c[m+0>>2]=c[l+0>>2];c[m+4>>2]=c[l+4>>2];c[m+8>>2]=c[l+8>>2];c[l+0>>2]=c[e+0>>2];c[l+4>>2]=c[e+4>>2];c[l+8>>2]=c[e+8>>2];if(pb[c[d>>2]&3](m,a)|0){c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[m+0>>2];c[a+4>>2]=c[m+4>>2];c[a+8>>2]=c[m+8>>2];c[m+0>>2]=c[e+0>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];n=n+4|0}else{n=n+3|0}}else{n=o}}else{n=o}}}else{q=pb[c[d>>2]&3](l,a)|0;m=pb[c[d>>2]&3](g,l)|0;if(!q){if(!m){n=0;break}c[e+0>>2]=c[l+0>>2];c[e+4>>2]=c[l+4>>2];c[e+8>>2]=c[l+8>>2];c[l+0>>2]=c[g+0>>2];c[l+4>>2]=c[g+4>>2];c[l+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];if(!(pb[c[d>>2]&3](l,a)|0)){n=1;break}c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[l+0>>2];c[a+4>>2]=c[l+4>>2];c[a+8>>2]=c[l+8>>2];c[l+0>>2]=c[e+0>>2];c[l+4>>2]=c[e+4>>2];c[l+8>>2]=c[e+8>>2];n=2;break}if(m){c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[g+0>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];n=1;break}c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[l+0>>2];c[a+4>>2]=c[l+4>>2];c[a+8>>2]=c[l+8>>2];c[l+0>>2]=c[e+0>>2];c[l+4>>2]=c[e+4>>2];c[l+8>>2]=c[e+8>>2];if(pb[c[d>>2]&3](g,l)|0){c[e+0>>2]=c[l+0>>2];c[e+4>>2]=c[l+4>>2];c[e+8>>2]=c[l+8>>2];c[l+0>>2]=c[g+0>>2];c[l+4>>2]=c[g+4>>2];c[l+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];n=2}else{n=1}}}while(0);do{if(pb[c[d>>2]&3](a,l)|0){o=g}else{o=g;while(1){o=o+ -12|0;if((a|0)==(o|0)){break}if(pb[c[d>>2]&3](o,l)|0){h=50;break}}if((h|0)==50){h=0;c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[o+0>>2];c[a+4>>2]=c[o+4>>2];c[a+8>>2]=c[o+8>>2];c[o+0>>2]=c[e+0>>2];c[o+4>>2]=c[e+4>>2];c[o+8>>2]=c[e+8>>2];n=n+1|0;break}l=a+12|0;if(!(pb[c[d>>2]&3](a,g)|0)){if((l|0)==(g|0)){h=67;break a}while(1){k=l+12|0;if(pb[c[d>>2]&3](a,l)|0){break}if((k|0)==(g|0)){h=67;break a}else{l=k}}c[e+0>>2]=c[l+0>>2];c[e+4>>2]=c[l+4>>2];c[e+8>>2]=c[l+8>>2];c[l+0>>2]=c[g+0>>2];c[l+4>>2]=c[g+4>>2];c[l+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];l=k}if((l|0)==(g|0)){h=67;break a}else{k=g}while(1){while(1){m=l+12|0;if(pb[c[d>>2]&3](a,l)|0){break}else{l=m}}do{k=k+ -12|0}while(pb[c[d>>2]&3](a,k)|0);if(!(l>>>0<k>>>0)){a=l;continue b}c[e+0>>2]=c[l+0>>2];c[e+4>>2]=c[l+4>>2];c[e+8>>2]=c[l+8>>2];c[l+0>>2]=c[k+0>>2];c[l+4>>2]=c[k+4>>2];c[l+8>>2]=c[k+8>>2];c[k+0>>2]=c[e+0>>2];c[k+4>>2]=c[e+4>>2];c[k+8>>2]=c[e+8>>2];l=m}}}while(0);m=a+12|0;c:do{if(m>>>0<o>>>0){while(1){q=m;while(1){m=q+12|0;if(pb[c[d>>2]&3](q,l)|0){q=m}else{p=o;break}}do{p=p+ -12|0}while(!(pb[c[d>>2]&3](p,l)|0));if(q>>>0>p>>>0){m=q;break c}c[e+0>>2]=c[q+0>>2];c[e+4>>2]=c[q+4>>2];c[e+8>>2]=c[q+8>>2];c[q+0>>2]=c[p+0>>2];c[q+4>>2]=c[p+4>>2];c[q+8>>2]=c[p+8>>2];c[p+0>>2]=c[e+0>>2];c[p+4>>2]=c[e+4>>2];c[p+8>>2]=c[e+8>>2];o=p;l=(l|0)==(q|0)?p:l;n=n+1|0}}}while(0);if((m|0)!=(l|0)?pb[c[d>>2]&3](l,m)|0:0){c[e+0>>2]=c[m+0>>2];c[e+4>>2]=c[m+4>>2];c[e+8>>2]=c[m+8>>2];c[m+0>>2]=c[l+0>>2];c[m+4>>2]=c[l+4>>2];c[m+8>>2]=c[l+8>>2];c[l+0>>2]=c[e+0>>2];c[l+4>>2]=c[e+4>>2];c[l+8>>2]=c[e+8>>2];n=n+1|0}if((n|0)==0){n=sc(a,m,d)|0;l=m+12|0;if(sc(l,b,d)|0){h=62;break}if(n){a=l;continue}}q=m;if((q-k|0)>=(j-q|0)){h=66;break}pc(a,m,d);a=m+12|0}if((h|0)==62){h=0;if(n){h=67;break}else{b=m;continue}}else if((h|0)==66){h=0;pc(m+12|0,b,d);b=m;continue}}if((h|0)==4){if(!(pb[c[d>>2]&3](g,a)|0)){i=f;return}c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[g+0>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];i=f;return}else if((h|0)==6){h=a+12|0;q=pb[c[d>>2]&3](h,a)|0;j=pb[c[d>>2]&3](g,h)|0;if(!q){if(!j){i=f;return}c[e+0>>2]=c[h+0>>2];c[e+4>>2]=c[h+4>>2];c[e+8>>2]=c[h+8>>2];c[h+0>>2]=c[g+0>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];if(!(pb[c[d>>2]&3](h,a)|0)){i=f;return}c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[h+0>>2];c[a+4>>2]=c[h+4>>2];c[a+8>>2]=c[h+8>>2];c[h+0>>2]=c[e+0>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];i=f;return}if(j){c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[g+0>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];i=f;return}c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[h+0>>2];c[a+4>>2]=c[h+4>>2];c[a+8>>2]=c[h+8>>2];c[h+0>>2]=c[e+0>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];if(!(pb[c[d>>2]&3](g,h)|0)){i=f;return}c[e+0>>2]=c[h+0>>2];c[e+4>>2]=c[h+4>>2];c[e+8>>2]=c[h+8>>2];c[h+0>>2]=c[g+0>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];i=f;return}else if((h|0)==14){qc(a,a+12|0,a+24|0,g,d)|0;i=f;return}else if((h|0)==15){h=a+12|0;j=a+24|0;b=a+36|0;qc(a,h,j,b,d)|0;if(!(pb[c[d>>2]&3](g,b)|0)){i=f;return}c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[b+0>>2]=c[g+0>>2];c[b+4>>2]=c[g+4>>2];c[b+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];if(!(pb[c[d>>2]&3](b,j)|0)){i=f;return}c[e+0>>2]=c[j+0>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[j+0>>2]=c[b+0>>2];c[j+4>>2]=c[b+4>>2];c[j+8>>2]=c[b+8>>2];c[b+0>>2]=c[e+0>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];if(!(pb[c[d>>2]&3](j,h)|0)){i=f;return}c[e+0>>2]=c[h+0>>2];c[e+4>>2]=c[h+4>>2];c[e+8>>2]=c[h+8>>2];c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[j+0>>2]=c[e+0>>2];c[j+4>>2]=c[e+4>>2];c[j+8>>2]=c[e+8>>2];if(!(pb[c[d>>2]&3](h,a)|0)){i=f;return}c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[h+0>>2];c[a+4>>2]=c[h+4>>2];c[a+8>>2]=c[h+8>>2];c[h+0>>2]=c[e+0>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];i=f;return}else if((h|0)==21){rc(a,b,d);i=f;return}else if((h|0)==67){i=f;return}}function qc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;i=i+16|0;h=g;k=pb[c[f>>2]&3](b,a)|0;j=pb[c[f>>2]&3](d,b)|0;do{if(k){if(j){c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[d+0>>2]=c[h+0>>2];c[d+4>>2]=c[h+4>>2];c[d+8>>2]=c[h+8>>2];j=1;break}c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[b+0>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[b+0>>2]=c[h+0>>2];c[b+4>>2]=c[h+4>>2];c[b+8>>2]=c[h+8>>2];if(pb[c[f>>2]&3](d,b)|0){c[h+0>>2]=c[b+0>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[b+0>>2]=c[d+0>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[d+0>>2]=c[h+0>>2];c[d+4>>2]=c[h+4>>2];c[d+8>>2]=c[h+8>>2];j=2}else{j=1}}else{if(j){c[h+0>>2]=c[b+0>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[b+0>>2]=c[d+0>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[d+0>>2]=c[h+0>>2];c[d+4>>2]=c[h+4>>2];c[d+8>>2]=c[h+8>>2];if(pb[c[f>>2]&3](b,a)|0){c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[b+0>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[b+0>>2]=c[h+0>>2];c[b+4>>2]=c[h+4>>2];c[b+8>>2]=c[h+8>>2];j=2}else{j=1}}else{j=0}}}while(0);if(!(pb[c[f>>2]&3](e,d)|0)){k=j;i=g;return k|0}c[h+0>>2]=c[d+0>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[d+0>>2]=c[e+0>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[e+0>>2]=c[h+0>>2];c[e+4>>2]=c[h+4>>2];c[e+8>>2]=c[h+8>>2];if(!(pb[c[f>>2]&3](d,b)|0)){k=j+1|0;i=g;return k|0}c[h+0>>2]=c[b+0>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[b+0>>2]=c[d+0>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[d+0>>2]=c[h+0>>2];c[d+4>>2]=c[h+4>>2];c[d+8>>2]=c[h+8>>2];if(!(pb[c[f>>2]&3](b,a)|0)){k=j+2|0;i=g;return k|0}c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[b+0>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[b+0>>2]=c[h+0>>2];c[b+4>>2]=c[h+4>>2];c[b+8>>2]=c[h+8>>2];k=j+3|0;i=g;return k|0}function rc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+32|0;g=f+12|0;e=f;h=a+24|0;j=a+12|0;l=pb[c[d>>2]&3](j,a)|0;k=pb[c[d>>2]&3](h,j)|0;do{if(l){if(k){c[g+0>>2]=c[a+0>>2];c[g+4>>2]=c[a+4>>2];c[g+8>>2]=c[a+8>>2];c[a+0>>2]=c[h+0>>2];c[a+4>>2]=c[h+4>>2];c[a+8>>2]=c[h+8>>2];c[h+0>>2]=c[g+0>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];break}c[g+0>>2]=c[a+0>>2];c[g+4>>2]=c[a+4>>2];c[g+8>>2]=c[a+8>>2];c[a+0>>2]=c[j+0>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[j+0>>2]=c[g+0>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];if(pb[c[d>>2]&3](h,j)|0){c[g+0>>2]=c[j+0>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[j+0>>2]=c[h+0>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];c[h+0>>2]=c[g+0>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2]}}else{if(k){c[g+0>>2]=c[j+0>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[j+0>>2]=c[h+0>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];c[h+0>>2]=c[g+0>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];if(pb[c[d>>2]&3](j,a)|0){c[g+0>>2]=c[a+0>>2];c[g+4>>2]=c[a+4>>2];c[g+8>>2]=c[a+8>>2];c[a+0>>2]=c[j+0>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[j+0>>2]=c[g+0>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2]}}}}while(0);g=a+36|0;if((g|0)==(b|0)){i=f;return}while(1){if(pb[c[d>>2]&3](g,h)|0){c[e+0>>2]=c[g+0>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];j=g;while(1){c[j+0>>2]=c[h+0>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];if((h|0)==(a|0)){break}j=h+ -12|0;if(pb[c[d>>2]&3](e,j)|0){l=h;h=j;j=l}else{break}}c[h+0>>2]=c[e+0>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2]}h=g+12|0;if((h|0)==(b|0)){break}else{l=g;g=h;h=l}}i=f;return}function sc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;i=i+32|0;h=e+12|0;g=e;switch((b-a|0)/12|0|0){case 3:{f=a+12|0;g=b+ -12|0;l=pb[c[d>>2]&3](f,a)|0;b=pb[c[d>>2]&3](g,f)|0;if(!l){if(!b){l=1;i=e;return l|0}c[h+0>>2]=c[f+0>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[f+0>>2]=c[g+0>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[g+0>>2]=c[h+0>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];if(!(pb[c[d>>2]&3](f,a)|0)){l=1;i=e;return l|0}c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[f+0>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[f+0>>2]=c[h+0>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];l=1;i=e;return l|0}if(b){c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[g+0>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[g+0>>2]=c[h+0>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];l=1;i=e;return l|0}c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[f+0>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[f+0>>2]=c[h+0>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];if(!(pb[c[d>>2]&3](g,f)|0)){l=1;i=e;return l|0}c[h+0>>2]=c[f+0>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[f+0>>2]=c[g+0>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[g+0>>2]=c[h+0>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];l=1;i=e;return l|0};case 2:{b=b+ -12|0;if(!(pb[c[d>>2]&3](b,a)|0)){l=1;i=e;return l|0}c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[b+0>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[b+0>>2]=c[h+0>>2];c[b+4>>2]=c[h+4>>2];c[b+8>>2]=c[h+8>>2];l=1;i=e;return l|0};case 5:{g=a+12|0;j=a+24|0;f=a+36|0;b=b+ -12|0;qc(a,g,j,f,d)|0;if(!(pb[c[d>>2]&3](b,f)|0)){l=1;i=e;return l|0}c[h+0>>2]=c[f+0>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[f+0>>2]=c[b+0>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[b+0>>2]=c[h+0>>2];c[b+4>>2]=c[h+4>>2];c[b+8>>2]=c[h+8>>2];if(!(pb[c[d>>2]&3](f,j)|0)){l=1;i=e;return l|0}c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[j+0>>2]=c[f+0>>2];c[j+4>>2]=c[f+4>>2];c[j+8>>2]=c[f+8>>2];c[f+0>>2]=c[h+0>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];if(!(pb[c[d>>2]&3](j,g)|0)){l=1;i=e;return l|0}c[h+0>>2]=c[g+0>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];c[g+0>>2]=c[j+0>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[j+0>>2]=c[h+0>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];if(!(pb[c[d>>2]&3](g,a)|0)){l=1;i=e;return l|0}c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[g+0>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[g+0>>2]=c[h+0>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];l=1;i=e;return l|0};case 4:{qc(a,a+12|0,a+24|0,b+ -12|0,d)|0;l=1;i=e;return l|0};case 1:case 0:{l=1;i=e;return l|0};default:{k=a+24|0;j=a+12|0;m=pb[c[d>>2]&3](j,a)|0;l=pb[c[d>>2]&3](k,j)|0;do{if(m){if(l){c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[k+0>>2];c[a+4>>2]=c[k+4>>2];c[a+8>>2]=c[k+8>>2];c[k+0>>2]=c[h+0>>2];c[k+4>>2]=c[h+4>>2];c[k+8>>2]=c[h+8>>2];break}c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[j+0>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[j+0>>2]=c[h+0>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];if(pb[c[d>>2]&3](k,j)|0){c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[j+0>>2]=c[k+0>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[k+0>>2]=c[h+0>>2];c[k+4>>2]=c[h+4>>2];c[k+8>>2]=c[h+8>>2]}}else{if(l){c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[j+0>>2]=c[k+0>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[k+0>>2]=c[h+0>>2];c[k+4>>2]=c[h+4>>2];c[k+8>>2]=c[h+8>>2];if(pb[c[d>>2]&3](j,a)|0){c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[j+0>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[j+0>>2]=c[h+0>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2]}}}}while(0);h=a+36|0;if((h|0)==(b|0)){m=1;i=e;return m|0}j=0;while(1){if(pb[c[d>>2]&3](h,k)|0){c[g+0>>2]=c[h+0>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];l=h;while(1){c[l+0>>2]=c[k+0>>2];c[l+4>>2]=c[k+4>>2];c[l+8>>2]=c[k+8>>2];if((k|0)==(a|0)){break}l=k+ -12|0;if(pb[c[d>>2]&3](g,l)|0){m=k;k=l;l=m}else{break}}c[k+0>>2]=c[g+0>>2];c[k+4>>2]=c[g+4>>2];c[k+8>>2]=c[g+8>>2];j=j+1|0;if((j|0)==8){break}}k=h+12|0;if((k|0)==(b|0)){d=1;f=35;break}else{m=h;h=k;k=m}}if((f|0)==35){i=e;return d|0}m=(h+12|0)==(b|0);i=e;return m|0}}return 0}function tc(a){a=a|0;Ea(a|0)|0;ua()}function uc(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function vc(a,b){a=a|0;b=b|0;return}function wc(a,b){a=a|0;b=b|0;return}function xc(a,b,c){a=a|0;b=b|0;c=c|0;return}function yc(a,b,c){a=a|0;b=b|0;c=c|0;return}function zc(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function Ac(a){a=a|0;var d=0;d=i;b[a+32>>1]=1;b[a+34>>1]=-1;b[a+36>>1]=0;c[a+40>>2]=0;c[a+24>>2]=0;c[a+28>>2]=0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;i=d;return}function Bc(d,e,f,h){d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0.0;j=i;c[d+40>>2]=c[h+4>>2];g[d+16>>2]=+g[h+8>>2];g[d+20>>2]=+g[h+12>>2];c[d+8>>2]=f;c[d+4>>2]=0;f=d+32|0;k=h+22|0;b[f+0>>1]=b[k+0>>1]|0;b[f+2>>1]=b[k+2>>1]|0;b[f+4>>1]=b[k+4>>1]|0;a[d+38>>0]=a[h+20>>0]|0;f=c[h>>2]|0;f=pb[c[(c[f>>2]|0)+8>>2]&3](f,e)|0;c[d+12>>2]=f;f=kb[c[(c[f>>2]|0)+12>>2]&3](f)|0;k=Xb(e,f*28|0)|0;e=d+24|0;c[e>>2]=k;if((f|0)>0){l=0}else{l=d+28|0;c[l>>2]=0;l=h+16|0;m=+g[l>>2];g[d>>2]=m;i=j;return}do{c[k+(l*28|0)+16>>2]=0;k=c[e>>2]|0;c[k+(l*28|0)+24>>2]=-1;l=l+1|0}while((l|0)!=(f|0));l=d+28|0;c[l>>2]=0;l=h+16|0;m=+g[l>>2];g[d>>2]=m;i=j;return}function Cc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;f=a+28|0;if((c[f>>2]|0)!=0){xa(2088,2112,124,2144)}g=a+12|0;j=c[g>>2]|0;j=kb[c[(c[j>>2]|0)+12>>2]&3](j)|0;c[f>>2]=j;if((j|0)<=0){i=e;return}h=a+24|0;j=0;do{k=c[h>>2]|0;l=k+(j*28|0)|0;m=c[g>>2]|0;rb[c[(c[m>>2]|0)+24>>2]&15](m,l,d,j);c[k+(j*28|0)+24>>2]=Mc(b,l,l)|0;c[k+(j*28|0)+16>>2]=a;c[k+(j*28|0)+20>>2]=j;j=j+1|0}while((j|0)<(c[f>>2]|0));i=e;return}function Dc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0;m=i;i=i+48|0;k=m+24|0;l=m+8|0;h=m;j=a+28|0;if((c[j>>2]|0)<=0){i=m;return}f=a+24|0;u=a+12|0;v=k+4|0;w=l+4|0;p=k+8|0;q=l+8|0;r=k+12|0;s=l+12|0;n=e+4|0;y=d+4|0;o=h+4|0;x=0;do{a=c[f>>2]|0;D=c[u>>2]|0;t=a+(x*28|0)+20|0;rb[c[(c[D>>2]|0)+24>>2]&15](D,k,d,c[t>>2]|0);D=c[u>>2]|0;rb[c[(c[D>>2]|0)+24>>2]&15](D,l,e,c[t>>2]|0);t=a+(x*28|0)|0;B=+g[k>>2];C=+g[l>>2];A=+g[v>>2];z=+g[w>>2];B=+(B<C?B:C);C=+(A<z?A:z);D=t;g[D>>2]=B;g[D+4>>2]=C;B=+g[p>>2];C=+g[q>>2];z=+g[r>>2];A=+g[s>>2];B=+(B>C?B:C);C=+(z>A?z:A);D=a+(x*28|0)+8|0;g[D>>2]=B;g[D+4>>2]=C;C=+g[n>>2]- +g[y>>2];g[h>>2]=+g[e>>2]- +g[d>>2];g[o>>2]=C;Nc(b,c[a+(x*28|0)+24>>2]|0,t,h);x=x+1|0}while((x|0)<(c[j>>2]|0));i=m;return}function Ec(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,j=0;e=i;Vb(b);ed(b+68|0);hc(b+102872|0);j=b+102968|0;c[b+102980>>2]=0;c[b+102984>>2]=0;f=b+102952|0;h=b+102992|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;a[h>>0]=1;a[b+102993>>0]=1;a[b+102994>>0]=0;a[b+102995>>0]=1;a[b+102976>>0]=1;h=d;f=c[h+4>>2]|0;d=j;c[d>>2]=c[h>>2];c[d+4>>2]=f;c[b+102868>>2]=4;g[b+102988>>2]=0.0;c[b+102948>>2]=b;d=b+102996|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;i=e;return}function Fc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((c[a+102868>>2]&2|0)!=0){xa(2160,2184,109,2216)}e=Xb(a,152)|0;if((e|0)==0){e=0}else{$b(e,b,a)}c[e+92>>2]=0;b=a+102952|0;c[e+96>>2]=c[b>>2];f=c[b>>2]|0;if((f|0)!=0){c[f+92>>2]=e}c[b>>2]=e;f=a+102960|0;c[f>>2]=(c[f>>2]|0)+1;i=d;return e|0}function Gc(f,h){f=f|0;h=h|0;var j=0,k=0;j=i;k=f+102976|0;if((h&1|0)==(d[k>>0]|0|0)){i=j;return}a[k>>0]=h&1;if(h){i=j;return}f=c[f+102952>>2]|0;if((f|0)==0){i=j;return}do{k=f+4|0;h=e[k>>1]|0;if((h&2|0)==0){b[k>>1]=h|2;g[f+144>>2]=0.0}f=c[f+96>>2]|0}while((f|0)!=0);i=j;return}function Hc(d,e){d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0.0;j=i;i=i+96|0;k=j+32|0;o=j;h=j+84|0;q=d+103008|0;g[q>>2]=0.0;t=d+103012|0;g[t>>2]=0.0;n=d+103016|0;g[n>>2]=0.0;u=d+102960|0;f=d+102872|0;l=d+68|0;Ld(k,c[u>>2]|0,c[d+102936>>2]|0,c[d+102964>>2]|0,l,c[d+102944>>2]|0);m=d+102952|0;v=c[m>>2]|0;if((v|0)!=0){do{Q=v+4|0;b[Q>>1]=b[Q>>1]&65534;v=c[v+96>>2]|0}while((v|0)!=0)}v=c[d+102932>>2]|0;if((v|0)!=0){do{Q=v+4|0;c[Q>>2]=c[Q>>2]&-2;v=c[v+12>>2]|0}while((v|0)!=0)}v=c[d+102956>>2]|0;if((v|0)!=0){do{a[v+60>>0]=0;v=c[v+12>>2]|0}while((v|0)!=0)}C=c[u>>2]|0;u=gd(l,C<<2)|0;K=c[m>>2]|0;a:do{if((K|0)!=0){w=k+28|0;I=k+36|0;F=k+32|0;v=k+40|0;B=k+8|0;H=k+48|0;G=k+16|0;E=k+44|0;J=k+12|0;D=d+102968|0;A=d+102976|0;z=o+12|0;y=o+16|0;x=o+20|0;b:while(1){L=K+4|0;M=b[L>>1]|0;if((M&35)==34?(c[K>>2]|0)!=0:0){c[w>>2]=0;c[I>>2]=0;c[F>>2]=0;c[u>>2]=K;b[L>>1]=M&65535|1;N=1;do{N=N+ -1|0;L=c[u+(N<<2)>>2]|0;M=L+4|0;O=b[M>>1]|0;if((O&32)==0){n=13;break b}P=c[w>>2]|0;if((P|0)>=(c[v>>2]|0)){n=15;break b}c[L+8>>2]=P;Q=c[w>>2]|0;c[(c[B>>2]|0)+(Q<<2)>>2]=L;c[w>>2]=Q+1;O=O&65535;if((O&2|0)==0){b[M>>1]=O|2;g[L+144>>2]=0.0}if((c[L>>2]|0)!=0){M=c[L+112>>2]|0;if((M|0)!=0){do{Q=c[M+4>>2]|0;O=Q+4|0;if(((c[O>>2]&7|0)==6?(a[(c[Q+48>>2]|0)+38>>0]|0)==0:0)?(a[(c[Q+52>>2]|0)+38>>0]|0)==0:0){P=c[I>>2]|0;if((P|0)>=(c[E>>2]|0)){n=25;break b}c[I>>2]=P+1;c[(c[J>>2]|0)+(P<<2)>>2]=Q;c[O>>2]=c[O>>2]|1;Q=c[M>>2]|0;O=Q+4|0;P=b[O>>1]|0;if((P&1)==0){if((N|0)>=(C|0)){n=28;break b}c[u+(N<<2)>>2]=Q;b[O>>1]=P&65535|1;N=N+1|0}}M=c[M+12>>2]|0}while((M|0)!=0)}L=c[L+108>>2]|0;if((L|0)!=0){do{P=L+4|0;O=c[P>>2]|0;if((a[O+60>>0]|0)==0?(p=c[L>>2]|0,s=p+4|0,r=b[s>>1]|0,!((r&32)==0)):0){M=c[F>>2]|0;if((M|0)>=(c[H>>2]|0)){n=35;break b}c[F>>2]=M+1;c[(c[G>>2]|0)+(M<<2)>>2]=O;a[(c[P>>2]|0)+60>>0]=1;if((r&1)==0){if((N|0)>=(C|0)){n=38;break b}c[u+(N<<2)>>2]=p;b[s>>1]=r&65535|1;N=N+1|0}}L=c[L+12>>2]|0}while((L|0)!=0)}}}while((N|0)>0);Nd(k,o,e,D,(a[A>>0]|0)!=0);g[q>>2]=+g[z>>2]+ +g[q>>2];g[t>>2]=+g[y>>2]+ +g[t>>2];g[n>>2]=+g[x>>2]+ +g[n>>2];N=c[w>>2]|0;if((N|0)>0){L=c[B>>2]|0;O=0;do{M=c[L+(O<<2)>>2]|0;if((c[M>>2]|0)==0){Q=M+4|0;b[Q>>1]=b[Q>>1]&65534}O=O+1|0}while((O|0)<(N|0))}}K=c[K+96>>2]|0;if((K|0)==0){break a}}if((n|0)==13){xa(2232,2184,445,2256)}else if((n|0)==15){xa(2520,2440,54,2472)}else if((n|0)==25){xa(2480,2440,62,2472)}else if((n|0)==28){xa(2264,2184,495,2256)}else if((n|0)==35){xa(2408,2440,68,2472)}else if((n|0)==38){xa(2264,2184,524,2256)}}}while(0);hd(l,u);id(h);l=c[m>>2]|0;if((l|0)==0){kc(f);R=+kd(h);Q=d+103020|0;g[Q>>2]=R;Md(k);i=j;return}do{if(!((b[l+4>>1]&1)==0)?(c[l>>2]|0)!=0:0){bc(l)}l=c[l+96>>2]|0}while((l|0)!=0);kc(f);R=+kd(h);Q=d+103020|0;g[Q>>2]=R;Md(k);i=j;return}function Ic(d,f){d=d|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,S=0,T=0,U=0,V=0,W=0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0.0,va=0.0,wa=0.0,ya=0.0,za=0.0,Aa=0.0;h=i;i=i+336|0;k=h+284|0;n=h+152|0;m=h+144|0;l=h+108|0;p=h+72|0;o=h+64|0;u=h+24|0;q=h;r=d+102872|0;t=d+102944|0;Ld(k,64,32,0,d+68|0,c[t>>2]|0);j=d+102995|0;if((a[j>>0]|0)!=0){v=c[d+102952>>2]|0;if((v|0)!=0){do{ta=v+4|0;b[ta>>1]=b[ta>>1]&65534;g[v+60>>2]=0.0;v=c[v+96>>2]|0}while((v|0)!=0)}v=d+102932|0;w=c[v>>2]|0;if((w|0)!=0){do{ta=w+4|0;c[ta>>2]=c[ta>>2]&-34;c[w+128>>2]=0;g[w+132>>2]=1.0;w=c[w+12>>2]|0}while((w|0)!=0)}}else{v=d+102932|0}F=k+28|0;G=k+36|0;H=k+32|0;I=k+40|0;J=k+8|0;E=k+44|0;D=k+12|0;C=o+4|0;B=q+4|0;A=q+8|0;z=q+16|0;y=f+12|0;x=q+12|0;w=q+20|0;U=d+102994|0;S=n+16|0;P=n+20|0;O=n+24|0;N=n+44|0;M=n+48|0;L=n+52|0;W=n+28|0;K=n+56|0;V=n+92|0;d=n+128|0;T=m+4|0;a:while(1){aa=c[v>>2]|0;if((aa|0)==0){l=36;break}else{X=1.0;Z=0}do{ba=aa+4|0;Y=c[ba>>2]|0;do{if((Y&4|0)!=0?(c[aa+128>>2]|0)<=8:0){if((Y&32|0)==0){Y=c[aa+48>>2]|0;_=c[aa+52>>2]|0;if((a[Y+38>>0]|0)!=0){break}if((a[_+38>>0]|0)!=0){break}$=c[Y+8>>2]|0;da=c[_+8>>2]|0;ga=c[$>>2]|0;fa=c[da>>2]|0;if(!((ga|0)==2|(fa|0)==2)){l=16;break a}ea=b[$+4>>1]|0;ca=b[da+4>>1]|0;if(!((ea&2)!=0&(ga|0)!=0|(ca&2)!=0&(fa|0)!=0)){break}if(!((ea&8)!=0|(ga|0)!=2|((ca&8)!=0|(fa|0)!=2))){break}ea=$+28|0;fa=$+60|0;va=+g[fa>>2];ca=da+28|0;ga=da+60|0;ua=+g[ga>>2];if(!(va<ua)){if(ua<va){if(!(ua<1.0)){l=25;break a}ua=(va-ua)/(1.0-ua);ta=da+36|0;wa=1.0-ua;za=+(+g[ta>>2]*wa+ua*+g[da+44>>2]);ya=+(wa*+g[da+40>>2]+ua*+g[da+48>>2]);g[ta>>2]=za;g[ta+4>>2]=ya;ta=da+52|0;g[ta>>2]=wa*+g[ta>>2]+ua*+g[da+56>>2];g[ga>>2]=va;ua=va}else{ua=va}}else{if(!(va<1.0)){l=21;break a}za=(ua-va)/(1.0-va);ta=$+36|0;ya=1.0-za;va=+(+g[ta>>2]*ya+za*+g[$+44>>2]);wa=+(ya*+g[$+40>>2]+za*+g[$+48>>2]);g[ta>>2]=va;g[ta+4>>2]=wa;ta=$+52|0;g[ta>>2]=ya*+g[ta>>2]+za*+g[$+56>>2];g[fa>>2]=ua}if(!(ua<1.0)){l=28;break a}ta=c[aa+56>>2]|0;$=c[aa+60>>2]|0;c[S>>2]=0;c[P>>2]=0;g[O>>2]=0.0;c[N>>2]=0;c[M>>2]=0;g[L>>2]=0.0;Pc(n,c[Y+12>>2]|0,ta);Pc(W,c[_+12>>2]|0,$);Y=K+0|0;_=ea+0|0;$=Y+36|0;do{c[Y>>2]=c[_>>2];Y=Y+4|0;_=_+4|0}while((Y|0)<($|0));Y=V+0|0;_=ca+0|0;$=Y+36|0;do{c[Y>>2]=c[_>>2];Y=Y+4|0;_=_+4|0}while((Y|0)<($|0));g[d>>2]=1.0;ad(m,n);if((c[m>>2]|0)==3){ua=ua+(1.0-ua)*+g[T>>2];ua=ua<1.0?ua:1.0}else{ua=1.0}g[aa+132>>2]=ua;c[ba>>2]=c[ba>>2]|32}else{ua=+g[aa+132>>2]}if(ua<X){X=ua;Z=aa}}}while(0);aa=c[aa+12>>2]|0}while((aa|0)!=0);if((Z|0)==0|X>.9999988079071045){l=36;break}aa=c[(c[Z+48>>2]|0)+8>>2]|0;ba=c[(c[Z+52>>2]|0)+8>>2]|0;ca=aa+28|0;Y=l+0|0;_=ca+0|0;$=Y+36|0;do{c[Y>>2]=c[_>>2];Y=Y+4|0;_=_+4|0}while((Y|0)<($|0));da=ba+28|0;Y=p+0|0;_=da+0|0;$=Y+36|0;do{c[Y>>2]=c[_>>2];Y=Y+4|0;_=_+4|0}while((Y|0)<($|0));Y=aa+60|0;ua=+g[Y>>2];if(!(ua<1.0)){l=38;break}ya=(X-ua)/(1.0-ua);ka=aa+36|0;ua=1.0-ya;fa=aa+44|0;ga=aa+48|0;za=+g[ka>>2]*ua+ya*+g[fa>>2];Aa=ua*+g[aa+40>>2]+ya*+g[ga>>2];wa=+za;va=+Aa;g[ka>>2]=wa;g[ka+4>>2]=va;ka=aa+52|0;ea=aa+56|0;ya=ua*+g[ka>>2]+ya*+g[ea>>2];g[ka>>2]=ya;g[Y>>2]=X;ka=aa+44|0;g[ka>>2]=wa;g[ka+4>>2]=va;g[ea>>2]=ya;va=+R(+ya);ka=aa+20|0;g[ka>>2]=va;ya=+Q(+ya);ja=aa+24|0;g[ja>>2]=ya;la=aa+12|0;ia=aa+28|0;wa=+g[ia>>2];ha=aa+32|0;ua=+g[ha>>2];za=+(za-(ya*wa-va*ua));ua=+(Aa-(va*wa+ya*ua));Y=la;g[Y>>2]=za;g[Y+4>>2]=ua;Y=ba+60|0;ua=+g[Y>>2];if(!(ua<1.0)){l=40;break}ya=(X-ua)/(1.0-ua);ra=ba+36|0;Aa=1.0-ya;oa=ba+44|0;na=ba+48|0;za=+g[ra>>2]*Aa+ya*+g[oa>>2];ua=Aa*+g[ba+40>>2]+ya*+g[na>>2];wa=+za;va=+ua;g[ra>>2]=wa;g[ra+4>>2]=va;ra=ba+52|0;ma=ba+56|0;ya=Aa*+g[ra>>2]+ya*+g[ma>>2];g[ra>>2]=ya;g[Y>>2]=X;ra=ba+44|0;g[ra>>2]=wa;g[ra+4>>2]=va;g[ma>>2]=ya;va=+R(+ya);ra=ba+20|0;g[ra>>2]=va;ya=+Q(+ya);qa=ba+24|0;g[qa>>2]=ya;sa=ba+12|0;pa=ba+28|0;wa=+g[pa>>2];ta=ba+32|0;Aa=+g[ta>>2];za=+(za-(ya*wa-va*Aa));Aa=+(ua-(va*wa+ya*Aa));Y=sa;g[Y>>2]=za;g[Y+4>>2]=Aa;od(Z,c[t>>2]|0);Y=Z+4|0;_=c[Y>>2]|0;c[Y>>2]=_&-33;$=Z+128|0;c[$>>2]=(c[$>>2]|0)+1;if((_&6|0)!=6){c[Y>>2]=_&-37;Y=ca+0|0;_=l+0|0;$=Y+36|0;do{c[Y>>2]=c[_>>2];Y=Y+4|0;_=_+4|0}while((Y|0)<($|0));Y=da+0|0;_=p+0|0;$=Y+36|0;do{c[Y>>2]=c[_>>2];Y=Y+4|0;_=_+4|0}while((Y|0)<($|0));wa=+g[ea>>2];za=+R(+wa);g[ka>>2]=za;wa=+Q(+wa);g[ja>>2]=wa;Aa=+g[ia>>2];ya=+g[ha>>2];va=+(+g[fa>>2]-(wa*Aa-za*ya));ya=+(+g[ga>>2]-(za*Aa+wa*ya));g[la>>2]=va;g[la+4>>2]=ya;ya=+g[ma>>2];va=+R(+ya);g[ra>>2]=va;ya=+Q(+ya);g[qa>>2]=ya;wa=+g[pa>>2];Aa=+g[ta>>2];za=+(+g[oa>>2]-(ya*wa-va*Aa));Aa=+(+g[na>>2]-(va*wa+ya*Aa));ta=sa;g[ta>>2]=za;g[ta+4>>2]=Aa;continue}_=aa+4|0;$=e[_>>1]|0;if(($&2|0)==0){b[_>>1]=$|2;g[aa+144>>2]=0.0}$=ba+4|0;ca=e[$>>1]|0;if((ca&2|0)==0){b[$>>1]=ca|2;g[ba+144>>2]=0.0}c[F>>2]=0;c[G>>2]=0;c[H>>2]=0;if((c[I>>2]|0)<=0){l=48;break}ca=aa+8|0;c[ca>>2]=0;ea=c[F>>2]|0;c[(c[J>>2]|0)+(ea<<2)>>2]=aa;ea=ea+1|0;c[F>>2]=ea;if((ea|0)>=(c[I>>2]|0)){l=50;break}da=ba+8|0;c[da>>2]=ea;ea=c[F>>2]|0;c[(c[J>>2]|0)+(ea<<2)>>2]=ba;c[F>>2]=ea+1;ea=c[G>>2]|0;if((ea|0)>=(c[E>>2]|0)){l=52;break}c[G>>2]=ea+1;c[(c[D>>2]|0)+(ea<<2)>>2]=Z;b[_>>1]=e[_>>1]|1;b[$>>1]=e[$>>1]|1;c[Y>>2]=c[Y>>2]|1;c[o>>2]=aa;c[C>>2]=ba;Z=1;while(1){b:do{if((c[aa>>2]|0)==2?(s=c[aa+112>>2]|0,(s|0)!=0):0){aa=aa+4|0;ea=s;do{if((c[F>>2]|0)==(c[I>>2]|0)){break b}if((c[G>>2]|0)==(c[E>>2]|0)){break b}fa=c[ea+4>>2]|0;ga=fa+4|0;do{if((c[ga>>2]&1|0)==0){ba=c[ea>>2]|0;if(((c[ba>>2]|0)==2?(b[aa>>1]&8)==0:0)?(b[ba+4>>1]&8)==0:0){break}if((a[(c[fa+48>>2]|0)+38>>0]|0)==0?(a[(c[fa+52>>2]|0)+38>>0]|0)==0:0){ha=ba+28|0;Y=u+0|0;_=ha+0|0;$=Y+36|0;do{c[Y>>2]=c[_>>2];Y=Y+4|0;_=_+4|0}while((Y|0)<($|0));Y=ba+4|0;if((b[Y>>1]&1)==0){_=ba+60|0;ua=+g[_>>2];if(!(ua<1.0)){l=67;break a}ya=(X-ua)/(1.0-ua);sa=ba+36|0;Aa=1.0-ya;za=+g[sa>>2]*Aa+ya*+g[ba+44>>2];ua=Aa*+g[ba+40>>2]+ya*+g[ba+48>>2];wa=+za;va=+ua;g[sa>>2]=wa;g[sa+4>>2]=va;sa=ba+52|0;ta=ba+56|0;ya=Aa*+g[sa>>2]+ya*+g[ta>>2];g[sa>>2]=ya;g[_>>2]=X;sa=ba+44|0;g[sa>>2]=wa;g[sa+4>>2]=va;g[ta>>2]=ya;va=+R(+ya);g[ba+20>>2]=va;ya=+Q(+ya);g[ba+24>>2]=ya;wa=+g[ba+28>>2];Aa=+g[ba+32>>2];za=+(za-(ya*wa-va*Aa));Aa=+(ua-(va*wa+ya*Aa));ta=ba+12|0;g[ta>>2]=za;g[ta+4>>2]=Aa}od(fa,c[t>>2]|0);_=c[ga>>2]|0;if((_&4|0)==0){Y=ha+0|0;_=u+0|0;$=Y+36|0;do{c[Y>>2]=c[_>>2];Y=Y+4|0;_=_+4|0}while((Y|0)<($|0));ya=+g[ba+56>>2];va=+R(+ya);g[ba+20>>2]=va;ya=+Q(+ya);g[ba+24>>2]=ya;wa=+g[ba+28>>2];Aa=+g[ba+32>>2];za=+(+g[ba+44>>2]-(ya*wa-va*Aa));Aa=+(+g[ba+48>>2]-(va*wa+ya*Aa));ta=ba+12|0;g[ta>>2]=za;g[ta+4>>2]=Aa;break}if((_&2|0)==0){Y=ha+0|0;_=u+0|0;$=Y+36|0;do{c[Y>>2]=c[_>>2];Y=Y+4|0;_=_+4|0}while((Y|0)<($|0));ya=+g[ba+56>>2];va=+R(+ya);g[ba+20>>2]=va;ya=+Q(+ya);g[ba+24>>2]=ya;wa=+g[ba+28>>2];Aa=+g[ba+32>>2];za=+(+g[ba+44>>2]-(ya*wa-va*Aa));Aa=+(+g[ba+48>>2]-(va*wa+ya*Aa));ta=ba+12|0;g[ta>>2]=za;g[ta+4>>2]=Aa;break}c[ga>>2]=_|1;_=c[G>>2]|0;if((_|0)>=(c[E>>2]|0)){l=74;break a}c[G>>2]=_+1;c[(c[D>>2]|0)+(_<<2)>>2]=fa;_=e[Y>>1]|0;if((_&1|0)==0){b[Y>>1]=_|1;if((c[ba>>2]|0)!=0?(_&2|0)==0:0){b[Y>>1]=_|3;g[ba+144>>2]=0.0}Y=c[F>>2]|0;if((Y|0)>=(c[I>>2]|0)){l=80;break a}c[ba+8>>2]=Y;ta=c[F>>2]|0;c[(c[J>>2]|0)+(ta<<2)>>2]=ba;c[F>>2]=ta+1}}}}while(0);ea=c[ea+12>>2]|0}while((ea|0)!=0)}}while(0);if((Z|0)>=2){break}aa=c[o+(Z<<2)>>2]|0;Z=Z+1|0}Aa=(1.0-X)*+g[f>>2];g[q>>2]=Aa;g[B>>2]=1.0/Aa;g[A>>2]=1.0;c[z>>2]=20;c[x>>2]=c[y>>2];a[w>>0]=0;Od(k,q,c[ca>>2]|0,c[da>>2]|0);Z=c[F>>2]|0;if((Z|0)>0){Y=0;do{_=c[(c[J>>2]|0)+(Y<<2)>>2]|0;ta=_+4|0;b[ta>>1]=b[ta>>1]&65534;if((c[_>>2]|0)==2){bc(_);Z=c[_+112>>2]|0;if((Z|0)!=0){do{ta=(c[Z+4>>2]|0)+4|0;c[ta>>2]=c[ta>>2]&-34;Z=c[Z+12>>2]|0}while((Z|0)!=0)}Z=c[F>>2]|0}Y=Y+1|0}while((Y|0)<(Z|0))}kc(r);if((a[U>>0]|0)!=0){l=92;break}}switch(l|0){case 16:{xa(2288,2184,641,2344);break};case 21:{xa(2360,2376,723,2400);break};case 25:{xa(2360,2376,723,2400);break};case 28:{xa(2360,2184,676,2344);break};case 36:{a[j>>0]=1;Md(k);i=h;return};case 38:{xa(2360,2376,723,2400);break};case 40:{xa(2360,2376,723,2400);break};case 48:{xa(2520,2440,54,2472);break};case 50:{xa(2520,2440,54,2472);break};case 52:{xa(2480,2440,62,2472);break};case 67:{xa(2360,2376,723,2400);break};case 74:{xa(2480,2440,62,2472);break};case 80:{xa(2520,2440,54,2472);break};case 92:{a[j>>0]=0;Md(k);i=h;return}}}function Jc(b,d,e,f){b=b|0;d=+d;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;k=i;i=i+32|0;j=k+27|0;l=k;o=k+26|0;p=k+25|0;n=k+24|0;id(j);h=b+102868|0;q=c[h>>2]|0;if((q&1|0)!=0){kc(b+102872|0);q=c[h>>2]&-2;c[h>>2]=q}c[h>>2]=q|2;g[l>>2]=d;c[l+12>>2]=e;c[l+16>>2]=f;if(d>0.0){g[l+4>>2]=1.0/d}else{g[l+4>>2]=0.0}e=b+102988|0;g[l+8>>2]=+g[e>>2]*d;a[l+20>>0]=a[b+102992>>0]|0;id(o);jc(b+102872|0);g[b+103e3>>2]=+kd(o);if((a[b+102995>>0]|0)!=0?+g[l>>2]>0.0:0){id(p);Hc(b,l);g[b+103004>>2]=+kd(p)}if((a[b+102993>>0]|0)!=0){d=+g[l>>2];if(d>0.0){id(n);Ic(b,l);g[b+103024>>2]=+kd(n);m=12}}else{m=12}if((m|0)==12){d=+g[l>>2]}if(d>0.0){g[e>>2]=+g[l+4>>2]}l=c[h>>2]|0;if((l&4|0)==0){q=l&-3;c[h>>2]=q;d=+kd(j);q=b+102996|0;g[q>>2]=d;i=k;return}m=c[b+102952>>2]|0;if((m|0)==0){q=l&-3;c[h>>2]=q;d=+kd(j);q=b+102996|0;g[q>>2]=d;i=k;return}do{g[m+76>>2]=0.0;g[m+80>>2]=0.0;g[m+84>>2]=0.0;m=c[m+96>>2]|0}while((m|0)!=0);q=l&-3;c[h>>2]=q;d=+kd(j);q=b+102996|0;g[q>>2]=d;i=k;return}function Kc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;a=i;e=b[c+36>>1]|0;if(!(e<<16>>16!=(b[d+36>>1]|0)|e<<16>>16==0)){e=e<<16>>16>0;i=a;return e|0}if((b[d+32>>1]&b[c+34>>1])<<16>>16==0){e=0;i=a;return e|0}e=(b[d+34>>1]&b[c+32>>1])<<16>>16!=0;i=a;return e|0}function Lc(a){a=a|0;var b=0;b=i;Uc(a);c[a+28>>2]=0;c[a+48>>2]=16;c[a+52>>2]=0;c[a+44>>2]=Zb(192)|0;c[a+36>>2]=16;c[a+40>>2]=0;c[a+32>>2]=Zb(64)|0;i=b;return}function Mc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;d=Xc(a,b,d)|0;b=a+28|0;c[b>>2]=(c[b>>2]|0)+1;b=a+40|0;f=c[b>>2]|0;g=a+36|0;a=a+32|0;if((f|0)==(c[g>>2]|0)){h=c[a>>2]|0;c[g>>2]=f<<1;f=Zb(f<<3)|0;c[a>>2]=f;Xe(f|0,h|0,c[b>>2]<<2|0)|0;_b(h);f=c[b>>2]|0}c[(c[a>>2]|0)+(f<<2)>>2]=d;c[b>>2]=(c[b>>2]|0)+1;i=e;return d|0}function Nc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;if(!(_c(a,b,d,e)|0)){i=f;return}e=a+40|0;d=c[e>>2]|0;g=a+36|0;a=a+32|0;if((d|0)==(c[g>>2]|0)){h=c[a>>2]|0;c[g>>2]=d<<1;d=Zb(d<<3)|0;c[a>>2]=d;Xe(d|0,h|0,c[e>>2]<<2|0)|0;_b(h);d=c[e>>2]|0}c[(c[a>>2]|0)+(d<<2)>>2]=b;c[e>>2]=(c[e>>2]|0)+1;i=f;return}function Oc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;f=a+56|0;h=c[f>>2]|0;if((h|0)==(b|0)){i=d;return 1}e=a+52|0;g=c[e>>2]|0;j=a+48|0;a=a+44|0;if((g|0)==(c[j>>2]|0)){h=c[a>>2]|0;c[j>>2]=g<<1;g=Zb(g*24|0)|0;c[a>>2]=g;Xe(g|0,h|0,(c[e>>2]|0)*12|0)|0;_b(h);h=c[f>>2]|0;g=c[e>>2]|0}a=c[a>>2]|0;c[a+(g*12|0)>>2]=(h|0)>(b|0)?b:h;f=c[f>>2]|0;c[a+((c[e>>2]|0)*12|0)+4>>2]=(f|0)<(b|0)?b:f;c[e>>2]=(c[e>>2]|0)+1;i=d;return 1}function Pc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0;e=i;f=c[b+4>>2]|0;if((f|0)==2){c[a+16>>2]=b+20;c[a+20>>2]=c[b+148>>2];g[a+24>>2]=+g[b+8>>2];i=e;return}else if((f|0)==3){if(!((d|0)>-1)){xa(2632,2672,53,2704)}f=b+16|0;if((c[f>>2]|0)<=(d|0)){xa(2632,2672,53,2704)}j=b+12|0;l=(c[j>>2]|0)+(d<<3)|0;k=c[l+4>>2]|0;h=a;c[h>>2]=c[l>>2];c[h+4>>2]=k;h=d+1|0;d=a+8|0;j=c[j>>2]|0;if((h|0)<(c[f>>2]|0)){j=j+(h<<3)|0;k=c[j+4>>2]|0;l=d;c[l>>2]=c[j>>2];c[l+4>>2]=k}else{k=c[j+4>>2]|0;l=d;c[l>>2]=c[j>>2];c[l+4>>2]=k}c[a+16>>2]=a;c[a+20>>2]=2;g[a+24>>2]=+g[b+8>>2];i=e;return}else if((f|0)==1){c[a+16>>2]=b+12;c[a+20>>2]=2;g[a+24>>2]=+g[b+8>>2];i=e;return}else if((f|0)==0){c[a+16>>2]=b+12;c[a+20>>2]=1;g[a+24>>2]=+g[b+8>>2];i=e;return}else{xa(2712,2672,81,2704)}}function Qc(a){a=a|0;var b=0,d=0,e=0,f=0.0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0;b=i;d=a+16|0;t=+g[d>>2];r=+g[d+4>>2];d=a+36|0;e=a+52|0;q=+g[e>>2];s=+g[e+4>>2];e=a+72|0;y=a+88|0;u=+g[y>>2];n=+g[y+4>>2];w=q-t;m=s-r;l=t*w+r*m;k=q*w+s*m;f=u-t;v=n-r;j=t*f+r*v;h=u*f+n*v;x=u-q;o=n-s;p=q*x+s*o;o=u*x+n*o;f=w*v-m*f;m=(q*n-s*u)*f;n=(r*u-t*n)*f;f=(t*s-r*q)*f;if(!(!(l>=-0.0)|!(j>=-0.0))){g[a+24>>2]=1.0;c[a+108>>2]=1;i=b;return}if(!(!(l<-0.0)|!(k>0.0)|!(f<=0.0))){x=1.0/(k-l);g[a+24>>2]=k*x;g[a+60>>2]=-(l*x);c[a+108>>2]=2;i=b;return}if(!(!(j<-0.0)|!(h>0.0)|!(n<=0.0))){x=1.0/(h-j);g[a+24>>2]=h*x;g[a+96>>2]=-(j*x);c[a+108>>2]=2;a=d+0|0;e=e+0|0;d=a+36|0;do{c[a>>2]=c[e>>2];a=a+4|0;e=e+4|0}while((a|0)<(d|0));i=b;return}if(!(!(k<=0.0)|!(p>=-0.0))){g[a+60>>2]=1.0;c[a+108>>2]=1;a=a+0|0;e=d+0|0;d=a+36|0;do{c[a>>2]=c[e>>2];a=a+4|0;e=e+4|0}while((a|0)<(d|0));i=b;return}if(!(!(h<=0.0)|!(o<=0.0))){g[a+96>>2]=1.0;c[a+108>>2]=1;a=a+0|0;e=e+0|0;d=a+36|0;do{c[a>>2]=c[e>>2];a=a+4|0;e=e+4|0}while((a|0)<(d|0));i=b;return}if(!(p<-0.0)|!(o>0.0)|!(m<=0.0)){x=1.0/(f+(m+n));g[a+24>>2]=m*x;g[a+60>>2]=n*x;g[a+96>>2]=f*x;c[a+108>>2]=3;i=b;return}else{x=1.0/(o-p);g[a+60>>2]=o*x;g[a+96>>2]=-(p*x);c[a+108>>2]=2;a=a+0|0;e=e+0|0;d=a+36|0;do{c[a>>2]=c[e>>2];a=a+4|0;e=e+4|0}while((a|0)<(d|0));i=b;return}}function Rc(d,e,f){d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0,C=0.0,D=0.0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,P=0.0,Q=0.0,R=0.0,S=0,T=0,U=0,V=0.0,W=0,X=0,Y=0.0,Z=0.0;h=i;i=i+176|0;p=h+152|0;o=h+136|0;j=h+24|0;s=h+12|0;t=h;c[652]=(c[652]|0)+1;n=f+28|0;J=f+56|0;c[p+0>>2]=c[J+0>>2];c[p+4>>2]=c[J+4>>2];c[p+8>>2]=c[J+8>>2];c[p+12>>2]=c[J+12>>2];J=f+72|0;c[o+0>>2]=c[J+0>>2];c[o+4>>2]=c[J+4>>2];c[o+8>>2]=c[J+8>>2];c[o+12>>2]=c[J+12>>2];Sc(j,e,f,p,n,o);n=j+108|0;J=c[n>>2]|0;if((J|0)==3|(J|0)==2|(J|0)==1){m=j+16|0;k=j+20|0;v=+g[p+12>>2];w=+g[p+8>>2];r=f+16|0;q=f+20|0;u=+g[p>>2];z=+g[p+4>>2];x=+g[o+12>>2];A=+g[o+8>>2];B=f+44|0;y=f+48|0;C=+g[o>>2];D=+g[o+4>>2];p=j+52|0;o=j+56|0;I=j+16|0;F=j+36|0;E=j+52|0;H=j+24|0;G=j+60|0;L=0;a:while(1){K=(J|0)>0;if(K){M=0;do{c[s+(M<<2)>>2]=c[j+(M*36|0)+28>>2];c[t+(M<<2)>>2]=c[j+(M*36|0)+32>>2];M=M+1|0}while((M|0)!=(J|0))}do{if((J|0)==2){X=I;Z=+g[X>>2];P=+g[X+4>>2];X=E;V=+g[X>>2];R=+g[X+4>>2];Y=V-Z;Q=R-P;P=Z*Y+P*Q;if(P>=-0.0){g[H>>2]=1.0;c[n>>2]=1;N=17;break}Q=V*Y+R*Q;if(!(Q<=0.0)){Z=1.0/(Q-P);g[H>>2]=Q*Z;g[G>>2]=-(P*Z);c[n>>2]=2;N=18;break}else{g[G>>2]=1.0;c[n>>2]=1;M=j+0|0;N=F+0|0;S=M+36|0;do{c[M>>2]=c[N>>2];M=M+4|0;N=N+4|0}while((M|0)<(S|0));N=17;break}}else if((J|0)==3){Qc(j);M=c[n>>2]|0;if((M|0)==0){N=15;break a}else if((M|0)==2){N=18}else if((M|0)==3){N=42;break a}else if((M|0)==1){N=17}else{N=16;break a}}else if((J|0)==1){N=17}else{N=13;break a}}while(0);do{if((N|0)==17){M=1;P=-+g[m>>2];Q=-+g[k>>2]}else if((N|0)==18){Y=+g[m>>2];Q=+g[p>>2]-Y;Z=+g[k>>2];P=+g[o>>2]-Z;if(Y*P-Q*Z>0.0){M=2;P=-P;break}else{M=2;Q=-Q;break}}}while(0);if(Q*Q+P*P<1.4210854715202004e-14){N=42;break}S=j+(M*36|0)|0;Z=-P;Y=-Q;R=v*Z+w*Y;Z=v*Y-w*Z;U=c[r>>2]|0;T=c[q>>2]|0;if((T|0)>1){W=0;Y=Z*+g[U+4>>2]+R*+g[U>>2];X=1;while(1){V=R*+g[U+(X<<3)>>2]+Z*+g[U+(X<<3)+4>>2];N=V>Y;W=N?X:W;X=X+1|0;if((X|0)==(T|0)){break}else{Y=N?V:Y}}N=j+(M*36|0)+28|0;c[N>>2]=W;if(!((W|0)>-1)){N=28;break}}else{N=j+(M*36|0)+28|0;c[N>>2]=0;W=0}if((T|0)<=(W|0)){N=28;break}Y=+g[U+(W<<3)>>2];V=+g[U+(W<<3)+4>>2];R=u+(v*Y-w*V);Z=+R;V=+(Y*w+v*V+z);g[S>>2]=Z;g[S+4>>2]=V;V=P*x+Q*A;P=Q*x-P*A;S=c[B>>2]|0;T=c[y>>2]|0;if((T|0)>1){U=0;Q=P*+g[S+4>>2]+V*+g[S>>2];W=1;while(1){Y=V*+g[S+(W<<3)>>2]+P*+g[S+(W<<3)+4>>2];X=Y>Q;U=X?W:U;W=W+1|0;if((W|0)==(T|0)){break}else{Q=X?Y:Q}}W=j+(M*36|0)+32|0;c[W>>2]=U;if(!((U|0)>-1)){N=35;break}}else{W=j+(M*36|0)+32|0;c[W>>2]=0;U=0}if((T|0)<=(U|0)){N=35;break}Q=+g[S+(U<<3)>>2];Z=+g[S+(U<<3)+4>>2];Y=C+(x*Q-A*Z);V=+Y;Z=+(Q*A+x*Z+D);X=j+(M*36|0)+8|0;g[X>>2]=V;g[X+4>>2]=Z;Y=+(Y-R);Z=+(+g[j+(M*36|0)+12>>2]- +g[j+(M*36|0)+4>>2]);X=j+(M*36|0)+16|0;g[X>>2]=Y;g[X+4>>2]=Z;L=L+1|0;c[654]=(c[654]|0)+1;if(K){M=c[N>>2]|0;K=0;do{if((M|0)==(c[s+(K<<2)>>2]|0)?(c[W>>2]|0)==(c[t+(K<<2)>>2]|0):0){N=42;break a}K=K+1|0}while((K|0)<(J|0))}J=(c[n>>2]|0)+1|0;c[n>>2]=J;if((L|0)>=20){N=42;break}}if((N|0)==13){xa(2712,2672,498,2720)}else if((N|0)==15){xa(2712,2672,194,2856)}else if((N|0)==16){xa(2712,2672,207,2856)}else if((N|0)==28){xa(2776,2808,103,2840)}else if((N|0)==35){xa(2776,2808,103,2840)}else if((N|0)==42){q=c[656]|0;c[656]=(q|0)>(L|0)?q:L;r=d+8|0;Tc(j,d,r);Y=+g[d>>2]- +g[r>>2];q=d+4|0;s=d+12|0;Z=+g[q>>2]- +g[s>>2];t=d+16|0;g[t>>2]=+O(+(Y*Y+Z*Z));c[d+20>>2]=L;n=c[n>>2]|0;if((n|0)==0){xa(2712,2672,246,2736)}else if((n|0)==2){Z=+g[m>>2]- +g[p>>2];l=+g[k>>2]- +g[o>>2];l=+O(+(Z*Z+l*l))}else if((n|0)==1){l=0.0}else if((n|0)==3){l=+g[m>>2];Z=+g[k>>2];l=(+g[p>>2]-l)*(+g[j+92>>2]-Z)-(+g[o>>2]-Z)*(+g[j+88>>2]-l)}else{xa(2712,2672,259,2736)}g[e>>2]=l;b[e+4>>1]=n;k=0;do{a[e+k+6>>0]=c[j+(k*36|0)+28>>2];a[e+k+9>>0]=c[j+(k*36|0)+32>>2];k=k+1|0}while((k|0)<(n|0));if((a[f+88>>0]|0)==0){i=h;return}l=+g[f+24>>2];u=+g[f+52>>2];v=+g[t>>2];w=l+u;if(!(v>w&v>1.1920928955078125e-7)){Y=+((+g[d>>2]+ +g[r>>2])*.5);Z=+((+g[q>>2]+ +g[s>>2])*.5);X=d;g[X>>2]=Y;g[X+4>>2]=Z;X=r;g[X>>2]=Y;g[X+4>>2]=Z;g[t>>2]=0.0;i=h;return}g[t>>2]=v-w;w=+g[r>>2];z=+g[d>>2];D=w-z;v=+g[s>>2];x=+g[q>>2];A=v-x;C=+O(+(D*D+A*A));if(C<1.1920928955078125e-7){C=D}else{Z=1.0/C;C=D*Z;A=A*Z}g[d>>2]=l*C+z;g[q>>2]=l*A+x;g[r>>2]=w-u*C;g[s>>2]=v-u*A;i=h;return}}else if((J|0)==0){xa(2712,2672,194,2856)}else{xa(2712,2672,207,2856)}}function Sc(a,e,f,h,j,k){a=a|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;l=i;r=b[e+4>>1]|0;if(!((r&65535)<4)){xa(2872,2672,102,2896)}q=r&65535;m=a+108|0;c[m>>2]=q;a:do{if(!(r<<16>>16==0)){v=f+20|0;z=f+16|0;r=j+20|0;s=j+16|0;t=h+12|0;u=h+8|0;q=h+4|0;w=k+12|0;x=k+8|0;y=k+4|0;A=0;while(1){E=d[e+A+6>>0]|0;c[a+(A*36|0)+28>>2]=E;B=d[e+A+9>>0]|0;c[a+(A*36|0)+32>>2]=B;if((c[v>>2]|0)<=(E|0)){p=6;break}E=(c[z>>2]|0)+(E<<3)|0;D=+g[E>>2];C=+g[E+4>>2];if((c[r>>2]|0)<=(B|0)){p=8;break}B=(c[s>>2]|0)+(B<<3)|0;H=+g[B>>2];J=+g[B+4>>2];K=+g[t>>2];I=+g[u>>2];F=+g[h>>2]+(D*K-C*I);G=+F;I=+(C*K+D*I+ +g[q>>2]);B=a+(A*36|0)|0;g[B>>2]=G;g[B+4>>2]=I;I=+g[w>>2];D=+g[x>>2];C=+g[k>>2]+(H*I-J*D);G=+C;D=+(J*I+H*D+ +g[y>>2]);B=a+(A*36|0)+8|0;g[B>>2]=G;g[B+4>>2]=D;C=+(C-F);D=+(+g[a+(A*36|0)+12>>2]- +g[a+(A*36|0)+4>>2]);B=a+(A*36|0)+16|0;g[B>>2]=C;g[B+4>>2]=D;g[a+(A*36|0)+24>>2]=0.0;A=A+1|0;B=c[m>>2]|0;if((A|0)>=(B|0)){n=B;break a}}if((p|0)==6){xa(2776,2808,103,2840)}else if((p|0)==8){xa(2776,2808,103,2840)}}else{n=q}}while(0);do{if((n|0)>1){C=+g[e>>2];if((n|0)==2){K=+g[a+16>>2]- +g[a+52>>2];o=+g[a+20>>2]- +g[a+56>>2];o=+O(+(K*K+o*o))}else if((n|0)==3){o=+g[a+16>>2];K=+g[a+20>>2];o=(+g[a+52>>2]-o)*(+g[a+92>>2]-K)-(+g[a+56>>2]-K)*(+g[a+88>>2]-o)}else{xa(2712,2672,259,2736)}if(!(o<C*.5)?!(C*2.0<o|o<1.1920928955078125e-7):0){p=18;break}c[m>>2]=0}else{p=18}}while(0);if((p|0)==18?(n|0)!=0:0){i=l;return}c[a+28>>2]=0;c[a+32>>2]=0;if((c[f+20>>2]|0)<=0){xa(2776,2808,103,2840)}E=c[f+16>>2]|0;o=+g[E>>2];C=+g[E+4>>2];if((c[j+20>>2]|0)<=0){xa(2776,2808,103,2840)}E=c[j+16>>2]|0;F=+g[E>>2];D=+g[E+4>>2];I=+g[h+12>>2];K=+g[h+8>>2];J=+g[h>>2]+(o*I-C*K);K=C*I+o*K+ +g[h+4>>2];I=+J;G=+K;E=a;g[E>>2]=I;g[E+4>>2]=G;G=+g[k+12>>2];I=+g[k+8>>2];H=+g[k>>2]+(F*G-D*I);I=D*G+F*I+ +g[k+4>>2];F=+H;G=+I;E=a+8|0;g[E>>2]=F;g[E+4>>2]=G;J=+(H-J);K=+(I-K);E=a+16|0;g[E>>2]=J;g[E+4>>2]=K;c[m>>2]=1;i=l;return}function Tc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0,j=0.0,k=0.0,l=0,m=0,n=0.0;e=i;f=c[a+108>>2]|0;if((f|0)==2){l=a+24|0;j=+g[l>>2];f=a+60|0;k=+g[f>>2];h=+(j*+g[a>>2]+k*+g[a+36>>2]);k=+(j*+g[a+4>>2]+k*+g[a+40>>2]);g[b>>2]=h;g[b+4>>2]=k;k=+g[l>>2];h=+g[f>>2];j=+(k*+g[a+8>>2]+h*+g[a+44>>2]);h=+(k*+g[a+12>>2]+h*+g[a+48>>2]);g[d>>2]=j;g[d+4>>2]=h;i=e;return}else if((f|0)==1){m=a;l=c[m+4>>2]|0;f=b;c[f>>2]=c[m>>2];c[f+4>>2]=l;f=a+8|0;b=c[f+4>>2]|0;l=d;c[l>>2]=c[f>>2];c[l+4>>2]=b;i=e;return}else if((f|0)==3){n=+g[a+24>>2];h=+g[a+60>>2];k=+g[a+96>>2];j=+(n*+g[a>>2]+h*+g[a+36>>2]+k*+g[a+72>>2]);k=+(n*+g[a+4>>2]+h*+g[a+40>>2]+k*+g[a+76>>2]);m=b;g[m>>2]=j;g[m+4>>2]=k;m=d;g[m>>2]=j;g[m+4>>2]=k;i=e;return}else if((f|0)==0){xa(2712,2672,217,2752)}else{xa(2712,2672,236,2752)}}function Uc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;e=i;c[a>>2]=-1;d=a+12|0;c[d>>2]=16;c[a+8>>2]=0;g=Zb(576)|0;b=a+4|0;c[b>>2]=g;Ve(g|0,0,(c[d>>2]|0)*36|0)|0;g=(c[d>>2]|0)+ -1|0;b=c[b>>2]|0;if((g|0)>0){g=0;while(1){f=g+1|0;c[b+(g*36|0)+20>>2]=f;c[b+(g*36|0)+32>>2]=-1;g=(c[d>>2]|0)+ -1|0;if((f|0)<(g|0)){g=f}else{break}}}c[b+(g*36|0)+20>>2]=-1;c[b+(((c[d>>2]|0)+ -1|0)*36|0)+32>>2]=-1;c[a+16>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;i=e;return}function Vc(a){a=a|0;var b=0;b=i;_b(c[a+4>>2]|0);i=b;return}function Wc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=a+16|0;f=c[d>>2]|0;if((f|0)==-1){e=a+8|0;g=c[e>>2]|0;f=a+12|0;if((g|0)!=(c[f>>2]|0)){xa(2912,2944,61,2984)}j=a+4|0;a=c[j>>2]|0;c[f>>2]=g<<1;h=Zb(g*72|0)|0;c[j>>2]=h;Xe(h|0,a|0,(c[e>>2]|0)*36|0)|0;_b(a);a=c[e>>2]|0;h=(c[f>>2]|0)+ -1|0;g=c[j>>2]|0;if((a|0)<(h|0)){h=a;while(1){a=h+1|0;c[g+(h*36|0)+20>>2]=a;c[g+(h*36|0)+32>>2]=-1;h=(c[f>>2]|0)+ -1|0;if((a|0)<(h|0)){h=a}else{break}}}c[g+(h*36|0)+20>>2]=-1;c[g+(((c[f>>2]|0)+ -1|0)*36|0)+32>>2]=-1;f=c[e>>2]|0;c[d>>2]=f}else{g=c[a+4>>2]|0;e=a+8|0}j=g+(f*36|0)+20|0;c[d>>2]=c[j>>2];c[j>>2]=-1;c[g+(f*36|0)+24>>2]=-1;c[g+(f*36|0)+28>>2]=-1;c[g+(f*36|0)+32>>2]=0;c[g+(f*36|0)+16>>2]=0;c[e>>2]=(c[e>>2]|0)+1;i=b;return f|0}function Xc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0.0,k=0.0,l=0;f=i;e=Wc(a)|0;h=a+4|0;j=+(+g[b>>2]+-.10000000149011612);k=+(+g[b+4>>2]+-.10000000149011612);l=(c[h>>2]|0)+(e*36|0)|0;g[l>>2]=j;g[l+4>>2]=k;k=+(+g[b+8>>2]+.10000000149011612);j=+(+g[b+12>>2]+.10000000149011612);b=(c[h>>2]|0)+(e*36|0)+8|0;g[b>>2]=k;g[b+4>>2]=j;c[(c[h>>2]|0)+(e*36|0)+16>>2]=d;c[(c[h>>2]|0)+(e*36|0)+32>>2]=0;Yc(a,e);i=f;return e|0}function Yc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,h=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0;d=i;n=a+24|0;c[n>>2]=(c[n>>2]|0)+1;n=c[a>>2]|0;if((n|0)==-1){c[a>>2]=b;c[(c[a+4>>2]|0)+(b*36|0)+20>>2]=-1;i=d;return}e=a+4|0;l=c[e>>2]|0;k=+g[l+(b*36|0)>>2];j=+g[l+(b*36|0)+4>>2];h=+g[l+(b*36|0)+8>>2];f=+g[l+(b*36|0)+12>>2];m=c[l+(n*36|0)+24>>2]|0;a:do{if(!((m|0)==-1)){do{o=c[l+(n*36|0)+28>>2]|0;q=+g[l+(n*36|0)+8>>2];r=+g[l+(n*36|0)>>2];t=+g[l+(n*36|0)+12>>2];s=+g[l+(n*36|0)+4>>2];x=((q>h?q:h)-(r<k?r:k)+((t>f?t:f)-(s<j?s:j)))*2.0;p=x*2.0;q=(x-(q-r+(t-s))*2.0)*2.0;x=+g[l+(m*36|0)>>2];s=k<x?k:x;t=+g[l+(m*36|0)+4>>2];u=j<t?j:t;v=+g[l+(m*36|0)+8>>2];w=h>v?h:v;r=+g[l+(m*36|0)+12>>2];y=f>r?f:r;if((c[l+(m*36|0)+24>>2]|0)==-1){r=(w-s+(y-u))*2.0}else{r=(w-s+(y-u))*2.0-(v-x+(r-t))*2.0}r=q+r;t=+g[l+(o*36|0)>>2];u=k<t?k:t;z=+g[l+(o*36|0)+4>>2];y=j<z?j:z;x=+g[l+(o*36|0)+8>>2];w=h>x?h:x;v=+g[l+(o*36|0)+12>>2];s=f>v?f:v;if((c[l+(o*36|0)+24>>2]|0)==-1){s=(w-u+(s-y))*2.0}else{s=(w-u+(s-y))*2.0-(x-t+(v-z))*2.0}q=q+s;if(p<r&p<q){break a}n=r<q?m:o;m=c[l+(n*36|0)+24>>2]|0}while(!((m|0)==-1))}}while(0);l=c[l+(n*36|0)+20>>2]|0;m=Wc(a)|0;o=c[e>>2]|0;c[o+(m*36|0)+20>>2]=l;c[o+(m*36|0)+16>>2]=0;o=c[e>>2]|0;q=+g[o+(n*36|0)>>2];p=+g[o+(n*36|0)+4>>2];k=+(k<q?k:q);j=+(j<p?j:p);A=o+(m*36|0)|0;g[A>>2]=k;g[A+4>>2]=j;k=+g[o+(n*36|0)+8>>2];j=+g[o+(n*36|0)+12>>2];h=+(h>k?h:k);z=+(f>j?f:j);o=o+(m*36|0)+8|0;g[o>>2]=h;g[o+4>>2]=z;o=c[e>>2]|0;c[o+(m*36|0)+32>>2]=(c[o+(n*36|0)+32>>2]|0)+1;if((l|0)==-1){c[o+(m*36|0)+24>>2]=n;c[o+(m*36|0)+28>>2]=b;c[o+(n*36|0)+20>>2]=m;A=o+(b*36|0)+20|0;c[A>>2]=m;c[a>>2]=m;m=c[A>>2]|0}else{A=o+(l*36|0)+24|0;if((c[A>>2]|0)==(n|0)){c[A>>2]=m}else{c[o+(l*36|0)+28>>2]=m}c[o+(m*36|0)+24>>2]=n;c[o+(m*36|0)+28>>2]=b;c[o+(n*36|0)+20>>2]=m;c[o+(b*36|0)+20>>2]=m}if((m|0)==-1){i=d;return}while(1){l=$c(a,m)|0;b=c[e>>2]|0;n=c[b+(l*36|0)+24>>2]|0;m=c[b+(l*36|0)+28>>2]|0;if((n|0)==-1){e=20;break}if((m|0)==-1){e=22;break}o=c[b+(n*36|0)+32>>2]|0;A=c[b+(m*36|0)+32>>2]|0;c[b+(l*36|0)+32>>2]=((o|0)>(A|0)?o:A)+1;j=+g[b+(n*36|0)>>2];k=+g[b+(m*36|0)>>2];f=+g[b+(n*36|0)+4>>2];h=+g[b+(m*36|0)+4>>2];j=+(j<k?j:k);f=+(f<h?f:h);A=b+(l*36|0)|0;g[A>>2]=j;g[A+4>>2]=f;f=+g[b+(n*36|0)+8>>2];h=+g[b+(m*36|0)+8>>2];j=+g[b+(n*36|0)+12>>2];k=+g[b+(m*36|0)+12>>2];f=+(f>h?f:h);z=+(j>k?j:k);m=b+(l*36|0)+8|0;g[m>>2]=f;g[m+4>>2]=z;m=c[(c[e>>2]|0)+(l*36|0)+20>>2]|0;if((m|0)==-1){e=24;break}}if((e|0)==20){xa(3168,2944,307,3184)}else if((e|0)==22){xa(3200,2944,308,3184)}else if((e|0)==24){i=d;return}}function Zc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0;d=i;if((c[a>>2]|0)==(b|0)){c[a>>2]=-1;i=d;return}e=a+4|0;h=c[e>>2]|0;j=c[h+(b*36|0)+20>>2]|0;f=h+(j*36|0)+20|0;k=c[f>>2]|0;p=c[h+(j*36|0)+24>>2]|0;if((p|0)==(b|0)){p=c[h+(j*36|0)+28>>2]|0}if((k|0)==-1){c[a>>2]=p;c[h+(p*36|0)+20>>2]=-1;if(!((j|0)>-1)){xa(3e3,2944,97,3040)}if((c[a+12>>2]|0)<=(j|0)){xa(3e3,2944,97,3040)}e=a+8|0;if((c[e>>2]|0)<=0){xa(3056,2944,98,3040)}p=a+16|0;c[f>>2]=c[p>>2];c[h+(j*36|0)+32>>2]=-1;c[p>>2]=j;c[e>>2]=(c[e>>2]|0)+ -1;i=d;return}b=h+(k*36|0)+24|0;if((c[b>>2]|0)==(j|0)){c[b>>2]=p}else{c[h+(k*36|0)+28>>2]=p}c[h+(p*36|0)+20>>2]=k;if(!((j|0)>-1)){xa(3e3,2944,97,3040)}if((c[a+12>>2]|0)<=(j|0)){xa(3e3,2944,97,3040)}b=a+8|0;if((c[b>>2]|0)<=0){xa(3056,2944,98,3040)}p=a+16|0;c[f>>2]=c[p>>2];c[h+(j*36|0)+32>>2]=-1;c[p>>2]=j;c[b>>2]=(c[b>>2]|0)+ -1;do{f=$c(a,k)|0;k=c[e>>2]|0;j=c[k+(f*36|0)+24>>2]|0;h=c[k+(f*36|0)+28>>2]|0;n=+g[k+(j*36|0)>>2];o=+g[k+(h*36|0)>>2];m=+g[k+(j*36|0)+4>>2];l=+g[k+(h*36|0)+4>>2];n=+(n<o?n:o);o=+(m<l?m:l);p=k+(f*36|0)|0;g[p>>2]=n;g[p+4>>2]=o;o=+g[k+(j*36|0)+8>>2];n=+g[k+(h*36|0)+8>>2];m=+g[k+(j*36|0)+12>>2];l=+g[k+(h*36|0)+12>>2];n=+(o>n?o:n);o=+(m>l?m:l);k=k+(f*36|0)+8|0;g[k>>2]=n;g[k+4>>2]=o;k=c[e>>2]|0;j=c[k+(j*36|0)+32>>2]|0;h=c[k+(h*36|0)+32>>2]|0;c[k+(f*36|0)+32>>2]=((j|0)>(h|0)?j:h)+1;k=c[k+(f*36|0)+20>>2]|0}while(!((k|0)==-1));i=d;return}function _c(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0;h=i;if(!((b|0)>-1)){xa(3072,2944,135,3152)}if((c[a+12>>2]|0)<=(b|0)){xa(3072,2944,135,3152)}f=a+4|0;p=c[f>>2]|0;if(!((c[p+(b*36|0)+24>>2]|0)==-1)){xa(3120,2944,137,3152)}if(((+g[p+(b*36|0)>>2]<=+g[d>>2]?+g[p+(b*36|0)+4>>2]<=+g[d+4>>2]:0)?+g[d+8>>2]<=+g[p+(b*36|0)+8>>2]:0)?+g[d+12>>2]<=+g[p+(b*36|0)+12>>2]:0){d=0;i=h;return d|0}Zc(a,b);p=d;k=+g[p>>2];m=+g[p+4>>2];d=d+8|0;n=+g[d>>2];k=k+-.10000000149011612;m=m+-.10000000149011612;n=n+.10000000149011612;j=+g[d+4>>2]+.10000000149011612;o=+g[e>>2]*2.0;l=+g[e+4>>2]*2.0;if(o<0.0){k=k+o}else{n=o+n}if(l<0.0){m=m+l}else{j=l+j}d=c[f>>2]|0;l=+k;o=+m;p=d+(b*36|0)|0;g[p>>2]=l;g[p+4>>2]=o;n=+n;o=+j;d=d+(b*36|0)+8|0;g[d>>2]=n;g[d+4>>2]=o;Yc(a,b);d=1;i=h;return d|0}function $c(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0;d=i;if((b|0)==-1){xa(3216,2944,382,3232)}j=c[a+4>>2]|0;p=j+(b*36|0)|0;u=j+(b*36|0)+24|0;l=c[u>>2]|0;if((l|0)==-1){x=b;i=d;return x|0}e=j+(b*36|0)+32|0;if((c[e>>2]|0)<2){x=b;i=d;return x|0}w=j+(b*36|0)+28|0;k=c[w>>2]|0;if(!((l|0)>-1)){xa(3240,2944,392,3232)}o=c[a+12>>2]|0;if((l|0)>=(o|0)){xa(3240,2944,392,3232)}if(!((k|0)>-1&(k|0)<(o|0))){xa(3272,2944,393,3232)}m=j+(l*36|0)|0;n=j+(k*36|0)|0;f=j+(k*36|0)+32|0;h=j+(l*36|0)+32|0;q=(c[f>>2]|0)-(c[h>>2]|0)|0;if((q|0)>1){x=j+(k*36|0)+24|0;q=c[x>>2]|0;u=j+(k*36|0)+28|0;r=c[u>>2]|0;s=j+(q*36|0)|0;t=j+(r*36|0)|0;if(!((q|0)>-1&(q|0)<(o|0))){xa(3304,2944,407,3232)}if(!((r|0)>-1&(r|0)<(o|0))){xa(3336,2944,408,3232)}c[x>>2]=b;x=j+(b*36|0)+20|0;o=j+(k*36|0)+20|0;c[o>>2]=c[x>>2];c[x>>2]=k;o=c[o>>2]|0;do{if(!((o|0)==-1)){a=j+(o*36|0)+24|0;if((c[a>>2]|0)==(b|0)){c[a>>2]=k;break}a=j+(o*36|0)+28|0;if((c[a>>2]|0)==(b|0)){c[a>>2]=k;break}else{xa(3368,2944,424,3232)}}else{c[a>>2]=k}}while(0);a=j+(q*36|0)+32|0;o=j+(r*36|0)+32|0;if((c[a>>2]|0)>(c[o>>2]|0)){c[u>>2]=q;c[w>>2]=r;c[j+(r*36|0)+20>>2]=b;v=+g[m>>2];y=+g[t>>2];v=v<y?v:y;z=+g[j+(l*36|0)+4>>2];y=+g[j+(r*36|0)+4>>2];A=+v;z=+(z<y?z:y);x=p;g[x>>2]=A;g[x+4>>2]=z;z=+g[j+(l*36|0)+8>>2];A=+g[j+(r*36|0)+8>>2];y=+g[j+(l*36|0)+12>>2];B=+g[j+(r*36|0)+12>>2];z=+(z>A?z:A);A=+(y>B?y:B);x=j+(b*36|0)+8|0;g[x>>2]=z;g[x+4>>2]=A;A=+g[s>>2];y=+g[j+(b*36|0)+4>>2];z=+g[j+(q*36|0)+4>>2];v=+(v<A?v:A);y=+(y<z?y:z);x=n;g[x>>2]=v;g[x+4>>2]=y;y=+g[j+(b*36|0)+8>>2];v=+g[j+(q*36|0)+8>>2];z=+g[j+(b*36|0)+12>>2];A=+g[j+(q*36|0)+12>>2];v=+(y>v?y:v);B=+(z>A?z:A);j=j+(k*36|0)+8|0;g[j>>2]=v;g[j+4>>2]=B;h=c[h>>2]|0;j=c[o>>2]|0;h=((h|0)>(j|0)?h:j)+1|0;c[e>>2]=h;e=c[a>>2]|0;e=(h|0)>(e|0)?h:e}else{c[u>>2]=r;c[w>>2]=q;c[j+(q*36|0)+20>>2]=b;v=+g[m>>2];y=+g[s>>2];v=v<y?v:y;z=+g[j+(l*36|0)+4>>2];A=+g[j+(q*36|0)+4>>2];y=+v;z=+(z<A?z:A);x=p;g[x>>2]=y;g[x+4>>2]=z;z=+g[j+(l*36|0)+8>>2];A=+g[j+(q*36|0)+8>>2];y=+g[j+(l*36|0)+12>>2];B=+g[j+(q*36|0)+12>>2];z=+(z>A?z:A);A=+(y>B?y:B);x=j+(b*36|0)+8|0;g[x>>2]=z;g[x+4>>2]=A;A=+g[t>>2];y=+g[j+(b*36|0)+4>>2];z=+g[j+(r*36|0)+4>>2];v=+(v<A?v:A);z=+(y<z?y:z);x=n;g[x>>2]=v;g[x+4>>2]=z;z=+g[j+(b*36|0)+8>>2];v=+g[j+(r*36|0)+8>>2];y=+g[j+(b*36|0)+12>>2];A=+g[j+(r*36|0)+12>>2];v=+(z>v?z:v);B=+(y>A?y:A);j=j+(k*36|0)+8|0;g[j>>2]=v;g[j+4>>2]=B;h=c[h>>2]|0;j=c[a>>2]|0;h=((h|0)>(j|0)?h:j)+1|0;c[e>>2]=h;e=c[o>>2]|0;e=(h|0)>(e|0)?h:e}c[f>>2]=e+1;x=k;i=d;return x|0}if(!((q|0)<-1)){x=b;i=d;return x|0}x=j+(l*36|0)+24|0;q=c[x>>2]|0;w=j+(l*36|0)+28|0;r=c[w>>2]|0;t=j+(q*36|0)|0;s=j+(r*36|0)|0;if(!((q|0)>-1&(q|0)<(o|0))){xa(3400,2944,467,3232)}if(!((r|0)>-1&(r|0)<(o|0))){xa(3432,2944,468,3232)}c[x>>2]=b;x=j+(b*36|0)+20|0;o=j+(l*36|0)+20|0;c[o>>2]=c[x>>2];c[x>>2]=l;o=c[o>>2]|0;do{if(!((o|0)==-1)){a=j+(o*36|0)+24|0;if((c[a>>2]|0)==(b|0)){c[a>>2]=l;break}a=j+(o*36|0)+28|0;if((c[a>>2]|0)==(b|0)){c[a>>2]=l;break}else{xa(3464,2944,484,3232)}}else{c[a>>2]=l}}while(0);o=j+(q*36|0)+32|0;a=j+(r*36|0)+32|0;if((c[o>>2]|0)>(c[a>>2]|0)){c[w>>2]=q;c[u>>2]=r;c[j+(r*36|0)+20>>2]=b;v=+g[n>>2];y=+g[s>>2];v=v<y?v:y;z=+g[j+(k*36|0)+4>>2];y=+g[j+(r*36|0)+4>>2];A=+v;z=+(z<y?z:y);x=p;g[x>>2]=A;g[x+4>>2]=z;z=+g[j+(k*36|0)+8>>2];y=+g[j+(r*36|0)+8>>2];A=+g[j+(k*36|0)+12>>2];B=+g[j+(r*36|0)+12>>2];y=+(z>y?z:y);A=+(A>B?A:B);x=j+(b*36|0)+8|0;g[x>>2]=y;g[x+4>>2]=A;A=+g[t>>2];z=+g[j+(b*36|0)+4>>2];y=+g[j+(q*36|0)+4>>2];v=+(v<A?v:A);y=+(z<y?z:y);x=m;g[x>>2]=v;g[x+4>>2]=y;y=+g[j+(b*36|0)+8>>2];z=+g[j+(q*36|0)+8>>2];v=+g[j+(b*36|0)+12>>2];A=+g[j+(q*36|0)+12>>2];y=+(y>z?y:z);B=+(v>A?v:A);j=j+(l*36|0)+8|0;g[j>>2]=y;g[j+4>>2]=B;f=c[f>>2]|0;j=c[a>>2]|0;f=((f|0)>(j|0)?f:j)+1|0;c[e>>2]=f;e=c[o>>2]|0;e=(f|0)>(e|0)?f:e}else{c[w>>2]=r;c[u>>2]=q;c[j+(q*36|0)+20>>2]=b;v=+g[n>>2];y=+g[t>>2];v=v<y?v:y;z=+g[j+(k*36|0)+4>>2];A=+g[j+(q*36|0)+4>>2];y=+v;A=+(z<A?z:A);x=p;g[x>>2]=y;g[x+4>>2]=A;A=+g[j+(k*36|0)+8>>2];z=+g[j+(q*36|0)+8>>2];y=+g[j+(k*36|0)+12>>2];B=+g[j+(q*36|0)+12>>2];z=+(A>z?A:z);A=+(y>B?y:B);x=j+(b*36|0)+8|0;g[x>>2]=z;g[x+4>>2]=A;A=+g[s>>2];z=+g[j+(b*36|0)+4>>2];y=+g[j+(r*36|0)+4>>2];v=+(v<A?v:A);y=+(z<y?z:y);x=m;g[x>>2]=v;g[x+4>>2]=y;y=+g[j+(b*36|0)+8>>2];z=+g[j+(r*36|0)+8>>2];v=+g[j+(b*36|0)+12>>2];A=+g[j+(r*36|0)+12>>2];y=+(y>z?y:z);B=+(v>A?v:A);j=j+(l*36|0)+8|0;g[j>>2]=y;g[j+4>>2]=B;f=c[f>>2]|0;j=c[o>>2]|0;f=((f|0)>(j|0)?f:j)+1|0;c[e>>2]=f;e=c[a>>2]|0;e=(f|0)>(e|0)?f:e}c[h>>2]=e+1;x=l;i=d;return x|0}function ad(d,e){d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0.0,J=0.0,K=0,L=0,N=0,O=0,P=0,S=0,T=0,U=0,V=0.0,W=0,X=0.0,Y=0.0,Z=0,_=0,$=0.0,aa=0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0,ga=0.0,ha=0.0,ia=0.0,ja=0.0;f=i;i=i+320|0;q=f+276|0;p=f+240|0;r=f+228|0;k=f+136|0;m=f+112|0;n=f+8|0;o=f+4|0;j=f;c[874]=(c[874]|0)+1;c[d>>2]=0;x=e+128|0;h=d+4|0;g[h>>2]=+g[x>>2];l=e+28|0;u=q+0|0;t=e+56|0;v=u+36|0;do{c[u>>2]=c[t>>2];u=u+4|0;t=t+4|0}while((u|0)<(v|0));u=p+0|0;t=e+92|0;v=u+36|0;do{c[u>>2]=c[t>>2];u=u+4|0;t=t+4|0}while((u|0)<(v|0));t=q+24|0;X=+g[t>>2];Y=+M(+(X/6.2831854820251465))*6.2831854820251465;X=X-Y;g[t>>2]=X;u=q+28|0;Y=+g[u>>2]-Y;g[u>>2]=Y;v=p+24|0;$=+g[v>>2];V=+M(+($/6.2831854820251465))*6.2831854820251465;$=$-V;g[v>>2]=$;w=p+28|0;V=+g[w>>2]-V;g[w>>2]=V;s=+g[x>>2];G=+g[e+24>>2]+ +g[e+52>>2]+-.014999999664723873;G=G<.004999999888241291?.004999999888241291:G;if(!(G>.0012499999720603228)){xa(3536,3560,280,3600)}b[r+4>>1]=0;c[k+0>>2]=c[e+0>>2];c[k+4>>2]=c[e+4>>2];c[k+8>>2]=c[e+8>>2];c[k+12>>2]=c[e+12>>2];c[k+16>>2]=c[e+16>>2];c[k+20>>2]=c[e+20>>2];c[k+24>>2]=c[e+24>>2];T=k+28|0;c[T+0>>2]=c[l+0>>2];c[T+4>>2]=c[l+4>>2];c[T+8>>2]=c[l+8>>2];c[T+12>>2]=c[l+12>>2];c[T+16>>2]=c[l+16>>2];c[T+20>>2]=c[l+20>>2];c[T+24>>2]=c[l+24>>2];a[k+88>>0]=0;T=q+8|0;F=q+12|0;H=q+16|0;A=q+20|0;K=q+4|0;N=p+8|0;P=p+12|0;O=p+16|0;S=p+20|0;L=p+4|0;E=k+56|0;D=k+64|0;C=k+68|0;B=k+72|0;y=k+80|0;x=k+84|0;z=m+16|0;I=G+.0012499999720603228;J=G+-.0012499999720603228;ba=V;U=0;V=0.0;a:while(1){ja=1.0-V;ca=ja*X+V*Y;Y=+R(+ca);ca=+Q(+ca);ia=+g[q>>2];ha=+g[K>>2];X=ja*$+V*ba;ga=+R(+X);X=+Q(+X);$=+g[p>>2];ea=+g[L>>2];da=ja*+g[N>>2]+V*+g[O>>2]-(X*$-ga*ea);ea=ja*+g[P>>2]+V*+g[S>>2]-(ga*$+X*ea);$=+(ja*+g[T>>2]+V*+g[H>>2]-(ca*ia-Y*ha));ba=+(ja*+g[F>>2]+V*+g[A>>2]-(Y*ia+ca*ha));fa=E;g[fa>>2]=$;g[fa+4>>2]=ba;g[D>>2]=Y;g[C>>2]=ca;da=+da;ea=+ea;fa=B;g[fa>>2]=da;g[fa+4>>2]=ea;g[y>>2]=ga;g[x>>2]=X;Rc(m,r,k);X=+g[z>>2];if(X<=0.0){j=5;break}if(X<I){j=7;break}+bd(n,r,e,q,l,p,V);W=0;X=s;do{da=+cd(n,o,j,X);if(da>I){j=10;break a}if(da>J){V=X;break}_=c[o>>2]|0;Z=c[j>>2]|0;ba=+dd(n,_,Z,V);if(ba<J){j=13;break a}if(!(ba<=I)){Y=V;$=X;aa=0}else{j=15;break a}while(1){if((aa&1|0)==0){ca=(Y+$)*.5}else{ca=Y+(G-ba)*($-Y)/(da-ba)}ea=+dd(n,_,Z,ca);ga=ea-G;if(!(ga>0.0)){ga=-ga}if(ga<.0012499999720603228){X=ca;break}fa=ea>G;aa=aa+1|0;c[880]=(c[880]|0)+1;if((aa|0)==50){aa=50;break}else{Y=fa?ca:Y;$=fa?$:ca;ba=fa?ea:ba;da=fa?da:ea}}Z=c[882]|0;c[882]=(Z|0)>(aa|0)?Z:aa;W=W+1|0}while((W|0)!=8);U=U+1|0;c[876]=(c[876]|0)+1;if((U|0)==20){j=27;break}X=+g[t>>2];Y=+g[u>>2];$=+g[v>>2];ba=+g[w>>2]}if((j|0)==5){c[d>>2]=2;g[h>>2]=0.0;h=c[878]|0;fa=(h|0)>(U|0);fa=fa?h:U;c[878]=fa;i=f;return}else if((j|0)==7){c[d>>2]=3;g[h>>2]=V;h=c[878]|0;fa=(h|0)>(U|0);fa=fa?h:U;c[878]=fa;i=f;return}else if((j|0)==10){c[d>>2]=4;g[h>>2]=s}else if((j|0)==13){c[d>>2]=1;g[h>>2]=V}else if((j|0)==15){c[d>>2]=3;g[h>>2]=V}else if((j|0)==27){c[d>>2]=1;g[h>>2]=V;U=20;h=c[878]|0;fa=(h|0)>(U|0);fa=fa?h:U;c[878]=fa;i=f;return}c[876]=(c[876]|0)+1;U=U+1|0;h=c[878]|0;fa=(h|0)>(U|0);fa=fa?h:U;c[878]=fa;i=f;return}function bd(e,f,h,j,k,l,m){e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=+m;var n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0,F=0,G=0,H=0.0,I=0.0;n=i;c[e>>2]=h;c[e+4>>2]=k;v=b[f+4>>1]|0;if(!(v<<16>>16!=0&(v&65535)<3)){xa(3744,3560,50,3768)}D=e+8|0;E=D+0|0;G=j+0|0;F=E+36|0;do{c[E>>2]=c[G>>2];E=E+4|0;G=G+4|0}while((E|0)<(F|0));j=e+44|0;E=j+0|0;G=l+0|0;F=E+36|0;do{c[E>>2]=c[G>>2];E=E+4|0;G=G+4|0}while((E|0)<(F|0));A=1.0-m;p=A*+g[e+32>>2]+ +g[e+36>>2]*m;o=+R(+p);p=+Q(+p);s=+g[D>>2];q=+g[e+12>>2];t=A*+g[e+16>>2]+ +g[e+24>>2]*m-(p*s-o*q);q=A*+g[e+20>>2]+ +g[e+28>>2]*m-(o*s+p*q);s=A*+g[e+68>>2]+ +g[e+72>>2]*m;r=+R(+s);s=+Q(+s);B=+g[j>>2];C=+g[e+48>>2];u=A*+g[e+52>>2]+ +g[e+60>>2]*m-(s*B-r*C);m=A*+g[e+56>>2]+ +g[e+64>>2]*m-(r*B+s*C);if(v<<16>>16==1){c[e+80>>2]=0;v=d[f+6>>0]|0;if((c[h+20>>2]|0)<=(v|0)){xa(3640,3672,103,3704)}G=(c[h+16>>2]|0)+(v<<3)|0;w=+g[G>>2];x=+g[G+4>>2];f=d[f+9>>0]|0;if((c[k+20>>2]|0)<=(f|0)){xa(3640,3672,103,3704)}f=(c[k+16>>2]|0)+(f<<3)|0;B=+g[f>>2];C=+g[f+4>>2];f=e+92|0;t=u+(s*B-r*C)-(t+(p*w-o*x));p=m+(r*B+s*C)-(q+(o*w+p*x));C=+t;o=+p;G=f;g[G>>2]=C;g[G+4>>2]=o;o=+O(+(t*t+p*p));if(o<1.1920928955078125e-7){C=0.0;i=n;return+C}C=1.0/o;g[f>>2]=t*C;g[e+96>>2]=p*C;C=o;i=n;return+C}v=f+6|0;j=f+7|0;D=e+80|0;if((a[v>>0]|0)==(a[j>>0]|0)){c[D>>2]=2;D=d[f+9>>0]|0;j=c[k+20>>2]|0;if((j|0)<=(D|0)){xa(3640,3672,103,3704)}k=c[k+16>>2]|0;G=k+(D<<3)|0;x=+g[G>>2];w=+g[G+4>>2];f=d[f+10>>0]|0;if((j|0)<=(f|0)){xa(3640,3672,103,3704)}f=k+(f<<3)|0;B=+g[f>>2];z=+g[f+4>>2];f=e+92|0;C=B-x;A=z-w;y=-C;I=+A;H=+y;G=f;g[G>>2]=I;g[G+4>>2]=H;C=+O(+(A*A+C*C));if(!(C<1.1920928955078125e-7)){I=1.0/C;A=A*I;g[f>>2]=A;y=I*y;g[e+96>>2]=y}x=(x+B)*.5;w=(w+z)*.5;H=+x;I=+w;e=e+84|0;g[e>>2]=H;g[e+4>>2]=I;e=d[v>>0]|0;if((c[h+20>>2]|0)<=(e|0)){xa(3640,3672,103,3704)}G=(c[h+16>>2]|0)+(e<<3)|0;H=+g[G>>2];I=+g[G+4>>2];o=(s*A-r*y)*(t+(p*H-o*I)-(u+(s*x-r*w)))+(r*A+s*y)*(q+(o*H+p*I)-(m+(r*x+s*w)));if(!(o<0.0)){I=o;i=n;return+I}H=+-A;I=+-y;G=f;g[G>>2]=H;g[G+4>>2]=I;I=-o;i=n;return+I}else{c[D>>2]=1;D=d[v>>0]|0;v=c[h+20>>2]|0;if((v|0)<=(D|0)){xa(3640,3672,103,3704)}h=c[h+16>>2]|0;G=h+(D<<3)|0;x=+g[G>>2];w=+g[G+4>>2];j=d[j>>0]|0;if((v|0)<=(j|0)){xa(3640,3672,103,3704)}h=h+(j<<3)|0;B=+g[h>>2];z=+g[h+4>>2];h=e+92|0;C=B-x;A=z-w;y=-C;H=+A;I=+y;G=h;g[G>>2]=H;g[G+4>>2]=I;C=+O(+(A*A+C*C));if(!(C<1.1920928955078125e-7)){I=1.0/C;A=A*I;g[h>>2]=A;y=I*y;g[e+96>>2]=y}x=(x+B)*.5;w=(w+z)*.5;H=+x;I=+w;e=e+84|0;g[e>>2]=H;g[e+4>>2]=I;e=d[f+9>>0]|0;if((c[k+20>>2]|0)<=(e|0)){xa(3640,3672,103,3704)}G=(c[k+16>>2]|0)+(e<<3)|0;H=+g[G>>2];I=+g[G+4>>2];o=(p*A-o*y)*(u+(s*H-r*I)-(t+(p*x-o*w)))+(o*A+p*y)*(m+(r*H+s*I)-(q+(o*x+p*w)));if(!(o<0.0)){I=o;i=n;return+I}H=+-A;I=+-y;G=h;g[G>>2]=H;g[G+4>>2]=I;I=-o;i=n;return+I}return 0.0}function cd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0.0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0,D=0;f=i;x=1.0-e;m=x*+g[a+32>>2]+ +g[a+36>>2]*e;k=+R(+m);m=+Q(+m);j=+g[a+8>>2];l=+g[a+12>>2];o=x*+g[a+16>>2]+ +g[a+24>>2]*e-(m*j-k*l);l=x*+g[a+20>>2]+ +g[a+28>>2]*e-(k*j+m*l);j=x*+g[a+68>>2]+ +g[a+72>>2]*e;h=+R(+j);j=+Q(+j);y=+g[a+44>>2];z=+g[a+48>>2];n=x*+g[a+52>>2]+ +g[a+60>>2]*e-(j*y-h*z);e=x*+g[a+56>>2]+ +g[a+64>>2]*e-(h*y+j*z);v=c[a+80>>2]|0;if((v|0)==0){p=+g[a+92>>2];q=+g[a+96>>2];z=m*p+k*q;w=m*q-k*p;u=-p;y=-q;t=j*u+h*y;u=j*y-h*u;s=c[a>>2]|0;r=c[s+16>>2]|0;s=s+20|0;A=c[s>>2]|0;if((A|0)>1){B=0;x=w*+g[r+4>>2]+z*+g[r>>2];C=1;while(1){y=z*+g[r+(C<<3)>>2]+w*+g[r+(C<<3)+4>>2];v=y>x;B=v?C:B;C=C+1|0;if((C|0)==(A|0)){break}else{x=v?y:x}}}else{B=0}c[b>>2]=B;a=c[a+4>>2]|0;v=c[a+16>>2]|0;a=a+20|0;A=c[a>>2]|0;if((A|0)>1){C=0;w=u*+g[v+4>>2]+t*+g[v>>2];D=1;while(1){x=t*+g[v+(D<<3)>>2]+u*+g[v+(D<<3)+4>>2];B=x>w;C=B?D:C;D=D+1|0;if((D|0)==(A|0)){break}else{w=B?x:w}}}else{C=0}c[d>>2]=C;d=c[b>>2]|0;if(!((d|0)>-1)){xa(3640,3672,103,3704)}if((c[s>>2]|0)<=(d|0)){xa(3640,3672,103,3704)}D=r+(d<<3)|0;t=+g[D>>2];u=+g[D+4>>2];if(!((C|0)>-1)){xa(3640,3672,103,3704)}if((c[a>>2]|0)<=(C|0)){xa(3640,3672,103,3704)}D=v+(C<<3)|0;y=+g[D>>2];z=+g[D+4>>2];z=p*(n+(j*y-h*z)-(o+(m*t-k*u)))+q*(e+(h*y+j*z)-(l+(k*t+m*u)));i=f;return+z}else if((v|0)==1){y=+g[a+92>>2];p=+g[a+96>>2];q=m*y-k*p;p=k*y+m*p;y=+g[a+84>>2];z=+g[a+88>>2];o=o+(m*y-k*z);k=l+(k*y+m*z);m=-q;z=-p;l=j*m+h*z;m=j*z-h*m;c[b>>2]=-1;A=a+4|0;B=c[A>>2]|0;a=c[B+16>>2]|0;B=c[B+20>>2]|0;if((B|0)>1){v=0;t=m*+g[a+4>>2]+l*+g[a>>2];s=1;while(1){u=l*+g[a+(s<<3)>>2]+m*+g[a+(s<<3)+4>>2];b=u>t;v=b?s:v;s=s+1|0;if((s|0)==(B|0)){break}else{t=b?u:t}}c[d>>2]=v;if((v|0)>-1){r=v}else{xa(3640,3672,103,3704)}}else{c[d>>2]=0;r=0}d=c[A>>2]|0;if((c[d+20>>2]|0)<=(r|0)){xa(3640,3672,103,3704)}D=(c[d+16>>2]|0)+(r<<3)|0;y=+g[D>>2];z=+g[D+4>>2];z=q*(n+(j*y-h*z)-o)+p*(e+(h*y+j*z)-k);i=f;return+z}else if((v|0)==2){y=+g[a+92>>2];q=+g[a+96>>2];p=j*y-h*q;q=h*y+j*q;y=+g[a+84>>2];z=+g[a+88>>2];n=n+(j*y-h*z);h=e+(h*y+j*z);j=-p;z=-q;e=m*j+k*z;j=m*z-k*j;c[d>>2]=-1;B=c[a>>2]|0;A=c[B+16>>2]|0;B=c[B+20>>2]|0;if((B|0)>1){d=0;u=j*+g[A+4>>2]+e*+g[A>>2];r=1;while(1){t=e*+g[A+(r<<3)>>2]+j*+g[A+(r<<3)+4>>2];v=t>u;d=v?r:d;r=r+1|0;if((r|0)==(B|0)){break}else{u=v?t:u}}c[b>>2]=d;if((d|0)>-1){s=d}else{xa(3640,3672,103,3704)}}else{c[b>>2]=0;s=0}d=c[a>>2]|0;if((c[d+20>>2]|0)<=(s|0)){xa(3640,3672,103,3704)}D=(c[d+16>>2]|0)+(s<<3)|0;y=+g[D>>2];z=+g[D+4>>2];z=p*(o+(m*y-k*z)-n)+q*(l+(k*y+m*z)-h);i=f;return+z}else{xa(3616,3560,183,3720)}return 0.0}function dd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0.0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0.0;o=i;q=1.0-e;j=q*+g[a+32>>2]+ +g[a+36>>2]*e;k=+R(+j);j=+Q(+j);h=+g[a+8>>2];f=+g[a+12>>2];m=q*+g[a+16>>2]+ +g[a+24>>2]*e-(j*h-k*f);f=q*+g[a+20>>2]+ +g[a+28>>2]*e-(k*h+j*f);h=q*+g[a+68>>2]+ +g[a+72>>2]*e;n=+R(+h);h=+Q(+h);r=+g[a+44>>2];s=+g[a+48>>2];l=q*+g[a+52>>2]+ +g[a+60>>2]*e-(h*r-n*s);e=q*+g[a+56>>2]+ +g[a+64>>2]*e-(n*r+h*s);t=c[a+80>>2]|0;if((t|0)==2){s=+g[a+92>>2];p=+g[a+96>>2];q=+g[a+84>>2];r=+g[a+88>>2];a=c[a>>2]|0;if(!((b|0)>-1)){xa(3640,3672,103,3704)}if((c[a+20>>2]|0)<=(b|0)){xa(3640,3672,103,3704)}t=(c[a+16>>2]|0)+(b<<3)|0;v=+g[t>>2];u=+g[t+4>>2];s=(h*s-n*p)*(m+(j*v-k*u)-(l+(h*q-n*r)))+(n*s+h*p)*(f+(k*v+j*u)-(e+(n*q+h*r)));i=o;return+s}else if((t|0)==0){p=+g[a+92>>2];q=+g[a+96>>2];t=c[a>>2]|0;if(!((b|0)>-1)){xa(3640,3672,103,3704)}if((c[t+20>>2]|0)<=(b|0)){xa(3640,3672,103,3704)}t=(c[t+16>>2]|0)+(b<<3)|0;s=+g[t>>2];r=+g[t+4>>2];a=c[a+4>>2]|0;if(!((d|0)>-1)){xa(3640,3672,103,3704)}if((c[a+20>>2]|0)<=(d|0)){xa(3640,3672,103,3704)}t=(c[a+16>>2]|0)+(d<<3)|0;u=+g[t>>2];v=+g[t+4>>2];v=p*(l+(h*u-n*v)-(m+(j*s-k*r)))+q*(e+(n*u+h*v)-(f+(k*s+j*r)));i=o;return+v}else if((t|0)==1){p=+g[a+92>>2];s=+g[a+96>>2];r=+g[a+84>>2];q=+g[a+88>>2];a=c[a+4>>2]|0;if(!((d|0)>-1)){xa(3640,3672,103,3704)}if((c[a+20>>2]|0)<=(d|0)){xa(3640,3672,103,3704)}t=(c[a+16>>2]|0)+(d<<3)|0;u=+g[t>>2];v=+g[t+4>>2];v=(j*p-k*s)*(l+(h*u-n*v)-(m+(j*r-k*q)))+(k*p+j*s)*(e+(n*u+h*v)-(f+(k*r+j*q)));i=o;return+v}else{xa(3616,3560,242,3624)}return 0.0}function ed(a){a=a|0;c[a+102400>>2]=0;c[a+102404>>2]=0;c[a+102408>>2]=0;c[a+102796>>2]=0;return}function fd(a){a=a|0;var b=0;b=i;if((c[a+102400>>2]|0)!=0){xa(3792,3808,32,3848)}if((c[a+102796>>2]|0)==0){i=b;return}else{xa(3872,3808,33,3848)}}function gd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;f=i;g=b+102796|0;h=c[g>>2]|0;if((h|0)>=32){xa(3896,3808,38,3936)}e=b+(h*12|0)+102412|0;c[b+(h*12|0)+102416>>2]=d;j=b+102400|0;k=c[j>>2]|0;if((k+d|0)>102400){c[e>>2]=Zb(d)|0;a[b+(h*12|0)+102420>>0]=1}else{c[e>>2]=b+k;a[b+(h*12|0)+102420>>0]=0;c[j>>2]=(c[j>>2]|0)+d}h=b+102404|0;d=(c[h>>2]|0)+d|0;c[h>>2]=d;b=b+102408|0;h=c[b>>2]|0;c[b>>2]=(h|0)>(d|0)?h:d;c[g>>2]=(c[g>>2]|0)+1;i=f;return c[e>>2]|0}function hd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;f=i;e=b+102796|0;h=c[e>>2]|0;if((h|0)<=0){xa(3952,3808,63,3976)}g=h+ -1|0;if((c[b+(g*12|0)+102412>>2]|0)!=(d|0)){xa(3984,3808,65,3976)}if((a[b+(g*12|0)+102420>>0]|0)==0){g=b+(g*12|0)+102416|0;d=b+102400|0;c[d>>2]=(c[d>>2]|0)-(c[g>>2]|0)}else{_b(d);h=c[e>>2]|0;g=b+(g*12|0)+102416|0}d=b+102404|0;c[d>>2]=(c[d>>2]|0)-(c[g>>2]|0);c[e>>2]=h+ -1;i=f;return}function id(a){a=a|0;return}function jd(a){a=a|0;return}function kd(a){a=a|0;return 0.0}function ld(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0;h=i;if((a[4200]|0)==0){c[1002]=3;c[4012>>2]=3;a[4016>>0]=1;c[4104>>2]=4;c[4108>>2]=4;a[4112>>0]=1;c[4032>>2]=4;c[4036>>2]=4;a[4040>>0]=0;c[4128>>2]=5;c[4132>>2]=5;a[4136>>0]=1;c[4056>>2]=6;c[4060>>2]=6;a[4064>>0]=1;c[4020>>2]=6;c[4024>>2]=6;a[4028>>0]=0;c[4080>>2]=7;c[4084>>2]=7;a[4088>>0]=1;c[4116>>2]=7;c[4120>>2]=7;a[4124>>0]=0;c[4152>>2]=8;c[4156>>2]=8;a[4160>>0]=1;c[4044>>2]=8;c[4048>>2]=8;a[4052>>0]=0;c[4176>>2]=9;c[4180>>2]=9;a[4184>>0]=1;c[4140>>2]=9;c[4144>>2]=9;a[4148>>0]=0;a[4200]=1}j=c[(c[b+12>>2]|0)+4>>2]|0;k=c[(c[e+12>>2]|0)+4>>2]|0;if(!(j>>>0<4)){xa(4208,4256,80,4344)}if(!(k>>>0<4)){xa(4296,4256,81,4344)}l=c[4008+(j*48|0)+(k*12|0)>>2]|0;if((l|0)==0){l=0;i=h;return l|0}if((a[4008+(j*48|0)+(k*12|0)+8>>0]|0)==0){l=qb[l&15](e,f,b,d,g)|0;i=h;return l|0}else{l=qb[l&15](b,d,e,f,g)|0;i=h;return l|0}return 0}function md(d,f){d=d|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0;h=i;if((a[4200]|0)==0){xa(4352,4256,103,4376)}j=c[d+48>>2]|0;if((c[d+124>>2]|0)>0){m=c[j+8>>2]|0;l=m+4|0;k=e[l>>1]|0;if((k&2|0)==0){b[l>>1]=k|2;g[m+144>>2]=0.0}m=c[d+52>>2]|0;l=c[m+8>>2]|0;k=l+4|0;n=e[k>>1]|0;if((n&2|0)==0){b[k>>1]=n|2;g[l+144>>2]=0.0}}else{m=c[d+52>>2]|0}j=c[(c[j+12>>2]|0)+4>>2]|0;k=c[(c[m+12>>2]|0)+4>>2]|0;if((j|0)>-1&(k|0)<4){jb[c[4008+(j*48|0)+(k*12|0)+4>>2]&15](d,f);i=h;return}else{xa(4384,4256,114,4376)}}function nd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0.0,l=0.0;h=i;c[a>>2]=4440;c[a+4>>2]=4;c[a+48>>2]=b;c[a+52>>2]=e;c[a+56>>2]=d;c[a+60>>2]=f;c[a+124>>2]=0;c[a+128>>2]=0;f=b+16|0;d=a+8|0;j=d+40|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(j|0));g[a+136>>2]=+O(+(+g[f>>2]*+g[e+16>>2]));k=+g[b+20>>2];l=+g[e+20>>2];g[a+140>>2]=k>l?k:l;i=h;return}function od(d,f){d=d|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;j=i;i=i+64|0;h=j;p=d+64|0;l=h+0|0;m=p+0|0;k=l+64|0;do{c[l>>2]=c[m>>2];l=l+4|0;m=m+4|0}while((l|0)<(k|0));l=d+4|0;q=c[l>>2]|0;c[l>>2]=q|4;q=q>>>1;t=c[d+48>>2]|0;u=c[d+52>>2]|0;k=(a[u+38>>0]|a[t+38>>0])<<24>>24!=0;n=c[t+8>>2]|0;m=c[u+8>>2]|0;r=n+12|0;s=m+12|0;if(!k){rb[c[c[d>>2]>>2]&15](d,p,r,s);r=d+124|0;p=(c[r>>2]|0)>0;a:do{if(p){y=c[h+60>>2]|0;if((y|0)>0){x=0}else{o=0;while(1){g[d+(o*20|0)+72>>2]=0.0;g[d+(o*20|0)+76>>2]=0.0;o=o+1|0;if((o|0)>=(c[r>>2]|0)){break a}}}do{v=d+(x*20|0)+72|0;g[v>>2]=0.0;u=d+(x*20|0)+76|0;g[u>>2]=0.0;t=c[d+(x*20|0)+80>>2]|0;w=0;while(1){s=w+1|0;if((c[h+(w*20|0)+16>>2]|0)==(t|0)){o=7;break}if((s|0)<(y|0)){w=s}else{break}}if((o|0)==7){o=0;g[v>>2]=+g[h+(w*20|0)+8>>2];g[u>>2]=+g[h+(w*20|0)+12>>2]}x=x+1|0}while((x|0)<(c[r>>2]|0))}}while(0);o=q&1;if(p^(o|0)!=0){q=n+4|0;r=e[q>>1]|0;if((r&2|0)==0){b[q>>1]=r|2;g[n+144>>2]=0.0}n=m+4|0;q=e[n>>1]|0;if((q&2|0)==0){b[n>>1]=q|2;g[m+144>>2]=0.0}}}else{p=_d(c[t+12>>2]|0,c[d+56>>2]|0,c[u+12>>2]|0,c[d+60>>2]|0,r,s)|0;c[d+124>>2]=0;o=q&1}m=c[l>>2]|0;c[l>>2]=p?m|2:m&-3;n=(o|0)==0;l=p^1;m=(f|0)==0;if(!(n^1|l|m)){jb[c[(c[f>>2]|0)+8>>2]&15](f,d)}if(!(n|p|m)){jb[c[(c[f>>2]|0)+12>>2]&15](f,d)}if(k|l|m){i=j;return}lb[c[(c[f>>2]|0)+16>>2]&3](f,d,h);i=j;return}function pd(a){a=a|0;return}function qd(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function rd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;b=i;f=Xb(f,144)|0;if((f|0)==0){e=0;i=b;return e|0}nd(f,a,0,d,0);c[f>>2]=4488;if((c[(c[(c[f+48>>2]|0)+12>>2]|0)+4>>2]|0)!=1){xa(4504,4552,41,4608)}if((c[(c[(c[f+52>>2]|0)+12>>2]|0)+4>>2]|0)==0){e=f;i=b;return e|0}else{xa(4632,4552,42,4608)}return 0}function sd(a,b){a=a|0;b=b|0;var d=0;d=i;ib[c[(c[a>>2]|0)+4>>2]&31](a);Yb(b,a,144);i=d;return}function td(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=i;Rd(b,c[(c[a+48>>2]|0)+12>>2]|0,d,c[(c[a+52>>2]|0)+12>>2]|0,e);i=f;return}function ud(a){a=a|0;return}function vd(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function wd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;b=i;f=Xb(f,144)|0;if((f|0)==0){e=0;i=b;return e|0}nd(f,a,0,d,0);c[f>>2]=4736;if((c[(c[(c[f+48>>2]|0)+12>>2]|0)+4>>2]|0)!=1){xa(4752,4800,41,4856)}if((c[(c[(c[f+52>>2]|0)+12>>2]|0)+4>>2]|0)==2){e=f;i=b;return e|0}else{xa(4880,4800,42,4856)}return 0}function xd(a,b){a=a|0;b=b|0;var d=0;d=i;ib[c[(c[a>>2]|0)+4>>2]&31](a);Yb(b,a,144);i=d;return}function yd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=i;Ud(b,c[(c[a+48>>2]|0)+12>>2]|0,d,c[(c[a+52>>2]|0)+12>>2]|0,e);i=f;return}function zd(a){a=a|0;return}function Ad(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function Bd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;b=i;f=Xb(f,144)|0;if((f|0)==0){e=0;i=b;return e|0}nd(f,a,0,d,0);c[f>>2]=4984;if((c[(c[(c[f+48>>2]|0)+12>>2]|0)+4>>2]|0)!=2){xa(5e3,5048,41,5104)}if((c[(c[(c[f+52>>2]|0)+12>>2]|0)+4>>2]|0)==0){e=f;i=b;return e|0}else{xa(5136,5048,42,5104)}return 0}function Cd(a,b){a=a|0;b=b|0;var d=0;d=i;ib[c[(c[a>>2]|0)+4>>2]&31](a);Yb(b,a,144);i=d;return}function Dd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=i;Qd(b,c[(c[a+48>>2]|0)+12>>2]|0,d,c[(c[a+52>>2]|0)+12>>2]|0,e);i=f;return}function Ed(a){a=a|0;return}function Fd(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function Gd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;b=i;f=Xb(f,144)|0;if((f|0)==0){e=0;i=b;return e|0}nd(f,a,0,d,0);c[f>>2]=5240;if((c[(c[(c[f+48>>2]|0)+12>>2]|0)+4>>2]|0)!=2){xa(5256,5304,44,5352)}if((c[(c[(c[f+52>>2]|0)+12>>2]|0)+4>>2]|0)==2){e=f;i=b;return e|0}else{xa(5376,5304,45,5352)}return 0}function Hd(a,b){a=a|0;b=b|0;var d=0;d=i;ib[c[(c[a>>2]|0)+4>>2]&31](a);Yb(b,a,144);i=d;return}function Id(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=i;Vd(b,c[(c[a+48>>2]|0)+12>>2]|0,d,c[(c[a+52>>2]|0)+12>>2]|0,e);i=f;return}function Jd(a){a=a|0;return}function Kd(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function Ld(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0;h=i;j=a+40|0;c[j>>2]=b;c[a+44>>2]=d;c[a+48>>2]=e;c[a+28>>2]=0;c[a+36>>2]=0;c[a+32>>2]=0;c[a>>2]=f;c[a+4>>2]=g;c[a+8>>2]=gd(f,b<<2)|0;c[a+12>>2]=gd(c[a>>2]|0,d<<2)|0;c[a+16>>2]=gd(c[a>>2]|0,e<<2)|0;c[a+24>>2]=gd(c[a>>2]|0,(c[j>>2]|0)*12|0)|0;c[a+20>>2]=gd(c[a>>2]|0,(c[j>>2]|0)*12|0)|0;i=h;return}function Md(a){a=a|0;var b=0;b=i;hd(c[a>>2]|0,c[a+20>>2]|0);hd(c[a>>2]|0,c[a+24>>2]|0);hd(c[a>>2]|0,c[a+16>>2]|0);hd(c[a>>2]|0,c[a+12>>2]|0);hd(c[a>>2]|0,c[a+8>>2]|0);i=b;return}function Nd(d,e,f,h,j){d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0;n=i;i=i+160|0;p=n+128|0;q=n+148|0;r=n+96|0;w=n+52|0;m=n;id(q);o=+g[f>>2];l=d+28|0;if((c[l>>2]|0)>0){t=d+8|0;s=h+4|0;u=d+20|0;v=d+24|0;y=0;do{B=c[(c[t>>2]|0)+(y<<2)>>2]|0;x=B+44|0;z=c[x>>2]|0;x=c[x+4>>2]|0;A=+g[B+56>>2];J=B+64|0;G=+g[J>>2];D=+g[J+4>>2];C=+g[B+72>>2];J=B+36|0;c[J>>2]=z;c[J+4>>2]=x;g[B+52>>2]=A;if((c[B>>2]|0)==2){E=+g[B+140>>2];F=+g[B+120>>2];H=1.0-o*+g[B+132>>2];H=H<1.0?H:1.0;H=H<0.0?0.0:H;I=1.0-o*+g[B+136>>2];I=I<1.0?I:1.0;G=(G+o*(E*+g[h>>2]+F*+g[B+76>>2]))*H;D=(D+o*(E*+g[s>>2]+F*+g[B+80>>2]))*H;C=(C+o*+g[B+128>>2]*+g[B+84>>2])*(I<0.0?0.0:I)}J=(c[u>>2]|0)+(y*12|0)|0;c[J>>2]=z;c[J+4>>2]=x;g[(c[u>>2]|0)+(y*12|0)+8>>2]=A;H=+G;I=+D;J=(c[v>>2]|0)+(y*12|0)|0;g[J>>2]=H;g[J+4>>2]=I;g[(c[v>>2]|0)+(y*12|0)+8>>2]=C;y=y+1|0}while((y|0)<(c[l>>2]|0))}else{u=d+20|0;v=d+24|0}c[r+0>>2]=c[f+0>>2];c[r+4>>2]=c[f+4>>2];c[r+8>>2]=c[f+8>>2];c[r+12>>2]=c[f+12>>2];c[r+16>>2]=c[f+16>>2];c[r+20>>2]=c[f+20>>2];B=c[u>>2]|0;c[r+24>>2]=B;J=c[v>>2]|0;c[r+28>>2]=J;c[w+0>>2]=c[f+0>>2];c[w+4>>2]=c[f+4>>2];c[w+8>>2]=c[f+8>>2];c[w+12>>2]=c[f+12>>2];c[w+16>>2]=c[f+16>>2];c[w+20>>2]=c[f+20>>2];t=d+12|0;c[w+24>>2]=c[t>>2];s=d+36|0;c[w+28>>2]=c[s>>2];c[w+32>>2]=B;c[w+36>>2]=J;c[w+40>>2]=c[d>>2];oe(m,w);qe(m);if((a[f+20>>0]|0)!=0){re(m)}w=d+32|0;if((c[w>>2]|0)>0){x=d+16|0;h=0;do{J=c[(c[x>>2]|0)+(h<<2)>>2]|0;jb[c[(c[J>>2]|0)+28>>2]&15](J,r);h=h+1|0}while((h|0)<(c[w>>2]|0))}g[e+12>>2]=+kd(q);h=f+12|0;if((c[h>>2]|0)>0){z=d+16|0;y=0;do{if((c[w>>2]|0)>0){x=0;do{J=c[(c[z>>2]|0)+(x<<2)>>2]|0;jb[c[(c[J>>2]|0)+32>>2]&15](J,r);x=x+1|0}while((x|0)<(c[w>>2]|0))}se(m);y=y+1|0}while((y|0)<(c[h>>2]|0))}te(m);g[e+16>>2]=+kd(q);if((c[l>>2]|0)>0){y=c[v>>2]|0;x=0;do{J=c[u>>2]|0;h=J+(x*12|0)|0;B=h;C=+g[B>>2];A=+g[B+4>>2];D=+g[J+(x*12|0)+8>>2];J=y+(x*12|0)|0;F=+g[J>>2];G=+g[J+4>>2];E=+g[y+(x*12|0)+8>>2];I=o*F;H=o*G;H=I*I+H*H;if(H>4.0){I=2.0/+O(+H);F=F*I;G=G*I}H=o*E;if(H*H>2.4674012660980225){if(!(H>0.0)){H=-H}E=E*(1.5707963705062866/H)}I=+(C+o*F);H=+(A+o*G);y=h;g[y>>2]=I;g[y+4>>2]=H;g[(c[u>>2]|0)+(x*12|0)+8>>2]=D+o*E;H=+F;I=+G;y=(c[v>>2]|0)+(x*12|0)|0;g[y>>2]=H;g[y+4>>2]=I;y=c[v>>2]|0;g[y+(x*12|0)+8>>2]=E;x=x+1|0}while((x|0)<(c[l>>2]|0))}f=f+16|0;a:do{if((c[f>>2]|0)>0){h=d+16|0;y=0;while(1){x=ue(m)|0;if((c[w>>2]|0)>0){z=0;B=1;do{J=c[(c[h>>2]|0)+(z<<2)>>2]|0;B=B&(pb[c[(c[J>>2]|0)+36>>2]&3](J,r)|0);z=z+1|0}while((z|0)<(c[w>>2]|0))}else{B=1}y=y+1|0;if(x&B){r=0;break a}if((y|0)>=(c[f>>2]|0)){r=1;break}}}else{r=1}}while(0);if((c[l>>2]|0)>0){f=d+8|0;w=0;do{J=c[(c[f>>2]|0)+(w<<2)>>2]|0;B=(c[u>>2]|0)+(w*12|0)|0;z=c[B>>2]|0;B=c[B+4>>2]|0;h=J+44|0;c[h>>2]=z;c[h+4>>2]=B;G=+g[(c[u>>2]|0)+(w*12|0)+8>>2];g[J+56>>2]=G;h=(c[v>>2]|0)+(w*12|0)|0;x=c[h+4>>2]|0;y=J+64|0;c[y>>2]=c[h>>2];c[y+4>>2]=x;g[J+72>>2]=+g[(c[v>>2]|0)+(w*12|0)+8>>2];E=+R(+G);g[J+20>>2]=E;G=+Q(+G);g[J+24>>2]=G;F=+g[J+28>>2];I=+g[J+32>>2];H=(c[k>>2]=z,+g[k>>2])-(G*F-E*I);I=(c[k>>2]=B,+g[k>>2])-(E*F+G*I);H=+H;I=+I;J=J+12|0;g[J>>2]=H;g[J+4>>2]=I;w=w+1|0}while((w|0)<(c[l>>2]|0))}g[e+20>>2]=+kd(q);q=c[m+40>>2]|0;e=d+4|0;if((c[e>>2]|0)!=0?(c[s>>2]|0)>0:0){f=p+16|0;u=0;do{v=c[(c[t>>2]|0)+(u<<2)>>2]|0;w=c[q+(u*152|0)+144>>2]|0;c[f>>2]=w;if((w|0)>0){h=0;do{g[p+(h<<2)>>2]=+g[q+(u*152|0)+(h*36|0)+16>>2];g[p+(h<<2)+8>>2]=+g[q+(u*152|0)+(h*36|0)+20>>2];h=h+1|0}while((h|0)!=(w|0))}J=c[e>>2]|0;lb[c[(c[J>>2]|0)+20>>2]&3](J,v,p);u=u+1|0}while((u|0)<(c[s>>2]|0))}if(!j){pe(m);i=n;return}j=c[l>>2]|0;p=(j|0)>0;if(p){e=c[d+8>>2]|0;q=0;A=3.4028234663852886e+38;do{f=c[e+(q<<2)>>2]|0;do{if((c[f>>2]|0)!=0){if((!((b[f+4>>1]&4)==0)?(I=+g[f+72>>2],!(I*I>.001218469929881394)):0)?(H=+g[f+64>>2],I=+g[f+68>>2],!(H*H+I*I>9999999747378752.0e-20)):0){J=f+144|0;C=o+ +g[J>>2];g[J>>2]=C;A=A<C?A:C;break}g[f+144>>2]=0.0;A=0.0}}while(0);q=q+1|0}while((q|0)<(j|0))}else{A=3.4028234663852886e+38}if(!(A>=.5)|r|p^1){pe(m);i=n;return}d=d+8|0;p=0;do{J=c[(c[d>>2]|0)+(p<<2)>>2]|0;B=J+4|0;b[B>>1]=b[B>>1]&65533;g[J+144>>2]=0.0;J=J+64|0;c[J+0>>2]=0;c[J+4>>2]=0;c[J+8>>2]=0;c[J+12>>2]=0;c[J+16>>2]=0;c[J+20>>2]=0;p=p+1|0}while((p|0)<(c[l>>2]|0));pe(m);i=n;return}function Od(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0,A=0,B=0,C=0.0;f=i;i=i+128|0;h=f+96|0;p=f+52|0;j=f;m=a+28|0;k=c[m>>2]|0;if((k|0)<=(d|0)){xa(5464,5488,386,5520)}if((k|0)<=(e|0)){xa(5536,5488,387,5520)}if((k|0)>0){l=a+8|0;n=a+20|0;k=a+24|0;o=0;do{z=c[(c[l>>2]|0)+(o<<2)>>2]|0;y=z+44|0;A=c[y+4>>2]|0;B=(c[n>>2]|0)+(o*12|0)|0;c[B>>2]=c[y>>2];c[B+4>>2]=A;g[(c[n>>2]|0)+(o*12|0)+8>>2]=+g[z+56>>2];B=z+64|0;A=c[B+4>>2]|0;y=(c[k>>2]|0)+(o*12|0)|0;c[y>>2]=c[B>>2];c[y+4>>2]=A;y=c[k>>2]|0;g[y+(o*12|0)+8>>2]=+g[z+72>>2];o=o+1|0}while((o|0)<(c[m>>2]|0))}else{y=c[a+24>>2]|0;n=a+20|0}l=a+12|0;c[p+24>>2]=c[l>>2];k=a+36|0;c[p+28>>2]=c[k>>2];c[p+40>>2]=c[a>>2];c[p+0>>2]=c[b+0>>2];c[p+4>>2]=c[b+4>>2];c[p+8>>2]=c[b+8>>2];c[p+12>>2]=c[b+12>>2];c[p+16>>2]=c[b+16>>2];c[p+20>>2]=c[b+20>>2];c[p+32>>2]=c[n>>2];o=a+24|0;c[p+36>>2]=y;oe(j,p);y=b+16|0;a:do{if((c[y>>2]|0)>0){p=0;do{p=p+1|0;if(we(j,d,e)|0){break a}}while((p|0)<(c[y>>2]|0))}}while(0);p=a+8|0;A=(c[n>>2]|0)+(d*12|0)|0;B=c[A+4>>2]|0;z=(c[(c[p>>2]|0)+(d<<2)>>2]|0)+36|0;c[z>>2]=c[A>>2];c[z+4>>2]=B;z=c[n>>2]|0;B=c[p>>2]|0;g[(c[B+(d<<2)>>2]|0)+52>>2]=+g[z+(d*12|0)+8>>2];z=z+(e*12|0)|0;A=c[z+4>>2]|0;B=(c[B+(e<<2)>>2]|0)+36|0;c[B>>2]=c[z>>2];c[B+4>>2]=A;g[(c[(c[p>>2]|0)+(e<<2)>>2]|0)+52>>2]=+g[(c[n>>2]|0)+(e*12|0)+8>>2];qe(j);e=b+12|0;if((c[e>>2]|0)>0){d=0;do{se(j);d=d+1|0}while((d|0)<(c[e>>2]|0))}s=+g[b>>2];if((c[m>>2]|0)>0){b=0;do{B=c[n>>2]|0;d=B+(b*12|0)|0;A=d;r=+g[A>>2];q=+g[A+4>>2];t=+g[B+(b*12|0)+8>>2];B=c[o>>2]|0;A=B+(b*12|0)|0;v=+g[A>>2];w=+g[A+4>>2];u=+g[B+(b*12|0)+8>>2];C=s*v;x=s*w;x=C*C+x*x;if(x>4.0){C=2.0/+O(+x);v=v*C;w=w*C}x=s*u;if(x*x>2.4674012660980225){if(!(x>0.0)){x=-x}u=u*(1.5707963705062866/x)}x=r+s*v;r=q+s*w;C=t+s*u;q=+x;t=+r;B=d;g[B>>2]=q;g[B+4>>2]=t;g[(c[n>>2]|0)+(b*12|0)+8>>2]=C;v=+v;w=+w;B=(c[o>>2]|0)+(b*12|0)|0;g[B>>2]=v;g[B+4>>2]=w;g[(c[o>>2]|0)+(b*12|0)+8>>2]=u;B=c[(c[p>>2]|0)+(b<<2)>>2]|0;A=B+44|0;g[A>>2]=q;g[A+4>>2]=t;g[B+56>>2]=C;A=B+64|0;g[A>>2]=v;g[A+4>>2]=w;g[B+72>>2]=u;u=+R(+C);g[B+20>>2]=u;w=+Q(+C);g[B+24>>2]=w;v=+g[B+28>>2];C=+g[B+32>>2];x=+(x-(w*v-u*C));C=+(r-(u*v+w*C));B=B+12|0;g[B>>2]=x;g[B+4>>2]=C;b=b+1|0}while((b|0)<(c[m>>2]|0))}m=c[j+40>>2]|0;a=a+4|0;if((c[a>>2]|0)==0){pe(j);i=f;return}if((c[k>>2]|0)<=0){pe(j);i=f;return}n=h+16|0;o=0;do{p=c[(c[l>>2]|0)+(o<<2)>>2]|0;b=c[m+(o*152|0)+144>>2]|0;c[n>>2]=b;if((b|0)>0){d=0;do{g[h+(d<<2)>>2]=+g[m+(o*152|0)+(d*36|0)+16>>2];g[h+(d<<2)+8>>2]=+g[m+(o*152|0)+(d*36|0)+20>>2];d=d+1|0}while((d|0)!=(b|0))}B=c[a>>2]|0;lb[c[(c[B>>2]|0)+20>>2]&3](B,p,h);o=o+1|0}while((o|0)<(c[k>>2]|0));pe(j);i=f;return}function Pd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;h=i;k=a+60|0;c[k>>2]=0;j=b+12|0;m=+g[d+12>>2];q=+g[j>>2];p=+g[d+8>>2];n=+g[b+16>>2];l=e+12|0;s=+g[f+12>>2];u=+g[l>>2];t=+g[f+8>>2];r=+g[e+16>>2];o=+g[f>>2]+(s*u-t*r)-(+g[d>>2]+(m*q-p*n));n=u*t+s*r+ +g[f+4>>2]-(q*p+m*n+ +g[d+4>>2]);m=+g[b+8>>2]+ +g[e+8>>2];if(o*o+n*n>m*m){i=h;return}c[a+56>>2]=0;f=j;d=c[f+4>>2]|0;b=a+48|0;c[b>>2]=c[f>>2];c[b+4>>2]=d;g[a+40>>2]=0.0;g[a+44>>2]=0.0;c[k>>2]=1;b=l;d=c[b+4>>2]|0;f=a;c[f>>2]=c[b>>2];c[f+4>>2]=d;c[a+16>>2]=0;i=h;return}
+
+
+
+function Qd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,l=0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0;j=i;l=a+60|0;c[l>>2]=0;h=e+12|0;x=+g[f+12>>2];n=+g[h>>2];m=+g[f+8>>2];y=+g[e+16>>2];o=+g[f>>2]+(x*n-m*y)- +g[d>>2];y=n*m+x*y+ +g[f+4>>2]- +g[d+4>>2];x=+g[d+12>>2];m=+g[d+8>>2];n=o*x+y*m;m=x*y-o*m;o=+g[b+8>>2]+ +g[e+8>>2];p=c[b+148>>2]|0;do{if((p|0)>0){f=0;e=0;q=-3.4028234663852886e+38;while(1){r=(n- +g[b+(f<<3)+20>>2])*+g[b+(f<<3)+84>>2]+(m- +g[b+(f<<3)+24>>2])*+g[b+(f<<3)+88>>2];if(r>o){f=19;break}d=r>q;q=d?r:q;e=d?f:e;f=f+1|0;if((f|0)>=(p|0)){f=4;break}}if((f|0)==4){z=q<1.1920928955078125e-7;break}else if((f|0)==19){i=j;return}}else{e=0;z=1}}while(0);s=e+1|0;d=b+(e<<3)+20|0;f=c[d>>2]|0;d=c[d+4>>2]|0;r=(c[k>>2]=f,+g[k>>2]);q=(c[k>>2]=d,+g[k>>2]);p=b+(((s|0)<(p|0)?s:0)<<3)+20|0;s=c[p>>2]|0;p=c[p+4>>2]|0;y=(c[k>>2]=s,+g[k>>2]);v=(c[k>>2]=p,+g[k>>2]);if(z){c[l>>2]=1;c[a+56>>2]=1;z=b+(e<<3)+84|0;s=c[z+4>>2]|0;p=a+40|0;c[p>>2]=c[z>>2];c[p+4>>2]=s;x=+((r+y)*.5);y=+((q+v)*.5);p=a+48|0;g[p>>2]=x;g[p+4>>2]=y;p=h;s=c[p+4>>2]|0;z=a;c[z>>2]=c[p>>2];c[z+4>>2]=s;c[a+16>>2]=0;i=j;return}t=n-r;x=m-q;w=n-y;u=m-v;if(t*(y-r)+x*(v-q)<=0.0){if(t*t+x*x>o*o){i=j;return}c[l>>2]=1;c[a+56>>2]=1;b=a+40|0;y=+t;m=+x;z=b;g[z>>2]=y;g[z+4>>2]=m;m=+O(+(t*t+x*x));if(!(m<1.1920928955078125e-7)){y=1.0/m;g[b>>2]=t*y;g[a+44>>2]=x*y}p=a+48|0;c[p>>2]=f;c[p+4>>2]=d;p=h;s=c[p+4>>2]|0;z=a;c[z>>2]=c[p>>2];c[z+4>>2]=s;c[a+16>>2]=0;i=j;return}if(!(w*(r-y)+u*(q-v)<=0.0)){r=(r+y)*.5;q=(q+v)*.5;f=b+(e<<3)+84|0;if((n-r)*+g[f>>2]+(m-q)*+g[b+(e<<3)+88>>2]>o){i=j;return}c[l>>2]=1;c[a+56>>2]=1;z=f;s=c[z+4>>2]|0;p=a+40|0;c[p>>2]=c[z>>2];c[p+4>>2]=s;x=+r;y=+q;p=a+48|0;g[p>>2]=x;g[p+4>>2]=y;p=h;s=c[p+4>>2]|0;z=a;c[z>>2]=c[p>>2];c[z+4>>2]=s;c[a+16>>2]=0;i=j;return}if(w*w+u*u>o*o){i=j;return}c[l>>2]=1;c[a+56>>2]=1;b=a+40|0;y=+w;m=+u;z=b;g[z>>2]=y;g[z+4>>2]=m;m=+O(+(w*w+u*u));if(!(m<1.1920928955078125e-7)){y=1.0/m;g[b>>2]=w*y;g[a+44>>2]=u*y}z=a+48|0;c[z>>2]=s;c[z+4>>2]=p;p=h;s=c[p+4>>2]|0;z=a;c[z>>2]=c[p>>2];c[z+4>>2]=s;c[a+16>>2]=0;i=j;return}function Rd(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0;m=i;j=b+60|0;c[j>>2]=0;l=f+12|0;o=+g[h+12>>2];B=+g[l>>2];w=+g[h+8>>2];x=+g[f+16>>2];A=+g[h>>2]+(o*B-w*x)- +g[e>>2];x=B*w+o*x+ +g[h+4>>2]- +g[e+4>>2];o=+g[e+12>>2];w=+g[e+8>>2];B=A*o+x*w;w=o*x-A*w;e=d+12|0;h=c[e>>2]|0;e=c[e+4>>2]|0;A=(c[k>>2]=h,+g[k>>2]);x=(c[k>>2]=e,+g[k>>2]);u=d+20|0;t=c[u>>2]|0;u=c[u+4>>2]|0;o=(c[k>>2]=t,+g[k>>2]);p=(c[k>>2]=u,+g[k>>2]);n=o-A;v=p-x;y=n*(o-B)+v*(p-w);s=B-A;r=w-x;z=s*n+r*v;q=+g[d+8>>2]+ +g[f+8>>2];if(z<=0.0){if(s*s+r*r>q*q){i=m;return}if((a[d+44>>0]|0)!=0?(f=d+28|0,C=+g[f>>2],(A-B)*(A-C)+(x-w)*(x- +g[f+4>>2])>0.0):0){i=m;return}c[j>>2]=1;c[b+56>>2]=0;g[b+40>>2]=0.0;g[b+44>>2]=0.0;t=b+48|0;c[t>>2]=h;c[t+4>>2]=e;t=b+16|0;c[t>>2]=0;a[t>>0]=0;a[t+1>>0]=0;a[t+2>>0]=0;a[t+3>>0]=0;t=l;u=c[t+4>>2]|0;f=b;c[f>>2]=c[t>>2];c[f+4>>2]=u;i=m;return}if(y<=0.0){n=B-o;r=w-p;if(n*n+r*r>q*q){i=m;return}if((a[d+45>>0]|0)!=0?(f=d+36|0,C=+g[f>>2],n*(C-o)+r*(+g[f+4>>2]-p)>0.0):0){i=m;return}c[j>>2]=1;c[b+56>>2]=0;g[b+40>>2]=0.0;g[b+44>>2]=0.0;f=b+48|0;c[f>>2]=t;c[f+4>>2]=u;t=b+16|0;c[t>>2]=0;a[t>>0]=1;a[t+1>>0]=0;a[t+2>>0]=0;a[t+3>>0]=0;t=l;u=c[t+4>>2]|0;f=b;c[f>>2]=c[t>>2];c[f+4>>2]=u;i=m;return}C=n*n+v*v;if(!(C>0.0)){xa(5560,5576,127,5616)}C=1.0/C;B=B-(A*y+o*z)*C;C=w-(x*y+p*z)*C;if(B*B+C*C>q*q){i=m;return}o=-v;if(n*r+s*o<0.0){n=-n}else{v=o}o=+O(+(n*n+v*v));if(!(o<1.1920928955078125e-7)){C=1.0/o;v=v*C;n=n*C}c[j>>2]=1;c[b+56>>2]=1;B=+v;C=+n;t=b+40|0;g[t>>2]=B;g[t+4>>2]=C;t=b+48|0;c[t>>2]=h;c[t+4>>2]=e;t=b+16|0;c[t>>2]=0;a[t>>0]=0;a[t+1>>0]=0;a[t+2>>0]=1;a[t+3>>0]=0;t=l;u=c[t+4>>2]|0;f=b;c[f>>2]=c[t>>2];c[f+4>>2]=u;i=m;return}function Sd(b,d,e,f,h,j){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0,N=0,P=0.0,Q=0.0,R=0,S=0.0,T=0,U=0;l=i;i=i+144|0;w=l+128|0;r=l+24|0;p=l+72|0;q=l+48|0;m=l;n=b+132|0;G=+g[f+12>>2];Q=+g[j+8>>2];B=+g[f+8>>2];F=+g[j+12>>2];A=G*Q-B*F;F=Q*B+G*F;Q=+A;E=+F;D=+g[j>>2]- +g[f>>2];P=+g[j+4>>2]- +g[f+4>>2];C=G*D+B*P;D=G*P-B*D;B=+C;P=+D;f=n;g[f>>2]=B;g[f+4>>2]=P;f=b+140|0;g[f>>2]=Q;g[f+4>>2]=E;f=b+144|0;E=+g[h+12>>2];o=b+140|0;Q=+g[h+16>>2];C=C+(F*E-A*Q);j=b+136|0;D=E*A+F*Q+D;Q=+C;F=+D;M=b+148|0;g[M>>2]=Q;g[M+4>>2]=F;M=e+28|0;H=c[M>>2]|0;M=c[M+4>>2]|0;t=b+156|0;c[t>>2]=H;c[t+4>>2]=M;t=b+164|0;v=e+12|0;T=c[v>>2]|0;v=c[v+4>>2]|0;s=t;c[s>>2]=T;c[s+4>>2]=v;s=b+172|0;y=e+20|0;U=c[y>>2]|0;y=c[y+4>>2]|0;R=s;c[R>>2]=U;c[R+4>>2]=y;R=e+36|0;N=c[R>>2]|0;R=c[R+4>>2]|0;x=b+180|0;c[x>>2]=N;c[x+4>>2]=R;x=(a[e+44>>0]|0)!=0;z=(a[e+45>>0]|0)!=0;F=(c[k>>2]=U,+g[k>>2]);Q=(c[k>>2]=T,+g[k>>2]);A=F-Q;E=(c[k>>2]=y,+g[k>>2]);y=b+168|0;P=(c[k>>2]=v,+g[k>>2]);B=E-P;G=+O(+(A*A+B*B));L=(c[k>>2]=H,+g[k>>2]);K=(c[k>>2]=M,+g[k>>2]);J=(c[k>>2]=N,+g[k>>2]);I=(c[k>>2]=R,+g[k>>2]);if(!(G<1.1920928955078125e-7)){S=1.0/G;B=B*S;A=A*S}e=b+196|0;G=-A;g[e>>2]=B;v=b+200|0;g[v>>2]=G;G=(C-Q)*B+(D-P)*G;if(x){Q=Q-L;P=P-K;S=+O(+(Q*Q+P*P));if(!(S<1.1920928955078125e-7)){S=1.0/S;Q=Q*S;P=P*S}S=-Q;g[b+188>>2]=P;g[b+192>>2]=S;H=B*Q-A*P>=0.0;K=(C-L)*P+(D-K)*S}else{H=0;K=0.0}a:do{if(!z){if(!x){U=G>=0.0;a[b+248>>0]=U&1;x=b+212|0;if(U){u=64;break}else{u=65;break}}x=K>=0.0;if(H){if(!x){U=G>=0.0;a[b+248>>0]=U&1;x=b+212|0;if(!U){Q=+-B;S=+A;R=x;g[R>>2]=Q;g[R+4>>2]=S;R=e;T=c[R>>2]|0;R=c[R+4>>2]|0;U=b+228|0;c[U>>2]=T;c[U+4>>2]=R;U=b+236|0;g[U>>2]=-(c[k>>2]=T,+g[k>>2]);g[U+4>>2]=S;break}}else{a[b+248>>0]=1;x=b+212|0}U=e;T=c[U+4>>2]|0;R=x;c[R>>2]=c[U>>2];c[R+4>>2]=T;R=b+188|0;T=c[R+4>>2]|0;U=b+228|0;c[U>>2]=c[R>>2];c[U+4>>2]=T;Q=+-+g[e>>2];S=+-+g[v>>2];U=b+236|0;g[U>>2]=Q;g[U+4>>2]=S;break}else{if(x){U=G>=0.0;a[b+248>>0]=U&1;x=b+212|0;if(U){R=e;U=c[R>>2]|0;R=c[R+4>>2]|0;T=x;c[T>>2]=U;c[T+4>>2]=R;T=b+228|0;c[T>>2]=U;c[T+4>>2]=R;Q=+-(c[k>>2]=U,+g[k>>2]);S=+A;U=b+236|0;g[U>>2]=Q;g[U+4>>2]=S;break}}else{a[b+248>>0]=0;x=b+212|0}S=+-B;Q=+A;R=x;g[R>>2]=S;g[R+4>>2]=Q;R=e;T=c[R+4>>2]|0;U=b+228|0;c[U>>2]=c[R>>2];c[U+4>>2]=T;Q=+-+g[b+188>>2];S=+-+g[b+192>>2];U=b+236|0;g[U>>2]=Q;g[U+4>>2]=S;break}}else{L=J-F;J=I-E;I=+O(+(L*L+J*J));if(I<1.1920928955078125e-7){I=L}else{S=1.0/I;I=L*S;J=J*S}S=-I;M=b+204|0;g[M>>2]=J;N=b+208|0;g[N>>2]=S;R=A*J-B*I>0.0;C=(C-F)*J+(D-E)*S;if(!x){x=G>=0.0;if(!z){a[b+248>>0]=x&1;u=b+212|0;if(x){x=u;u=64;break}else{x=u;u=65;break}}if(R){if(!x){U=C>=0.0;a[b+248>>0]=U&1;x=b+212|0;if(!U){Q=+-B;S=+A;R=x;g[R>>2]=Q;g[R+4>>2]=S;R=b+228|0;g[R>>2]=Q;g[R+4>>2]=S;R=e;T=c[R+4>>2]|0;U=b+236|0;c[U>>2]=c[R>>2];c[U+4>>2]=T;break}}else{a[b+248>>0]=1;x=b+212|0}U=e;T=c[U+4>>2]|0;R=x;c[R>>2]=c[U>>2];c[R+4>>2]=T;Q=+-+g[e>>2];S=+-+g[v>>2];R=b+228|0;g[R>>2]=Q;g[R+4>>2]=S;R=b+204|0;T=c[R+4>>2]|0;U=b+236|0;c[U>>2]=c[R>>2];c[U+4>>2]=T;break}else{if(x){U=C>=0.0;a[b+248>>0]=U&1;x=b+212|0;if(U){T=e;R=c[T>>2]|0;T=c[T+4>>2]|0;U=x;c[U>>2]=R;c[U+4>>2]=T;Q=+-(c[k>>2]=R,+g[k>>2]);S=+A;U=b+228|0;g[U>>2]=Q;g[U+4>>2]=S;U=b+236|0;c[U>>2]=R;c[U+4>>2]=T;break}}else{a[b+248>>0]=0;x=b+212|0}S=+-B;Q=+A;R=x;g[R>>2]=S;g[R+4>>2]=Q;Q=+-+g[b+204>>2];S=+-+g[b+208>>2];R=b+228|0;g[R>>2]=Q;g[R+4>>2]=S;R=e;T=c[R+4>>2]|0;U=b+236|0;c[U>>2]=c[R>>2];c[U+4>>2]=T;break}}if(H&R){if(!(K>=0.0)&!(G>=0.0)){U=C>=0.0;a[b+248>>0]=U&1;x=b+212|0;if(!U){Q=+-B;S=+A;U=x;g[U>>2]=Q;g[U+4>>2]=S;U=b+228|0;g[U>>2]=Q;g[U+4>>2]=S;U=b+236|0;g[U>>2]=Q;g[U+4>>2]=S;break}}else{a[b+248>>0]=1;x=b+212|0}R=e;T=c[R+4>>2]|0;U=x;c[U>>2]=c[R>>2];c[U+4>>2]=T;U=b+188|0;T=c[U+4>>2]|0;R=b+228|0;c[R>>2]=c[U>>2];c[R+4>>2]=T;R=b+204|0;T=c[R+4>>2]|0;U=b+236|0;c[U>>2]=c[R>>2];c[U+4>>2]=T;break}if(H){do{if(!(K>=0.0)){if(G>=0.0){U=C>=0.0;a[b+248>>0]=U&1;x=b+212|0;if(U){break}}else{a[b+248>>0]=0;x=b+212|0}Q=+-B;S=+A;U=x;g[U>>2]=Q;g[U+4>>2]=S;S=+-+g[M>>2];Q=+-+g[N>>2];U=b+228|0;g[U>>2]=S;g[U+4>>2]=Q;Q=+-+g[e>>2];S=+-+g[v>>2];U=b+236|0;g[U>>2]=Q;g[U+4>>2]=S;break a}else{a[b+248>>0]=1;x=b+212|0}}while(0);R=e;T=c[R+4>>2]|0;U=x;c[U>>2]=c[R>>2];c[U+4>>2]=T;U=b+188|0;T=c[U+4>>2]|0;R=b+228|0;c[R>>2]=c[U>>2];c[R+4>>2]=T;R=e;T=c[R+4>>2]|0;U=b+236|0;c[U>>2]=c[R>>2];c[U+4>>2]=T;break}if(!R){if(!(!(K>=0.0)|!(G>=0.0))){U=C>=0.0;a[b+248>>0]=U&1;x=b+212|0;if(U){T=e;R=c[T>>2]|0;T=c[T+4>>2]|0;U=x;c[U>>2]=R;c[U+4>>2]=T;U=b+228|0;c[U>>2]=R;c[U+4>>2]=T;U=b+236|0;c[U>>2]=R;c[U+4>>2]=T;break}}else{a[b+248>>0]=0;x=b+212|0}Q=+-B;S=+A;U=x;g[U>>2]=Q;g[U+4>>2]=S;S=+-+g[M>>2];Q=+-+g[N>>2];U=b+228|0;g[U>>2]=S;g[U+4>>2]=Q;Q=+-+g[b+188>>2];S=+-+g[b+192>>2];U=b+236|0;g[U>>2]=Q;g[U+4>>2]=S;break}do{if(!(C>=0.0)){if(K>=0.0){U=G>=0.0;a[b+248>>0]=U&1;x=b+212|0;if(U){break}}else{a[b+248>>0]=0;x=b+212|0}Q=+-B;S=+A;U=x;g[U>>2]=Q;g[U+4>>2]=S;S=+-+g[e>>2];Q=+-+g[v>>2];U=b+228|0;g[U>>2]=S;g[U+4>>2]=Q;Q=+-+g[b+188>>2];S=+-+g[b+192>>2];U=b+236|0;g[U>>2]=Q;g[U+4>>2]=S;break a}else{a[b+248>>0]=1;x=b+212|0}}while(0);R=e;T=c[R+4>>2]|0;U=x;c[U>>2]=c[R>>2];c[U+4>>2]=T;U=e;T=c[U+4>>2]|0;R=b+228|0;c[R>>2]=c[U>>2];c[R+4>>2]=T;R=b+204|0;T=c[R+4>>2]|0;U=b+236|0;c[U>>2]=c[R>>2];c[U+4>>2]=T}}while(0);if((u|0)==64){R=e;U=c[R>>2]|0;R=c[R+4>>2]|0;T=x;c[T>>2]=U;c[T+4>>2]=R;Q=+-(c[k>>2]=U,+g[k>>2]);S=+A;U=b+228|0;g[U>>2]=Q;g[U+4>>2]=S;U=b+236|0;g[U>>2]=Q;g[U+4>>2]=S}else if((u|0)==65){Q=+-B;S=+A;T=x;g[T>>2]=Q;g[T+4>>2]=S;T=e;R=c[T>>2]|0;T=c[T+4>>2]|0;U=b+228|0;c[U>>2]=R;c[U+4>>2]=T;U=b+236|0;c[U>>2]=R;c[U+4>>2]=T}z=h+148|0;M=b+128|0;c[M>>2]=c[z>>2];if((c[z>>2]|0)>0){x=0;do{L=+g[f>>2];Q=+g[h+(x<<3)+20>>2];S=+g[o>>2];P=+g[h+(x<<3)+24>>2];K=+(+g[n>>2]+(L*Q-S*P));P=+(Q*S+L*P+ +g[j>>2]);U=b+(x<<3)|0;g[U>>2]=K;g[U+4>>2]=P;P=+g[f>>2];K=+g[h+(x<<3)+84>>2];L=+g[o>>2];S=+g[h+(x<<3)+88>>2];Q=+(P*K-L*S);S=+(K*L+P*S);U=b+(x<<3)+64|0;g[U>>2]=Q;g[U+4>>2]=S;x=x+1|0}while((x|0)<(c[z>>2]|0))}z=b+244|0;g[z>>2]=.019999999552965164;x=d+60|0;c[x>>2]=0;H=b+248|0;N=c[M>>2]|0;if((N|0)<=0){i=l;return}B=+g[b+164>>2];E=+g[y>>2];C=+g[b+212>>2];F=+g[b+216>>2];A=3.4028234663852886e+38;y=0;do{D=C*(+g[b+(y<<3)>>2]-B)+F*(+g[b+(y<<3)+4>>2]-E);A=D<A?D:A;y=y+1|0}while((y|0)!=(N|0));if(A>.019999999552965164){i=l;return}Td(w,b);y=c[w>>2]|0;if((y|0)!=0){B=+g[w+8>>2];if(B>+g[z>>2]){i=l;return}if(B>A*.9800000190734863+.0010000000474974513){w=c[w+4>>2]|0;N=d+56|0;if((y|0)==1){w=r;u=77}else{c[N>>2]=2;T=t;U=c[T+4>>2]|0;R=r;c[R>>2]=c[T>>2];c[R+4>>2]=U;R=r+8|0;a[R>>0]=0;U=w&255;a[R+1>>0]=U;a[R+2>>0]=0;a[R+3>>0]=1;R=s;T=c[R+4>>2]|0;s=r+12|0;c[s>>2]=c[R>>2];c[s+4>>2]=T;s=r+20|0;a[s>>0]=0;a[s+1>>0]=U;a[s+2>>0]=0;a[s+3>>0]=1;c[p>>2]=w;s=w+1|0;v=(s|0)<(c[M>>2]|0)?s:0;c[p+4>>2]=v;y=b+(w<<3)|0;t=c[y>>2]|0;y=c[y+4>>2]|0;M=p+8|0;c[M>>2]=t;c[M+4>>2]=y;v=b+(v<<3)|0;M=c[v>>2]|0;v=c[v+4>>2]|0;H=p+16|0;c[H>>2]=M;c[H+4>>2]=v;H=b+(w<<3)+64|0;b=c[H>>2]|0;H=c[H+4>>2]|0;s=p+24|0;c[s>>2]=b;c[s+4>>2]=H;s=w;e=0}}else{u=75}}else{u=75}if((u|0)==75){w=r;N=d+56|0;u=77}do{if((u|0)==77){c[N>>2]=1;u=c[M>>2]|0;if((u|0)>1){B=+g[b+216>>2];A=+g[b+212>>2];M=0;C=A*+g[b+64>>2]+B*+g[b+68>>2];N=1;while(1){D=A*+g[b+(N<<3)+64>>2]+B*+g[b+(N<<3)+68>>2];y=D<C;M=y?N:M;N=N+1|0;if((N|0)<(u|0)){C=y?D:C}else{break}}}else{M=0}y=M+1|0;T=(y|0)<(u|0)?y:0;U=b+(M<<3)|0;R=c[U+4>>2]|0;N=r;c[N>>2]=c[U>>2];c[N+4>>2]=R;N=r+8|0;a[N>>0]=0;a[N+1>>0]=M;a[N+2>>0]=1;a[N+3>>0]=0;N=b+(T<<3)|0;R=c[N+4>>2]|0;U=r+12|0;c[U>>2]=c[N>>2];c[U+4>>2]=R;U=r+20|0;a[U>>0]=0;a[U+1>>0]=T;a[U+2>>0]=1;a[U+3>>0]=0;if((a[H>>0]|0)==0){c[p>>2]=1;c[p+4>>2]=0;y=s;s=c[y>>2]|0;y=c[y+4>>2]|0;M=p+8|0;c[M>>2]=s;c[M+4>>2]=y;M=c[t>>2]|0;t=c[t+4>>2]|0;b=p+16|0;c[b>>2]=M;c[b+4>>2]=t;b=(g[k>>2]=-+g[e>>2],c[k>>2]|0);H=(g[k>>2]=-+g[v>>2],c[k>>2]|0);v=p+24|0;c[v>>2]=b;c[v+4>>2]=H;v=t;t=s;s=1;r=w;e=1;break}else{c[p>>2]=0;c[p+4>>2]=1;y=t;t=c[y>>2]|0;y=c[y+4>>2]|0;v=p+8|0;c[v>>2]=t;c[v+4>>2]=y;v=s;M=c[v>>2]|0;v=c[v+4>>2]|0;H=p+16|0;c[H>>2]=M;c[H+4>>2]=v;H=e;b=c[H>>2]|0;H=c[H+4>>2]|0;s=p+24|0;c[s>>2]=b;c[s+4>>2]=H;s=0;r=w;e=1;break}}}while(0);I=(c[k>>2]=H,+g[k>>2]);S=(c[k>>2]=b,+g[k>>2]);J=(c[k>>2]=t,+g[k>>2]);K=(c[k>>2]=y,+g[k>>2]);L=(c[k>>2]=M,+g[k>>2]);Q=(c[k>>2]=v,+g[k>>2]);U=p+32|0;v=p+24|0;t=p+28|0;S=-S;g[U>>2]=I;g[p+36>>2]=S;y=p+44|0;P=-I;w=y;g[w>>2]=P;c[w+4>>2]=b;w=p+8|0;u=p+12|0;S=I*J+K*S;g[p+40>>2]=S;H=p+52|0;g[H>>2]=L*P+(c[k>>2]=b,+g[k>>2])*Q;if((Zd(q,r,U,S,s)|0)<2){i=l;return}if((Zd(m,q,y,+g[H>>2],c[p+4>>2]|0)|0)<2){i=l;return}q=d+40|0;if(e){T=v;U=c[T>>2]|0;T=c[T+4>>2]|0;N=q;c[N>>2]=U;c[N+4>>2]=T;N=w;T=c[N>>2]|0;N=c[N+4>>2]|0;R=d+48|0;c[R>>2]=T;c[R+4>>2]=N;B=(c[k>>2]=T,+g[k>>2]);A=(c[k>>2]=U,+g[k>>2]);C=+g[u>>2];D=+g[t>>2];G=+g[m>>2];F=+g[m+4>>2];E=+g[z>>2];if(!((G-B)*A+(F-C)*D<=E)){G=E;h=0}else{Q=G- +g[n>>2];P=F- +g[j>>2];L=+g[f>>2];G=+g[o>>2];S=+(Q*L+P*G);G=+(L*P-Q*G);h=d;g[h>>2]=S;g[h+4>>2]=G;c[d+16>>2]=c[m+8>>2];G=+g[z>>2];h=1}E=+g[m+12>>2];F=+g[m+16>>2];if((E-B)*A+(F-C)*D<=G){P=E- +g[n>>2];L=F- +g[j>>2];K=+g[f>>2];S=+g[o>>2];Q=+(P*K+L*S);S=+(K*L-P*S);U=d+(h*20|0)|0;g[U>>2]=Q;g[U+4>>2]=S;c[d+(h*20|0)+16>>2]=c[m+20>>2];h=h+1|0}}else{R=c[p>>2]|0;N=h+(R<<3)+84|0;U=c[N+4>>2]|0;T=q;c[T>>2]=c[N>>2];c[T+4>>2]=U;R=h+(R<<3)+20|0;T=c[R+4>>2]|0;U=d+48|0;c[U>>2]=c[R>>2];c[U+4>>2]=T;A=+g[w>>2];B=+g[v>>2];C=+g[u>>2];D=+g[t>>2];E=+g[z>>2];if(!((+g[m>>2]-A)*B+(+g[m+4>>2]-C)*D<=E)){h=0}else{T=m;h=c[T+4>>2]|0;U=d;c[U>>2]=c[T>>2];c[U+4>>2]=h;U=m+8|0;h=d+16|0;a[h+2>>0]=a[U+3>>0]|0;a[h+3>>0]=a[U+2>>0]|0;a[h>>0]=a[U+1>>0]|0;a[h+1>>0]=a[U>>0]|0;E=+g[z>>2];h=1}n=m+12|0;if((+g[n>>2]-A)*B+(+g[m+16>>2]-C)*D<=E){R=n;U=c[R+4>>2]|0;T=d+(h*20|0)|0;c[T>>2]=c[R>>2];c[T+4>>2]=U;T=m+20|0;U=d+(h*20|0)+16|0;a[U+2>>0]=a[T+3>>0]|0;a[U+3>>0]=a[T+2>>0]|0;a[U>>0]=a[T+1>>0]|0;a[U+1>>0]=a[T>>0]|0;h=h+1|0}}c[x>>2]=h;i=l;return}function Td(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0.0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0;r=i;c[a>>2]=0;e=a+4|0;c[e>>2]=-1;f=a+8|0;g[f>>2]=-3.4028234663852886e+38;k=+g[b+216>>2];j=+g[b+212>>2];h=c[b+128>>2]|0;if((h|0)<=0){i=r;return}t=+g[b+164>>2];u=+g[b+168>>2];n=+g[b+172>>2];m=+g[b+176>>2];s=+g[b+244>>2];o=b+228|0;p=b+232|0;q=b+236|0;d=b+240|0;v=-3.4028234663852886e+38;w=0;while(1){z=+g[b+(w<<3)+64>>2];x=-z;y=-+g[b+(w<<3)+68>>2];C=+g[b+(w<<3)>>2];B=+g[b+(w<<3)+4>>2];A=(C-t)*x+(B-u)*y;B=(C-n)*x+(B-m)*y;A=A<B?A:B;if(A>s){break}if(!(k*z+j*y>=0.0)){if(!((x- +g[o>>2])*j+(y- +g[p>>2])*k<-.03490658849477768)&A>v){l=8}}else{if(!((x- +g[q>>2])*j+(y- +g[d>>2])*k<-.03490658849477768)&A>v){l=8}}if((l|0)==8){l=0;c[a>>2]=2;c[e>>2]=w;g[f>>2]=A;v=A}w=w+1|0;if((w|0)>=(h|0)){l=10;break}}if((l|0)==10){i=r;return}c[a>>2]=2;c[e>>2]=w;g[f>>2]=A;i=r;return}function Ud(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=i;i=i+256|0;Sd(f,a,b,c,d,e);i=f;return}function Vd(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0,P=0.0,Q=0.0;j=i;i=i+96|0;v=j+92|0;A=j+88|0;u=j;s=j+80|0;t=j+56|0;m=j+32|0;r=j+24|0;k=b+60|0;c[k>>2]=0;l=+g[d+8>>2]+ +g[f+8>>2];c[v>>2]=0;o=+Wd(v,d,e,f,h);if(o>l){i=j;return}c[A>>2]=0;n=+Wd(A,f,h,d,e);if(n>l){i=j;return}if(n>o*.9800000190734863+.0010000000474974513){y=+g[h>>2];x=+g[h+4>>2];z=+g[h+8>>2];w=+g[h+12>>2];q=+g[e>>2];n=+g[e+4>>2];o=+g[e+8>>2];p=+g[e+12>>2];v=c[A>>2]|0;c[b+56>>2]=2;h=1;A=f}else{y=+g[e>>2];x=+g[e+4>>2];z=+g[e+8>>2];w=+g[e+12>>2];q=+g[h>>2];n=+g[h+4>>2];o=+g[h+8>>2];p=+g[h+12>>2];v=c[v>>2]|0;c[b+56>>2]=1;h=0;A=d;d=f}e=c[d+148>>2]|0;if(!((v|0)>-1)){xa(5640,5688,151,5728)}f=c[A+148>>2]|0;if((f|0)<=(v|0)){xa(5640,5688,151,5728)}B=+g[A+(v<<3)+84>>2];N=+g[A+(v<<3)+88>>2];C=w*B-z*N;N=z*B+w*N;B=p*C+o*N;C=p*N-o*C;if((e|0)>0){J=0;K=0;D=3.4028234663852886e+38;while(1){E=B*+g[d+(J<<3)+84>>2]+C*+g[d+(J<<3)+88>>2];I=E<D;K=I?J:K;J=J+1|0;if((J|0)==(e|0)){break}else{D=I?E:D}}}else{K=0}I=K+1|0;J=(I|0)<(e|0)?I:0;M=+g[d+(K<<3)+20>>2];L=+g[d+(K<<3)+24>>2];N=+(q+(p*M-o*L));L=+(n+(o*M+p*L));I=u;g[I>>2]=N;g[I+4>>2]=L;I=v&255;e=u+8|0;a[e>>0]=I;a[e+1>>0]=K;a[e+2>>0]=1;a[e+3>>0]=0;L=+g[d+(J<<3)+20>>2];N=+g[d+(J<<3)+24>>2];M=+(q+(p*L-o*N));N=+(n+(o*L+p*N));d=u+12|0;g[d>>2]=M;g[d+4>>2]=N;d=u+20|0;a[d>>0]=I;a[d+1>>0]=J;a[d+2>>0]=1;a[d+3>>0]=0;d=v+1|0;f=(d|0)<(f|0)?d:0;K=A+(v<<3)+20|0;F=+g[K>>2];E=+g[K+4>>2];K=A+(f<<3)+20|0;H=+g[K>>2];G=+g[K+4>>2];L=H-F;M=G-E;B=+O(+(L*L+M*M));if(!(B<1.1920928955078125e-7)){N=1.0/B;L=L*N;M=M*N}N=w*L-z*M;B=w*M+z*L;g[s>>2]=N;g[s+4>>2]=B;C=-N;Q=y+(w*F-z*E);P=x+(z*F+w*E);D=Q*B+P*C;g[r>>2]=C;g[r+4>>2]=-B;if((Zd(t,u,r,l-(Q*N+P*B),v)|0)<2){i=j;return}if((Zd(m,t,s,l+((y+(w*H-z*G))*N+(x+(z*H+w*G))*B),f)|0)<2){i=j;return}x=+M;w=+-L;r=b+40|0;g[r>>2]=x;g[r+4>>2]=w;w=+((F+H)*.5);x=+((E+G)*.5);r=b+48|0;g[r>>2]=w;g[r+4>>2]=x;x=+g[m>>2];w=+g[m+4>>2];r=!(B*x+w*C-D<=l);if(h<<24>>24==0){if(r){r=0}else{Q=x-q;N=w-n;P=+(p*Q+o*N);Q=+(p*N-o*Q);r=b;g[r>>2]=P;g[r+4>>2]=Q;c[b+16>>2]=c[m+8>>2];r=1}x=+g[m+12>>2];w=+g[m+16>>2];if(B*x+w*C-D<=l){Q=x-q;N=w-n;P=+(p*Q+o*N);Q=+(p*N-o*Q);K=b+(r*20|0)|0;g[K>>2]=P;g[K+4>>2]=Q;c[b+(r*20|0)+16>>2]=c[m+20>>2];r=r+1|0}}else{if(r){r=0}else{Q=x-q;N=w-n;P=+(p*Q+o*N);Q=+(p*N-o*Q);r=b;g[r>>2]=P;g[r+4>>2]=Q;r=b+16|0;K=c[m+8>>2]|0;c[r>>2]=K;a[r>>0]=K>>>8;a[r+1>>0]=K;a[r+2>>0]=K>>>24;a[r+3>>0]=K>>>16;r=1}x=+g[m+12>>2];w=+g[m+16>>2];if(B*x+w*C-D<=l){Q=x-q;N=w-n;P=+(p*Q+o*N);Q=+(p*N-o*Q);K=b+(r*20|0)|0;g[K>>2]=P;g[K+4>>2]=Q;K=b+(r*20|0)+16|0;J=c[m+20>>2]|0;c[K>>2]=J;a[K>>0]=J>>>8;a[K+1>>0]=J;a[K+2>>0]=J>>>24;a[K+3>>0]=J>>>16;r=r+1|0}}c[k>>2]=r;i=j;return}function Wd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0;h=i;j=c[b+148>>2]|0;t=+g[f+12>>2];v=+g[e+12>>2];u=+g[f+8>>2];s=+g[e+16>>2];r=+g[d+12>>2];m=+g[b+12>>2];k=+g[d+8>>2];l=+g[b+16>>2];n=+g[f>>2]+(t*v-u*s)-(+g[d>>2]+(r*m-k*l));l=v*u+t*s+ +g[f+4>>2]-(m*k+r*l+ +g[d+4>>2]);m=r*n+k*l;k=r*l-n*k;if((j|0)>0){q=0;p=0;l=-3.4028234663852886e+38;while(1){n=m*+g[b+(p<<3)+84>>2]+k*+g[b+(p<<3)+88>>2];o=n>l;q=o?p:q;p=p+1|0;if((p|0)==(j|0)){break}else{l=o?n:l}}}else{q=0}l=+Xd(b,d,q,e,f);o=((q|0)>0?q:j)+ -1|0;k=+Xd(b,d,o,e,f);p=q+1|0;p=(p|0)<(j|0)?p:0;m=+Xd(b,d,p,e,f);if(k>l&k>m){while(1){p=((o|0)>0?o:j)+ -1|0;l=+Xd(b,d,p,e,f);if(l>k){o=p;k=l}else{break}}c[a>>2]=o;i=h;return+k}if(m>l){o=p;k=m}else{v=l;c[a>>2]=q;i=h;return+v}while(1){p=o+1|0;p=(p|0)<(j|0)?p:0;l=+Xd(b,d,p,e,f);if(l>k){o=p;k=l}else{break}}c[a>>2]=o;i=h;return+k}function Xd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0;o=i;p=c[e+148>>2]|0;if(!((d|0)>-1)){xa(5640,5688,32,5752)}if((c[a+148>>2]|0)<=(d|0)){xa(5640,5688,32,5752)}n=+g[b+12>>2];l=+g[a+(d<<3)+84>>2];h=+g[b+8>>2];j=+g[a+(d<<3)+88>>2];k=n*l-h*j;j=l*h+n*j;l=+g[f+12>>2];m=+g[f+8>>2];s=l*k+m*j;q=l*j-k*m;if((p|0)>0){v=0;w=0;r=3.4028234663852886e+38;while(1){t=s*+g[e+(v<<3)+20>>2]+q*+g[e+(v<<3)+24>>2];u=t<r;w=u?v:w;v=v+1|0;if((v|0)==(p|0)){break}else{r=u?t:r}}}else{w=0}s=+g[a+(d<<3)+20>>2];t=+g[a+(d<<3)+24>>2];q=+g[e+(w<<3)+20>>2];r=+g[e+(w<<3)+24>>2];i=o;return+(k*(+g[f>>2]+(l*q-m*r)-(+g[b>>2]+(n*s-h*t)))+j*(q*m+l*r+ +g[f+4>>2]-(s*h+n*t+ +g[b+4>>2])))}function Yd(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;h=+h;var j=0,k=0,l=0.0,m=0,n=0,o=0.0,p=0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0.0;j=i;k=b+60|0;if((c[k>>2]|0)==0){i=j;return}m=c[b+56>>2]|0;if((m|0)==0){g[a>>2]=1.0;k=a+4|0;g[k>>2]=0.0;u=+g[d+12>>2];v=+g[b+48>>2];t=+g[d+8>>2];o=+g[b+52>>2];l=+g[d>>2]+(u*v-t*o);o=v*t+u*o+ +g[d+4>>2];u=+g[f+12>>2];t=+g[b>>2];v=+g[f+8>>2];r=+g[b+4>>2];q=+g[f>>2]+(u*t-v*r);r=t*v+u*r+ +g[f+4>>2];u=l-q;v=o-r;if(u*u+v*v>1.4210854715202004e-14){u=q-l;t=r-o;w=+u;v=+t;s=a;g[s>>2]=w;g[s+4>>2]=v;v=+O(+(u*u+t*t));if(!(v<1.1920928955078125e-7)){w=1.0/v;u=u*w;g[a>>2]=u;t=t*w;g[k>>2]=t}}else{u=1.0;t=0.0}v=+((l+u*e+(q-u*h))*.5);w=+((o+t*e+(r-t*h))*.5);s=a+8|0;g[s>>2]=v;g[s+4>>2]=w;i=j;return}else if((m|0)==2){p=f+12|0;u=+g[p>>2];v=+g[b+40>>2];s=f+8|0;w=+g[s>>2];r=+g[b+44>>2];q=u*v-w*r;r=v*w+u*r;u=+q;w=+r;n=a;g[n>>2]=u;g[n+4>>2]=w;w=+g[p>>2];u=+g[b+48>>2];v=+g[s>>2];o=+g[b+52>>2];l=+g[f>>2]+(w*u-v*o);o=u*v+w*o+ +g[f+4>>2];if((c[k>>2]|0)>0){n=d+12|0;m=d+8|0;f=d+4|0;p=a+4|0;s=0;do{v=+g[n>>2];y=+g[b+(s*20|0)>>2];t=+g[m>>2];u=+g[b+(s*20|0)+4>>2];w=+g[d>>2]+(v*y-t*u);u=y*t+v*u+ +g[f>>2];v=h-(q*(w-l)+(u-o)*r);w=+((w-q*e+(w+q*v))*.5);q=+((u-r*e+(u+r*v))*.5);x=a+(s<<3)+8|0;g[x>>2]=w;g[x+4>>2]=q;s=s+1|0;q=+g[a>>2];r=+g[p>>2]}while((s|0)<(c[k>>2]|0))}w=+-q;y=+-r;x=a;g[x>>2]=w;g[x+4>>2]=y;i=j;return}else if((m|0)==1){s=d+12|0;v=+g[s>>2];w=+g[b+40>>2];x=d+8|0;y=+g[x>>2];r=+g[b+44>>2];q=v*w-y*r;r=w*y+v*r;v=+q;y=+r;p=a;g[p>>2]=v;g[p+4>>2]=y;y=+g[s>>2];v=+g[b+48>>2];w=+g[x>>2];o=+g[b+52>>2];l=+g[d>>2]+(y*v-w*o);o=v*w+y*o+ +g[d+4>>2];if((c[k>>2]|0)<=0){i=j;return}d=f+12|0;m=f+8|0;n=f+4|0;p=a+4|0;s=0;while(1){y=+g[d>>2];t=+g[b+(s*20|0)>>2];u=+g[m>>2];v=+g[b+(s*20|0)+4>>2];w=+g[f>>2]+(y*t-u*v);v=t*u+y*v+ +g[n>>2];y=e-(q*(w-l)+(v-o)*r);w=+((w-q*h+(w+q*y))*.5);y=+((v-r*h+(v+r*y))*.5);x=a+(s<<3)+8|0;g[x>>2]=w;g[x+4>>2]=y;s=s+1|0;if((s|0)>=(c[k>>2]|0)){break}q=+g[a>>2];r=+g[p>>2]}i=j;return}else{i=j;return}}function Zd(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=+f;h=h|0;var j=0,k=0,l=0.0,m=0,n=0,o=0.0,p=0.0,q=0;j=i;p=+g[e>>2];o=+g[e+4>>2];e=d+4|0;l=p*+g[d>>2]+o*+g[e>>2]-f;k=d+12|0;m=d+16|0;f=p*+g[k>>2]+o*+g[m>>2]-f;if(!(l<=0.0)){n=0}else{c[b+0>>2]=c[d+0>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];n=1}if(f<=0.0){q=n+1|0;n=b+(n*12|0)|0;c[n+0>>2]=c[k+0>>2];c[n+4>>2]=c[k+4>>2];c[n+8>>2]=c[k+8>>2];n=q}if(!(l*f<0.0)){q=n;i=j;return q|0}f=l/(l-f);o=+g[d>>2];p=+g[e>>2];o=+(o+f*(+g[k>>2]-o));p=+(p+f*(+g[m>>2]-p));q=b+(n*12|0)|0;g[q>>2]=o;g[q+4>>2]=p;q=b+(n*12|0)+8|0;a[q>>0]=h;a[q+1>>0]=a[d+9>>0]|0;a[q+2>>0]=0;a[q+3>>0]=1;q=n+1|0;i=j;return q|0}function _d(d,e,f,h,j,k){d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0;m=i;i=i+128|0;n=m+36|0;o=m+24|0;l=m;c[n+16>>2]=0;c[n+20>>2]=0;g[n+24>>2]=0.0;c[n+44>>2]=0;c[n+48>>2]=0;g[n+52>>2]=0.0;Pc(n,d,e);Pc(n+28|0,f,h);d=n+56|0;c[d+0>>2]=c[j+0>>2];c[d+4>>2]=c[j+4>>2];c[d+8>>2]=c[j+8>>2];c[d+12>>2]=c[j+12>>2];d=n+72|0;c[d+0>>2]=c[k+0>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];a[n+88>>0]=1;b[o+4>>1]=0;Rc(l,o,n);i=m;return+g[l+16>>2]<11920928955078125.0e-22|0}function $d(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;f=Xb(f,144)|0;if((f|0)==0){f=0;i=g;return f|0}nd(f,a,b,d,e);c[f>>2]=5784;if((c[(c[(c[f+48>>2]|0)+12>>2]|0)+4>>2]|0)!=3){xa(5800,5848,43,5904)}if((c[(c[(c[f+52>>2]|0)+12>>2]|0)+4>>2]|0)==0){i=g;return f|0}else{xa(5928,5848,44,5904)}return 0}function ae(a,b){a=a|0;b=b|0;var d=0;d=i;ib[c[(c[a>>2]|0)+4>>2]&31](a);Yb(b,a,144);i=d;return}function be(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0;h=i;i=i+48|0;j=h;k=c[(c[a+48>>2]|0)+12>>2]|0;c[j>>2]=240;c[j+4>>2]=1;g[j+8>>2]=.009999999776482582;l=j+28|0;c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;c[l+12>>2]=0;b[l+16>>1]=0;xe(k,j,c[a+56>>2]|0);Rd(d,j,e,c[(c[a+52>>2]|0)+12>>2]|0,f);i=h;return}function ce(a){a=a|0;return}function de(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function ee(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;f=Xb(f,144)|0;if((f|0)==0){f=0;i=g;return f|0}nd(f,a,b,d,e);c[f>>2]=6032;if((c[(c[(c[f+48>>2]|0)+12>>2]|0)+4>>2]|0)!=3){xa(6048,6096,43,6152)}if((c[(c[(c[f+52>>2]|0)+12>>2]|0)+4>>2]|0)==2){i=g;return f|0}else{xa(6184,6096,44,6152)}return 0}function fe(a,b){a=a|0;b=b|0;var d=0;d=i;ib[c[(c[a>>2]|0)+4>>2]&31](a);Yb(b,a,144);i=d;return}function ge(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0;h=i;i=i+48|0;j=h;k=c[(c[a+48>>2]|0)+12>>2]|0;c[j>>2]=240;c[j+4>>2]=1;g[j+8>>2]=.009999999776482582;l=j+28|0;c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;c[l+12>>2]=0;b[l+16>>1]=0;xe(k,j,c[a+56>>2]|0);Ud(d,j,e,c[(c[a+52>>2]|0)+12>>2]|0,f);i=h;return}function he(a){a=a|0;return}function ie(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function je(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;b=i;f=Xb(f,144)|0;if((f|0)==0){e=0;i=b;return e|0}nd(f,a,0,d,0);c[f>>2]=6288;if((c[(c[(c[f+48>>2]|0)+12>>2]|0)+4>>2]|0)!=0){xa(6304,6352,44,6400)}if((c[(c[(c[f+52>>2]|0)+12>>2]|0)+4>>2]|0)==0){e=f;i=b;return e|0}else{xa(6416,6352,45,6400)}return 0}function ke(a,b){a=a|0;b=b|0;var d=0;d=i;ib[c[(c[a>>2]|0)+4>>2]&31](a);Yb(b,a,144);i=d;return}function le(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=i;Pd(b,c[(c[a+48>>2]|0)+12>>2]|0,d,c[(c[a+52>>2]|0)+12>>2]|0,e);i=f;return}function me(a){a=a|0;return}function ne(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function oe(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0;e=i;c[b+0>>2]=c[d+0>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];r=c[d+40>>2]|0;m=b+32|0;c[m>>2]=r;f=c[d+28>>2]|0;j=b+48|0;c[j>>2]=f;h=b+36|0;c[h>>2]=gd(r,f*88|0)|0;f=b+40|0;c[f>>2]=gd(c[m>>2]|0,(c[j>>2]|0)*152|0)|0;c[b+24>>2]=c[d+32>>2];c[b+28>>2]=c[d+36>>2];m=c[d+24>>2]|0;d=b+44|0;c[d>>2]=m;if((c[j>>2]|0)<=0){i=e;return}k=b+20|0;b=b+8|0;l=0;while(1){n=c[m+(l<<2)>>2]|0;o=c[n+48>>2]|0;p=c[n+52>>2]|0;r=c[o+8>>2]|0;q=c[p+8>>2]|0;m=c[n+124>>2]|0;if((m|0)<=0){f=4;break}s=+g[(c[p+12>>2]|0)+8>>2];t=+g[(c[o+12>>2]|0)+8>>2];p=c[f>>2]|0;g[p+(l*152|0)+136>>2]=+g[n+136>>2];g[p+(l*152|0)+140>>2]=+g[n+140>>2];z=r+8|0;c[p+(l*152|0)+112>>2]=c[z>>2];y=q+8|0;c[p+(l*152|0)+116>>2]=c[y>>2];w=r+120|0;g[p+(l*152|0)+120>>2]=+g[w>>2];x=q+120|0;g[p+(l*152|0)+124>>2]=+g[x>>2];v=r+128|0;g[p+(l*152|0)+128>>2]=+g[v>>2];u=q+128|0;g[p+(l*152|0)+132>>2]=+g[u>>2];c[p+(l*152|0)+148>>2]=l;c[p+(l*152|0)+144>>2]=m;o=p+(l*152|0)+80|0;c[o+0>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[o+16>>2]=0;c[o+20>>2]=0;c[o+24>>2]=0;c[o+28>>2]=0;o=c[h>>2]|0;c[o+(l*88|0)+32>>2]=c[z>>2];c[o+(l*88|0)+36>>2]=c[y>>2];g[o+(l*88|0)+40>>2]=+g[w>>2];g[o+(l*88|0)+44>>2]=+g[x>>2];x=r+28|0;r=c[x+4>>2]|0;w=o+(l*88|0)+48|0;c[w>>2]=c[x>>2];c[w+4>>2]=r;w=q+28|0;r=c[w+4>>2]|0;q=o+(l*88|0)+56|0;c[q>>2]=c[w>>2];c[q+4>>2]=r;g[o+(l*88|0)+64>>2]=+g[v>>2];g[o+(l*88|0)+68>>2]=+g[u>>2];q=n+104|0;r=c[q+4>>2]|0;u=o+(l*88|0)+16|0;c[u>>2]=c[q>>2];c[u+4>>2]=r;u=n+112|0;r=c[u+4>>2]|0;q=o+(l*88|0)+24|0;c[q>>2]=c[u>>2];c[q+4>>2]=r;c[o+(l*88|0)+84>>2]=m;g[o+(l*88|0)+76>>2]=t;g[o+(l*88|0)+80>>2]=s;c[o+(l*88|0)+72>>2]=c[n+120>>2];q=0;do{r=n+(q*20|0)+64|0;if((a[k>>0]|0)==0){g[p+(l*152|0)+(q*36|0)+16>>2]=0.0;g[p+(l*152|0)+(q*36|0)+20>>2]=0.0}else{g[p+(l*152|0)+(q*36|0)+16>>2]=+g[b>>2]*+g[n+(q*20|0)+72>>2];g[p+(l*152|0)+(q*36|0)+20>>2]=+g[b>>2]*+g[n+(q*20|0)+76>>2]}x=p+(l*152|0)+(q*36|0)|0;g[p+(l*152|0)+(q*36|0)+24>>2]=0.0;g[p+(l*152|0)+(q*36|0)+28>>2]=0.0;g[p+(l*152|0)+(q*36|0)+32>>2]=0.0;z=o+(l*88|0)+(q<<3)|0;c[x+0>>2]=0;c[x+4>>2]=0;c[x+8>>2]=0;c[x+12>>2]=0;x=r;y=c[x+4>>2]|0;c[z>>2]=c[x>>2];c[z+4>>2]=y;q=q+1|0}while((q|0)!=(m|0));l=l+1|0;if((l|0)>=(c[j>>2]|0)){f=12;break}m=c[d>>2]|0}if((f|0)==4){xa(6504,6520,71,6568)}else if((f|0)==12){i=e;return}}function pe(a){a=a|0;var b=0,d=0;b=i;d=a+32|0;hd(c[d>>2]|0,c[a+40>>2]|0);hd(c[d>>2]|0,c[a+36>>2]|0);i=b;return}function qe(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0.0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0.0,S=0.0,T=0.0,U=0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0,aa=0;b=i;i=i+64|0;l=b+40|0;e=b+24|0;h=b;f=a+48|0;if((c[f>>2]|0)<=0){i=b;return}m=a+40|0;d=a+36|0;k=a+44|0;j=a+24|0;p=a+28|0;q=l+8|0;o=l+12|0;n=e+8|0;a=e+12|0;s=0;while(1){r=c[m>>2]|0;J=c[d>>2]|0;H=c[(c[k>>2]|0)+(c[r+(s*152|0)+148>>2]<<2)>>2]|0;L=c[r+(s*152|0)+112>>2]|0;U=c[r+(s*152|0)+116>>2]|0;G=+g[r+(s*152|0)+120>>2];A=+g[r+(s*152|0)+124>>2];t=+g[r+(s*152|0)+128>>2];u=+g[r+(s*152|0)+132>>2];M=J+(s*88|0)+48|0;P=+g[M>>2];S=+g[M+4>>2];M=J+(s*88|0)+56|0;T=+g[M>>2];V=+g[M+4>>2];M=c[j>>2]|0;N=M+(L*12|0)|0;C=+g[N>>2];D=+g[N+4>>2];I=+g[M+(L*12|0)+8>>2];N=c[p>>2]|0;K=N+(L*12|0)|0;y=+g[K>>2];B=+g[K+4>>2];z=+g[N+(L*12|0)+8>>2];L=M+(U*12|0)|0;E=+g[L>>2];F=+g[L+4>>2];O=+g[M+(U*12|0)+8>>2];M=N+(U*12|0)|0;w=+g[M>>2];v=+g[M+4>>2];x=+g[N+(U*12|0)+8>>2];if((c[H+124>>2]|0)<=0){d=4;break}W=+g[J+(s*88|0)+80>>2];X=+g[J+(s*88|0)+76>>2];Z=+R(+I);g[q>>2]=Z;_=+Q(+I);g[o>>2]=_;I=+R(+O);g[n>>2]=I;O=+Q(+O);g[a>>2]=O;Y=+(C-(P*_-S*Z));S=+(D-(S*_+P*Z));N=l;g[N>>2]=Y;g[N+4>>2]=S;S=+(E-(T*O-V*I));V=+(F-(V*O+T*I));N=e;g[N>>2]=S;g[N+4>>2]=V;Yd(h,H+64|0,l,X,e,W);N=r+(s*152|0)+72|0;U=h;J=c[U+4>>2]|0;H=N;c[H>>2]=c[U>>2];c[H+4>>2]=J;H=r+(s*152|0)+144|0;J=c[H>>2]|0;do{if((J|0)>0){M=r+(s*152|0)+76|0;I=G+A;L=r+(s*152|0)+140|0;K=0;do{$=h+(K<<3)+8|0;T=+g[$>>2]-C;U=h+(K<<3)+12|0;P=+T;S=+(+g[U>>2]-D);aa=r+(s*152|0)+(K*36|0)|0;g[aa>>2]=P;g[aa+4>>2]=S;S=+g[$>>2]-E;P=+S;Z=+(+g[U>>2]-F);U=r+(s*152|0)+(K*36|0)+8|0;g[U>>2]=P;g[U+4>>2]=Z;Z=+g[M>>2];P=+g[r+(s*152|0)+(K*36|0)+4>>2];V=+g[N>>2];_=T*Z-P*V;O=+g[r+(s*152|0)+(K*36|0)+12>>2];V=Z*S-V*O;V=I+_*t*_+V*u*V;if(V>0.0){V=1.0/V}else{V=0.0}g[r+(s*152|0)+(K*36|0)+24>>2]=V;V=+g[M>>2];Z=-+g[N>>2];_=T*Z-V*P;V=S*Z-V*O;V=I+_*t*_+V*u*V;if(V>0.0){V=1.0/V}else{V=0.0}g[r+(s*152|0)+(K*36|0)+28>>2]=V;U=r+(s*152|0)+(K*36|0)+32|0;g[U>>2]=0.0;O=+g[N>>2]*(w-x*O-y+z*P)+ +g[M>>2]*(v+x*S-B-z*T);if(O<-1.0){g[U>>2]=-(O*+g[L>>2])}K=K+1|0}while((K|0)!=(J|0));if((c[H>>2]|0)==2){X=+g[r+(s*152|0)+76>>2];w=+g[N>>2];W=+g[r+(s*152|0)>>2]*X- +g[r+(s*152|0)+4>>2]*w;v=X*+g[r+(s*152|0)+8>>2]-w*+g[r+(s*152|0)+12>>2];Z=X*+g[r+(s*152|0)+36>>2]-w*+g[r+(s*152|0)+40>>2];w=X*+g[r+(s*152|0)+44>>2]-w*+g[r+(s*152|0)+48>>2];X=G+A;Y=t*W;_=u*v;v=X+W*Y+v*_;u=X+Z*t*Z+w*u*w;t=X+Y*Z+_*w;w=v*u-t*t;if(!(v*v<w*1.0e3)){c[H>>2]=1;break}g[r+(s*152|0)+96>>2]=v;g[r+(s*152|0)+100>>2]=t;g[r+(s*152|0)+104>>2]=t;g[r+(s*152|0)+108>>2]=u;if(w!=0.0){w=1.0/w}_=-(w*t);g[r+(s*152|0)+80>>2]=u*w;g[r+(s*152|0)+84>>2]=_;g[r+(s*152|0)+88>>2]=_;g[r+(s*152|0)+92>>2]=v*w}}}while(0);s=s+1|0;if((s|0)>=(c[f>>2]|0)){d=21;break}}if((d|0)==4){xa(6584,6520,168,6616)}else if((d|0)==21){i=b;return}}function re(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0.0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,C=0.0,D=0.0;b=i;d=a+48|0;if((c[d>>2]|0)<=0){i=b;return}e=a+40|0;k=a+28|0;t=c[k>>2]|0;a=0;do{m=c[e>>2]|0;h=c[m+(a*152|0)+112>>2]|0;j=c[m+(a*152|0)+116>>2]|0;o=+g[m+(a*152|0)+120>>2];l=+g[m+(a*152|0)+128>>2];q=+g[m+(a*152|0)+124>>2];p=+g[m+(a*152|0)+132>>2];n=c[m+(a*152|0)+144>>2]|0;f=t+(h*12|0)|0;A=f;v=+g[A>>2];x=+g[A+4>>2];w=+g[t+(h*12|0)+8>>2];A=t+(j*12|0)|0;y=+g[A>>2];z=+g[A+4>>2];u=+g[t+(j*12|0)+8>>2];t=m+(a*152|0)+72|0;s=+g[t>>2];r=+g[t+4>>2];if((n|0)>0){t=0;do{D=+g[m+(a*152|0)+(t*36|0)+16>>2];B=+g[m+(a*152|0)+(t*36|0)+20>>2];C=s*D+r*B;B=r*D-s*B;w=w-l*(+g[m+(a*152|0)+(t*36|0)>>2]*B- +g[m+(a*152|0)+(t*36|0)+4>>2]*C);v=v-o*C;x=x-o*B;u=u+p*(B*+g[m+(a*152|0)+(t*36|0)+8>>2]-C*+g[m+(a*152|0)+(t*36|0)+12>>2]);y=y+q*C;z=z+q*B;t=t+1|0}while((t|0)!=(n|0))}D=+v;C=+x;t=f;g[t>>2]=D;g[t+4>>2]=C;t=c[k>>2]|0;g[t+(h*12|0)+8>>2]=w;C=+y;D=+z;t=t+(j*12|0)|0;g[t>>2]=C;g[t+4>>2]=D;t=c[k>>2]|0;g[t+(j*12|0)+8>>2]=u;a=a+1|0}while((a|0)<(c[d>>2]|0));i=b;return}function se(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0,T=0.0,U=0.0;b=i;d=a+48|0;if((c[d>>2]|0)<=0){i=b;return}e=a+40|0;a=a+28|0;S=c[a>>2]|0;h=0;a:while(1){x=c[e>>2]|0;y=x+(h*152|0)|0;k=c[x+(h*152|0)+112>>2]|0;f=c[x+(h*152|0)+116>>2]|0;o=+g[x+(h*152|0)+120>>2];m=+g[x+(h*152|0)+128>>2];n=+g[x+(h*152|0)+124>>2];l=+g[x+(h*152|0)+132>>2];J=x+(h*152|0)+144|0;K=c[J>>2]|0;j=S+(k*12|0)|0;I=j;v=+g[I>>2];w=+g[I+4>>2];I=S+(f*12|0)|0;t=+g[I>>2];u=+g[I+4>>2];I=x+(h*152|0)+72|0;r=+g[I>>2];p=+g[I+4>>2];z=-r;A=+g[x+(h*152|0)+136>>2];if((K+ -1|0)>>>0<2){I=0;s=+g[S+(k*12|0)+8>>2];q=+g[S+(f*12|0)+8>>2]}else{d=4;break}do{G=+g[x+(h*152|0)+(I*36|0)+12>>2];C=+g[x+(h*152|0)+(I*36|0)+8>>2];D=+g[x+(h*152|0)+(I*36|0)+4>>2];E=+g[x+(h*152|0)+(I*36|0)>>2];L=A*+g[x+(h*152|0)+(I*36|0)+16>>2];S=x+(h*152|0)+(I*36|0)+20|0;F=+g[S>>2];H=F- +g[x+(h*152|0)+(I*36|0)+28>>2]*(p*(t-q*G-v+s*D)+(u+q*C-w-s*E)*z);B=-L;H=H<L?H:L;R=H<B?B:H;Q=R-F;g[S>>2]=R;R=p*Q;Q=Q*z;v=v-o*R;w=w-o*Q;s=s-m*(E*Q-D*R);t=t+n*R;u=u+n*Q;q=q+l*(C*Q-G*R);I=I+1|0}while((I|0)!=(K|0));do{if((c[J>>2]|0)!=1){I=x+(h*152|0)+16|0;H=+g[I>>2];J=x+(h*152|0)+52|0;L=+g[J>>2];if(!(H>=0.0)|!(L>=0.0)){d=9;break a}z=+g[x+(h*152|0)+12>>2];A=+g[x+(h*152|0)+8>>2];C=+g[x+(h*152|0)+4>>2];G=+g[y>>2];D=+g[x+(h*152|0)+48>>2];B=+g[x+(h*152|0)+44>>2];E=+g[x+(h*152|0)+40>>2];F=+g[x+(h*152|0)+36>>2];O=+g[x+(h*152|0)+104>>2];P=+g[x+(h*152|0)+100>>2];M=r*(t-q*z-v+s*C)+p*(u+q*A-w-s*G)- +g[x+(h*152|0)+32>>2]-(H*+g[x+(h*152|0)+96>>2]+L*O);N=r*(t-q*D-v+s*E)+p*(u+q*B-w-s*F)- +g[x+(h*152|0)+68>>2]-(H*P+L*+g[x+(h*152|0)+108>>2]);U=+g[x+(h*152|0)+80>>2]*M+ +g[x+(h*152|0)+88>>2]*N;T=M*+g[x+(h*152|0)+84>>2]+N*+g[x+(h*152|0)+92>>2];Q=-U;R=-T;if(!(!(U<=-0.0)|!(T<=-0.0))){O=Q-H;T=R-L;P=r*O;O=p*O;U=r*T;T=p*T;M=P+U;N=O+T;g[I>>2]=Q;g[J>>2]=R;v=v-o*M;w=w-o*N;t=t+n*M;u=u+n*N;s=s-m*(G*O-C*P+(F*T-E*U));q=q+l*(A*O-z*P+(B*T-D*U));break}U=M*+g[x+(h*152|0)+24>>2];Q=-U;if(U<=-0.0?N+P*Q>=0.0:0){P=Q-H;T=0.0-L;R=r*P;P=p*P;U=r*T;T=p*T;N=U+R;O=T+P;g[I>>2]=Q;g[J>>2]=0.0;v=v-o*N;w=w-o*O;t=t+n*N;u=u+n*O;s=s-m*(P*G-R*C+(T*F-U*E));q=q+l*(P*A-R*z+(T*B-U*D));break}U=N*+g[x+(h*152|0)+60>>2];P=-U;if(U<=-0.0?M+O*P>=0.0:0){Q=0.0-H;T=P-L;R=r*Q;Q=p*Q;U=r*T;T=p*T;N=R+U;O=Q+T;g[I>>2]=0.0;g[J>>2]=P;v=v-o*N;w=w-o*O;t=t+n*N;u=u+n*O;s=s-m*(Q*G-R*C+(T*F-U*E));q=q+l*(Q*A-R*z+(T*B-U*D));break}if(!(!(M>=0.0)|!(N>=0.0))){Q=0.0-H;T=0.0-L;R=r*Q;Q=p*Q;U=r*T;T=p*T;O=R+U;P=Q+T;g[I>>2]=0.0;g[J>>2]=0.0;v=v-o*O;w=w-o*P;t=t+n*O;u=u+n*P;s=s-m*(Q*G-R*C+(T*F-U*E));q=q+l*(Q*A-R*z+(T*B-U*D))}}else{z=+g[x+(h*152|0)+12>>2];A=+g[x+(h*152|0)+8>>2];B=+g[x+(h*152|0)+4>>2];C=+g[y>>2];y=x+(h*152|0)+16|0;D=+g[y>>2];E=D- +g[x+(h*152|0)+24>>2]*(r*(t-q*z-v+s*B)+p*(u+q*A-w-s*C)- +g[x+(h*152|0)+32>>2]);U=E>0.0?E:0.0;T=U-D;g[y>>2]=U;U=r*T;T=p*T;v=v-o*U;w=w-o*T;t=t+n*U;u=u+n*T;s=s-m*(C*T-B*U);q=q+l*(A*T-z*U)}}while(0);U=+v;T=+w;S=j;g[S>>2]=U;g[S+4>>2]=T;S=c[a>>2]|0;g[S+(k*12|0)+8>>2]=s;T=+t;U=+u;S=S+(f*12|0)|0;g[S>>2]=T;g[S+4>>2]=U;S=c[a>>2]|0;g[S+(f*12|0)+8>>2]=q;h=h+1|0;if((h|0)>=(c[d>>2]|0)){d=21;break}}if((d|0)==4){xa(6648,6520,311,6688)}else if((d|0)==9){xa(6720,6520,406,6688)}else if((d|0)==21){i=b;return}}function te(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0;b=i;d=c[a+48>>2]|0;if((d|0)<=0){i=b;return}e=c[a+40>>2]|0;a=c[a+44>>2]|0;f=0;do{h=c[a+(c[e+(f*152|0)+148>>2]<<2)>>2]|0;j=c[e+(f*152|0)+144>>2]|0;if((j|0)>0){k=0;do{g[h+(k*20|0)+72>>2]=+g[e+(f*152|0)+(k*36|0)+16>>2];g[h+(k*20|0)+76>>2]=+g[e+(f*152|0)+(k*36|0)+20>>2];k=k+1|0}while((k|0)<(j|0))}f=f+1|0}while((f|0)<(d|0));i=b;return}function ue(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0.0,N=0.0,O=0.0,P=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0,X=0.0;b=i;i=i+64|0;f=b+40|0;h=b+24|0;e=b;d=a+48|0;if((c[d>>2]|0)<=0){V=0.0;L=V>=-.014999999664723873;i=b;return L|0}j=a+36|0;l=a+24|0;p=f+8|0;a=f+12|0;k=h+8|0;o=h+12|0;m=e+8|0;n=e+16|0;L=c[l>>2]|0;r=0;D=0.0;do{x=c[j>>2]|0;C=x+(r*88|0)|0;s=c[x+(r*88|0)+32>>2]|0;q=c[x+(r*88|0)+36>>2]|0;W=x+(r*88|0)+48|0;y=+g[W>>2];z=+g[W+4>>2];A=+g[x+(r*88|0)+40>>2];u=+g[x+(r*88|0)+64>>2];W=x+(r*88|0)+56|0;v=+g[W>>2];B=+g[W+4>>2];t=+g[x+(r*88|0)+44>>2];w=+g[x+(r*88|0)+68>>2];x=c[x+(r*88|0)+84>>2]|0;W=L+(s*12|0)|0;F=+g[W>>2];G=+g[W+4>>2];H=+g[L+(s*12|0)+8>>2];W=L+(q*12|0)|0;I=+g[W>>2];J=+g[W+4>>2];K=+g[L+(q*12|0)+8>>2];if((x|0)>0){E=A+t;L=0;do{T=+R(+H);g[p>>2]=T;U=+Q(+H);g[a>>2]=U;P=+R(+K);g[k>>2]=P;O=+Q(+K);g[o>>2]=O;S=+(F-(y*U-z*T));T=+(G-(z*U+y*T));W=f;g[W>>2]=S;g[W+4>>2]=T;T=+(I-(v*O-B*P));P=+(J-(B*O+v*P));W=h;g[W>>2]=T;g[W+4>>2]=P;ve(e,C,f,h,L);W=e;P=+g[W>>2];T=+g[W+4>>2];W=m;O=+g[W>>2];S=+g[W+4>>2];U=+g[n>>2];M=O-F;N=S-G;O=O-I;S=S-J;D=D<U?D:U;U=(U+.004999999888241291)*.20000000298023224;V=U<0.0?U:0.0;U=T*M-P*N;X=T*O-P*S;U=X*w*X+(E+U*u*U);if(U>0.0){U=-(V<-.20000000298023224?-.20000000298023224:V)/U}else{U=0.0}X=P*U;V=T*U;F=F-A*X;G=G-A*V;H=H-u*(M*V-N*X);I=I+t*X;J=J+t*V;K=K+w*(O*V-S*X);L=L+1|0}while((L|0)!=(x|0));x=c[l>>2]|0}else{x=L}X=+F;V=+G;L=x+(s*12|0)|0;g[L>>2]=X;g[L+4>>2]=V;L=c[l>>2]|0;g[L+(s*12|0)+8>>2]=H;V=+I;X=+J;L=L+(q*12|0)|0;g[L>>2]=V;g[L+4>>2]=X;L=c[l>>2]|0;g[L+(q*12|0)+8>>2]=K;r=r+1|0}while((r|0)<(c[d>>2]|0));W=D>=-.014999999664723873;i=b;return W|0}function ve(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0,w=0;h=i;if((c[b+84>>2]|0)<=0){xa(6752,6520,617,6776)}r=c[b+72>>2]|0;if((r|0)==1){v=d+12|0;k=+g[v>>2];l=+g[b+16>>2];r=d+8|0;m=+g[r>>2];o=+g[b+20>>2];j=k*l-m*o;o=l*m+k*o;k=+j;m=+o;w=a;g[w>>2]=k;g[w+4>>2]=m;m=+g[v>>2];k=+g[b+24>>2];l=+g[r>>2];n=+g[b+28>>2];s=+g[e+12>>2];u=+g[b+(f<<3)>>2];t=+g[e+8>>2];q=+g[b+(f<<3)+4>>2];p=+g[e>>2]+(s*u-t*q);q=u*t+s*q+ +g[e+4>>2];g[a+16>>2]=j*(p-(+g[d>>2]+(m*k-l*n)))+(q-(k*l+m*n+ +g[d+4>>2]))*o- +g[b+76>>2]- +g[b+80>>2];p=+p;q=+q;f=a+8|0;g[f>>2]=p;g[f+4>>2]=q;i=h;return}else if((r|0)==2){v=e+12|0;m=+g[v>>2];n=+g[b+16>>2];w=e+8|0;o=+g[w>>2];u=+g[b+20>>2];t=m*n-o*u;u=n*o+m*u;m=+t;o=+u;r=a;g[r>>2]=m;g[r+4>>2]=o;o=+g[v>>2];m=+g[b+24>>2];n=+g[w>>2];p=+g[b+28>>2];l=+g[d+12>>2];j=+g[b+(f<<3)>>2];k=+g[d+8>>2];s=+g[b+(f<<3)+4>>2];q=+g[d>>2]+(l*j-k*s);s=j*k+l*s+ +g[d+4>>2];g[a+16>>2]=t*(q-(+g[e>>2]+(o*m-n*p)))+(s-(m*n+o*p+ +g[e+4>>2]))*u- +g[b+76>>2]- +g[b+80>>2];q=+q;s=+s;w=a+8|0;g[w>>2]=q;g[w+4>>2]=s;t=+-t;u=+-u;w=a;g[w>>2]=t;g[w+4>>2]=u;i=h;return}else if((r|0)==0){m=+g[d+12>>2];n=+g[b+24>>2];u=+g[d+8>>2];l=+g[b+28>>2];j=+g[d>>2]+(m*n-u*l);l=n*u+m*l+ +g[d+4>>2];m=+g[e+12>>2];u=+g[b>>2];n=+g[e+8>>2];o=+g[b+4>>2];k=+g[e>>2]+(m*u-n*o);o=u*n+m*o+ +g[e+4>>2];m=k-j;n=o-l;u=+m;p=+n;w=a;g[w>>2]=u;g[w+4>>2]=p;p=+O(+(m*m+n*n));if(p<1.1920928955078125e-7){p=m;q=n}else{q=1.0/p;p=m*q;g[a>>2]=p;q=n*q;g[a+4>>2]=q}t=+((j+k)*.5);u=+((l+o)*.5);w=a+8|0;g[w>>2]=t;g[w+4>>2]=u;g[a+16>>2]=m*p+n*q- +g[b+76>>2]- +g[b+80>>2];i=h;return}else{i=h;return}}function we(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0,O=0.0,P=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0,Z=0.0;e=i;i=i+64|0;l=e+40|0;f=e+24|0;h=e;j=a+48|0;if((c[j>>2]|0)<=0){X=0.0;N=X>=-.007499999832361937;i=e;return N|0}k=a+36|0;q=a+24|0;a=l+8|0;r=l+12|0;m=f+8|0;n=f+12|0;o=h+8|0;p=h+16|0;s=0;M=0.0;do{N=c[k>>2]|0;v=N+(s*88|0)|0;t=c[N+(s*88|0)+32>>2]|0;u=c[N+(s*88|0)+36>>2]|0;w=N+(s*88|0)+48|0;x=+g[w>>2];y=+g[w+4>>2];w=N+(s*88|0)+56|0;z=+g[w>>2];A=+g[w+4>>2];w=c[N+(s*88|0)+84>>2]|0;if((t|0)==(b|0)|(t|0)==(d|0)){C=+g[N+(s*88|0)+64>>2];D=+g[N+(s*88|0)+40>>2]}else{C=0.0;D=0.0}B=+g[N+(s*88|0)+44>>2];E=+g[N+(s*88|0)+68>>2];N=c[q>>2]|0;Y=N+(t*12|0)|0;J=+g[Y>>2];I=+g[Y+4>>2];F=+g[N+(t*12|0)+8>>2];Y=N+(u*12|0)|0;K=+g[Y>>2];L=+g[Y+4>>2];H=+g[N+(u*12|0)+8>>2];if((w|0)>0){G=D+B;N=0;do{O=+R(+F);g[a>>2]=O;W=+Q(+F);g[r>>2]=W;V=+R(+H);g[m>>2]=V;T=+Q(+H);g[n>>2]=T;S=+(J-(x*W-y*O));O=+(I-(y*W+x*O));Y=l;g[Y>>2]=S;g[Y+4>>2]=O;O=+(K-(z*T-A*V));V=+(L-(A*T+z*V));Y=f;g[Y>>2]=O;g[Y+4>>2]=V;ve(h,v,l,f,N);Y=h;V=+g[Y>>2];O=+g[Y+4>>2];Y=o;T=+g[Y>>2];S=+g[Y+4>>2];W=+g[p>>2];P=T-J;U=S-I;T=T-K;S=S-L;M=M<W?M:W;W=(W+.004999999888241291)*.75;W=W<0.0?W:0.0;X=O*P-V*U;Z=O*T-V*S;X=Z*E*Z+(G+X*C*X);if(X>0.0){W=-(W<-.20000000298023224?-.20000000298023224:W)/X}else{W=0.0}Z=V*W;X=O*W;J=J-D*Z;I=I-D*X;F=F-C*(P*X-U*Z);K=K+B*Z;L=L+B*X;H=H+E*(T*X-S*Z);N=N+1|0}while((N|0)!=(w|0));v=c[q>>2]|0}else{v=N}Z=+J;X=+I;Y=v+(t*12|0)|0;g[Y>>2]=Z;g[Y+4>>2]=X;Y=c[q>>2]|0;g[Y+(t*12|0)+8>>2]=F;X=+K;Z=+L;Y=Y+(u*12|0)|0;g[Y>>2]=X;g[Y+4>>2]=Z;g[(c[q>>2]|0)+(u*12|0)+8>>2]=H;s=s+1|0}while((s|0)<(c[j>>2]|0));Y=M>=-.007499999832361937;i=e;return Y|0}function xe(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;if(!((e|0)>-1)){xa(6832,6792,89,6872)}h=b+16|0;if(((c[h>>2]|0)+ -1|0)<=(e|0)){xa(6832,6792,89,6872)}c[d+4>>2]=1;g[d+8>>2]=+g[b+8>>2];j=b+12|0;k=(c[j>>2]|0)+(e<<3)|0;l=c[k+4>>2]|0;m=d+12|0;c[m>>2]=c[k>>2];c[m+4>>2]=l;m=(c[j>>2]|0)+(e+1<<3)|0;l=c[m+4>>2]|0;k=d+20|0;c[k>>2]=c[m>>2];c[k+4>>2]=l;k=d+28|0;if((e|0)>0){n=(c[j>>2]|0)+(e+ -1<<3)|0;l=c[n+4>>2]|0;m=k;c[m>>2]=c[n>>2];c[m+4>>2]=l;a[d+44>>0]=1}else{l=b+20|0;m=c[l+4>>2]|0;n=k;c[n>>2]=c[l>>2];c[n+4>>2]=m;a[d+44>>0]=a[b+36>>0]|0}k=d+36|0;if(((c[h>>2]|0)+ -2|0)>(e|0)){l=(c[j>>2]|0)+(e+2<<3)|0;m=c[l+4>>2]|0;n=k;c[n>>2]=c[l>>2];c[n+4>>2]=m;a[d+45>>0]=1;i=f;return}else{l=b+28|0;m=c[l+4>>2]|0;n=k;c[n>>2]=c[l>>2];c[n+4>>2]=m;a[d+45>>0]=a[b+37>>0]|0;i=f;return}}function ye(a){a=a|0;return}function ze(a){a=a|0;return}function Ae(a){a=a|0;return}function Be(a){a=a|0;return}function Ce(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function De(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function Ee(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+64|0;f=e;if((a|0)==(b|0)){h=1;i=e;return h|0}if((b|0)==0){h=0;i=e;return h|0}b=He(b,6952,7008,0)|0;if((b|0)==0){h=0;i=e;return h|0}h=f+0|0;g=h+56|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(g|0));c[f>>2]=b;c[f+8>>2]=a;c[f+12>>2]=-1;c[f+48>>2]=1;rb[c[(c[b>>2]|0)+28>>2]&15](b,f,c[d>>2]|0,1);if((c[f+24>>2]|0)!=1){h=0;i=e;return h|0}c[d>>2]=c[f+16>>2];h=1;i=e;return h|0}function Fe(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;if((c[d+8>>2]|0)!=(b|0)){i=g;return}b=d+16|0;h=c[b>>2]|0;if((h|0)==0){c[b>>2]=e;c[d+24>>2]=f;c[d+36>>2]=1;i=g;return}if((h|0)!=(e|0)){h=d+36|0;c[h>>2]=(c[h>>2]|0)+1;c[d+24>>2]=2;a[d+54>>0]=1;i=g;return}e=d+24|0;if((c[e>>2]|0)!=2){i=g;return}c[e>>2]=f;i=g;return}function Ge(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;if((b|0)!=(c[d+8>>2]|0)){h=c[b+8>>2]|0;rb[c[(c[h>>2]|0)+28>>2]&15](h,d,e,f);i=g;return}b=d+16|0;h=c[b>>2]|0;if((h|0)==0){c[b>>2]=e;c[d+24>>2]=f;c[d+36>>2]=1;i=g;return}if((h|0)!=(e|0)){h=d+36|0;c[h>>2]=(c[h>>2]|0)+1;c[d+24>>2]=2;a[d+54>>0]=1;i=g;return}e=d+24|0;if((c[e>>2]|0)!=2){i=g;return}c[e>>2]=f;i=g;return}function He(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=i;i=i+64|0;j=h;k=c[d>>2]|0;l=d+(c[k+ -8>>2]|0)|0;k=c[k+ -4>>2]|0;c[j>>2]=f;c[j+4>>2]=d;c[j+8>>2]=e;c[j+12>>2]=g;n=j+16|0;o=j+20|0;e=j+24|0;m=j+28|0;g=j+32|0;d=j+40|0;p=(k|0)==(f|0);q=n+0|0;f=q+36|0;do{c[q>>2]=0;q=q+4|0}while((q|0)<(f|0));b[n+36>>1]=0;a[n+38>>0]=0;if(p){c[j+48>>2]=1;ob[c[(c[k>>2]|0)+20>>2]&3](k,j,l,l,1,0);q=(c[e>>2]|0)==1?l:0;i=h;return q|0}hb[c[(c[k>>2]|0)+24>>2]&3](k,j,l,1,0);j=c[j+36>>2]|0;if((j|0)==1){if((c[e>>2]|0)!=1){if((c[d>>2]|0)!=0){q=0;i=h;return q|0}if((c[m>>2]|0)!=1){q=0;i=h;return q|0}if((c[g>>2]|0)!=1){q=0;i=h;return q|0}}q=c[n>>2]|0;i=h;return q|0}else if((j|0)==0){if((c[d>>2]|0)!=1){q=0;i=h;return q|0}if((c[m>>2]|0)!=1){q=0;i=h;return q|0}q=(c[g>>2]|0)==1?c[o>>2]|0:0;i=h;return q|0}else{q=0;i=h;return q|0}return 0}function Ie(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0;h=i;if((b|0)==(c[d+8>>2]|0)){if((c[d+4>>2]|0)!=(e|0)){i=h;return}j=d+28|0;if((c[j>>2]|0)==1){i=h;return}c[j>>2]=f;i=h;return}if((b|0)!=(c[d>>2]|0)){l=c[b+8>>2]|0;hb[c[(c[l>>2]|0)+24>>2]&3](l,d,e,f,g);i=h;return}if((c[d+16>>2]|0)!=(e|0)?(k=d+20|0,(c[k>>2]|0)!=(e|0)):0){c[d+32>>2]=f;f=d+44|0;if((c[f>>2]|0)==4){i=h;return}l=d+52|0;a[l>>0]=0;m=d+53|0;a[m>>0]=0;b=c[b+8>>2]|0;ob[c[(c[b>>2]|0)+20>>2]&3](b,d,e,e,1,g);if((a[m>>0]|0)!=0){if((a[l>>0]|0)==0){b=1;j=13}}else{b=0;j=13}do{if((j|0)==13){c[k>>2]=e;m=d+40|0;c[m>>2]=(c[m>>2]|0)+1;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==2:0){a[d+54>>0]=1;if(b){break}}else{j=16}if((j|0)==16?b:0){break}c[f>>2]=4;i=h;return}}while(0);c[f>>2]=3;i=h;return}if((f|0)!=1){i=h;return}c[d+32>>2]=1;i=h;return}function Je(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;g=i;if((c[d+8>>2]|0)==(b|0)){if((c[d+4>>2]|0)!=(e|0)){i=g;return}d=d+28|0;if((c[d>>2]|0)==1){i=g;return}c[d>>2]=f;i=g;return}if((c[d>>2]|0)!=(b|0)){i=g;return}if((c[d+16>>2]|0)!=(e|0)?(h=d+20|0,(c[h>>2]|0)!=(e|0)):0){c[d+32>>2]=f;c[h>>2]=e;b=d+40|0;c[b>>2]=(c[b>>2]|0)+1;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==2:0){a[d+54>>0]=1}c[d+44>>2]=4;i=g;return}if((f|0)!=1){i=g;return}c[d+32>>2]=1;i=g;return}function Ke(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0;j=i;if((b|0)!=(c[d+8>>2]|0)){b=c[b+8>>2]|0;ob[c[(c[b>>2]|0)+20>>2]&3](b,d,e,f,g,h);i=j;return}a[d+53>>0]=1;if((c[d+4>>2]|0)!=(f|0)){i=j;return}a[d+52>>0]=1;b=d+16|0;f=c[b>>2]|0;if((f|0)==0){c[b>>2]=e;c[d+24>>2]=g;c[d+36>>2]=1;if(!((c[d+48>>2]|0)==1&(g|0)==1)){i=j;return}a[d+54>>0]=1;i=j;return}if((f|0)!=(e|0)){h=d+36|0;c[h>>2]=(c[h>>2]|0)+1;a[d+54>>0]=1;i=j;return}e=d+24|0;b=c[e>>2]|0;if((b|0)==2){c[e>>2]=g}else{g=b}if(!((c[d+48>>2]|0)==1&(g|0)==1)){i=j;return}a[d+54>>0]=1;i=j;return}function Le(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;h=i;if((c[d+8>>2]|0)!=(b|0)){i=h;return}a[d+53>>0]=1;if((c[d+4>>2]|0)!=(f|0)){i=h;return}a[d+52>>0]=1;f=d+16|0;b=c[f>>2]|0;if((b|0)==0){c[f>>2]=e;c[d+24>>2]=g;c[d+36>>2]=1;if(!((c[d+48>>2]|0)==1&(g|0)==1)){i=h;return}a[d+54>>0]=1;i=h;return}if((b|0)!=(e|0)){b=d+36|0;c[b>>2]=(c[b>>2]|0)+1;a[d+54>>0]=1;i=h;return}e=d+24|0;f=c[e>>2]|0;if((f|0)==2){c[e>>2]=g}else{g=f}if(!((c[d+48>>2]|0)==1&(g|0)==1)){i=h;return}a[d+54>>0]=1;i=h;return}function Me(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;b=i;do{if(a>>>0<245){if(a>>>0<11){a=16}else{a=a+11&-8}v=a>>>3;r=c[1790]|0;w=r>>>v;if((w&3|0)!=0){j=(w&1^1)+v|0;h=j<<1;f=7200+(h<<2)|0;h=7200+(h+2<<2)|0;d=c[h>>2]|0;e=d+8|0;g=c[e>>2]|0;do{if((f|0)!=(g|0)){if(g>>>0<(c[7176>>2]|0)>>>0){Ya()}k=g+12|0;if((c[k>>2]|0)==(d|0)){c[k>>2]=f;c[h>>2]=g;break}else{Ya()}}else{c[1790]=r&~(1<<j)}}while(0);H=j<<3;c[d+4>>2]=H|3;H=d+(H|4)|0;c[H>>2]=c[H>>2]|1;H=e;i=b;return H|0}if(a>>>0>(c[7168>>2]|0)>>>0){if((w|0)!=0){f=2<<v;f=w<<v&(f|0-f);f=(f&0-f)+ -1|0;d=f>>>12&16;f=f>>>d;e=f>>>5&8;f=f>>>e;g=f>>>2&4;f=f>>>g;j=f>>>1&2;f=f>>>j;h=f>>>1&1;h=(e|d|g|j|h)+(f>>>h)|0;f=h<<1;j=7200+(f<<2)|0;f=7200+(f+2<<2)|0;g=c[f>>2]|0;d=g+8|0;e=c[d>>2]|0;do{if((j|0)!=(e|0)){if(e>>>0<(c[7176>>2]|0)>>>0){Ya()}k=e+12|0;if((c[k>>2]|0)==(g|0)){c[k>>2]=j;c[f>>2]=e;break}else{Ya()}}else{c[1790]=r&~(1<<h)}}while(0);h=h<<3;f=h-a|0;c[g+4>>2]=a|3;e=g+a|0;c[g+(a|4)>>2]=f|1;c[g+h>>2]=f;h=c[7168>>2]|0;if((h|0)!=0){g=c[7180>>2]|0;l=h>>>3;j=l<<1;h=7200+(j<<2)|0;k=c[1790]|0;l=1<<l;if((k&l|0)!=0){j=7200+(j+2<<2)|0;k=c[j>>2]|0;if(k>>>0<(c[7176>>2]|0)>>>0){Ya()}else{D=j;C=k}}else{c[1790]=k|l;D=7200+(j+2<<2)|0;C=h}c[D>>2]=g;c[C+12>>2]=g;c[g+8>>2]=C;c[g+12>>2]=h}c[7168>>2]=f;c[7180>>2]=e;H=d;i=b;return H|0}r=c[7164>>2]|0;if((r|0)!=0){d=(r&0-r)+ -1|0;G=d>>>12&16;d=d>>>G;F=d>>>5&8;d=d>>>F;H=d>>>2&4;d=d>>>H;h=d>>>1&2;d=d>>>h;e=d>>>1&1;e=c[7464+((F|G|H|h|e)+(d>>>e)<<2)>>2]|0;d=(c[e+4>>2]&-8)-a|0;h=e;while(1){g=c[h+16>>2]|0;if((g|0)==0){g=c[h+20>>2]|0;if((g|0)==0){break}}h=(c[g+4>>2]&-8)-a|0;f=h>>>0<d>>>0;d=f?h:d;h=g;e=f?g:e}h=c[7176>>2]|0;if(e>>>0<h>>>0){Ya()}f=e+a|0;if(!(e>>>0<f>>>0)){Ya()}g=c[e+24>>2]|0;k=c[e+12>>2]|0;do{if((k|0)==(e|0)){k=e+20|0;j=c[k>>2]|0;if((j|0)==0){k=e+16|0;j=c[k>>2]|0;if((j|0)==0){B=0;break}}while(1){l=j+20|0;m=c[l>>2]|0;if((m|0)!=0){j=m;k=l;continue}l=j+16|0;m=c[l>>2]|0;if((m|0)==0){break}else{j=m;k=l}}if(k>>>0<h>>>0){Ya()}else{c[k>>2]=0;B=j;break}}else{j=c[e+8>>2]|0;if(j>>>0<h>>>0){Ya()}h=j+12|0;if((c[h>>2]|0)!=(e|0)){Ya()}l=k+8|0;if((c[l>>2]|0)==(e|0)){c[h>>2]=k;c[l>>2]=j;B=k;break}else{Ya()}}}while(0);do{if((g|0)!=0){j=c[e+28>>2]|0;h=7464+(j<<2)|0;if((e|0)==(c[h>>2]|0)){c[h>>2]=B;if((B|0)==0){c[7164>>2]=c[7164>>2]&~(1<<j);break}}else{if(g>>>0<(c[7176>>2]|0)>>>0){Ya()}h=g+16|0;if((c[h>>2]|0)==(e|0)){c[h>>2]=B}else{c[g+20>>2]=B}if((B|0)==0){break}}if(B>>>0<(c[7176>>2]|0)>>>0){Ya()}c[B+24>>2]=g;g=c[e+16>>2]|0;do{if((g|0)!=0){if(g>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[B+16>>2]=g;c[g+24>>2]=B;break}}}while(0);g=c[e+20>>2]|0;if((g|0)!=0){if(g>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[B+20>>2]=g;c[g+24>>2]=B;break}}}}while(0);if(d>>>0<16){H=d+a|0;c[e+4>>2]=H|3;H=e+(H+4)|0;c[H>>2]=c[H>>2]|1}else{c[e+4>>2]=a|3;c[e+(a|4)>>2]=d|1;c[e+(d+a)>>2]=d;h=c[7168>>2]|0;if((h|0)!=0){g=c[7180>>2]|0;j=h>>>3;k=j<<1;h=7200+(k<<2)|0;l=c[1790]|0;j=1<<j;if((l&j|0)!=0){k=7200+(k+2<<2)|0;j=c[k>>2]|0;if(j>>>0<(c[7176>>2]|0)>>>0){Ya()}else{z=k;A=j}}else{c[1790]=l|j;z=7200+(k+2<<2)|0;A=h}c[z>>2]=g;c[A+12>>2]=g;c[g+8>>2]=A;c[g+12>>2]=h}c[7168>>2]=d;c[7180>>2]=f}H=e+8|0;i=b;return H|0}}}else{if(!(a>>>0>4294967231)){z=a+11|0;a=z&-8;B=c[7164>>2]|0;if((B|0)!=0){A=0-a|0;z=z>>>8;if((z|0)!=0){if(a>>>0>16777215){C=31}else{G=(z+1048320|0)>>>16&8;H=z<<G;F=(H+520192|0)>>>16&4;H=H<<F;C=(H+245760|0)>>>16&2;C=14-(F|G|C)+(H<<C>>>15)|0;C=a>>>(C+7|0)&1|C<<1}}else{C=0}F=c[7464+(C<<2)>>2]|0;a:do{if((F|0)==0){D=0;z=0}else{if((C|0)==31){z=0}else{z=25-(C>>>1)|0}D=0;E=a<<z;z=0;while(1){H=c[F+4>>2]&-8;G=H-a|0;if(G>>>0<A>>>0){if((H|0)==(a|0)){A=G;D=F;z=F;break a}else{A=G;z=F}}G=c[F+20>>2]|0;F=c[F+(E>>>31<<2)+16>>2]|0;D=(G|0)==0|(G|0)==(F|0)?D:G;if((F|0)==0){break}else{E=E<<1}}}}while(0);if((D|0)==0&(z|0)==0){H=2<<C;B=B&(H|0-H);if((B|0)==0){break}H=(B&0-B)+ -1|0;E=H>>>12&16;H=H>>>E;C=H>>>5&8;H=H>>>C;F=H>>>2&4;H=H>>>F;G=H>>>1&2;H=H>>>G;D=H>>>1&1;D=c[7464+((C|E|F|G|D)+(H>>>D)<<2)>>2]|0}if((D|0)!=0){while(1){C=(c[D+4>>2]&-8)-a|0;B=C>>>0<A>>>0;A=B?C:A;z=B?D:z;B=c[D+16>>2]|0;if((B|0)!=0){D=B;continue}D=c[D+20>>2]|0;if((D|0)==0){break}}}if((z|0)!=0?A>>>0<((c[7168>>2]|0)-a|0)>>>0:0){f=c[7176>>2]|0;if(z>>>0<f>>>0){Ya()}d=z+a|0;if(!(z>>>0<d>>>0)){Ya()}e=c[z+24>>2]|0;g=c[z+12>>2]|0;do{if((g|0)==(z|0)){h=z+20|0;g=c[h>>2]|0;if((g|0)==0){h=z+16|0;g=c[h>>2]|0;if((g|0)==0){x=0;break}}while(1){j=g+20|0;k=c[j>>2]|0;if((k|0)!=0){g=k;h=j;continue}j=g+16|0;k=c[j>>2]|0;if((k|0)==0){break}else{g=k;h=j}}if(h>>>0<f>>>0){Ya()}else{c[h>>2]=0;x=g;break}}else{h=c[z+8>>2]|0;if(h>>>0<f>>>0){Ya()}j=h+12|0;if((c[j>>2]|0)!=(z|0)){Ya()}f=g+8|0;if((c[f>>2]|0)==(z|0)){c[j>>2]=g;c[f>>2]=h;x=g;break}else{Ya()}}}while(0);do{if((e|0)!=0){g=c[z+28>>2]|0;f=7464+(g<<2)|0;if((z|0)==(c[f>>2]|0)){c[f>>2]=x;if((x|0)==0){c[7164>>2]=c[7164>>2]&~(1<<g);break}}else{if(e>>>0<(c[7176>>2]|0)>>>0){Ya()}f=e+16|0;if((c[f>>2]|0)==(z|0)){c[f>>2]=x}else{c[e+20>>2]=x}if((x|0)==0){break}}if(x>>>0<(c[7176>>2]|0)>>>0){Ya()}c[x+24>>2]=e;e=c[z+16>>2]|0;do{if((e|0)!=0){if(e>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[x+16>>2]=e;c[e+24>>2]=x;break}}}while(0);e=c[z+20>>2]|0;if((e|0)!=0){if(e>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[x+20>>2]=e;c[e+24>>2]=x;break}}}}while(0);b:do{if(!(A>>>0<16)){c[z+4>>2]=a|3;c[z+(a|4)>>2]=A|1;c[z+(A+a)>>2]=A;f=A>>>3;if(A>>>0<256){g=f<<1;e=7200+(g<<2)|0;h=c[1790]|0;f=1<<f;if((h&f|0)!=0){f=7200+(g+2<<2)|0;g=c[f>>2]|0;if(g>>>0<(c[7176>>2]|0)>>>0){Ya()}else{w=f;v=g}}else{c[1790]=h|f;w=7200+(g+2<<2)|0;v=e}c[w>>2]=d;c[v+12>>2]=d;c[z+(a+8)>>2]=v;c[z+(a+12)>>2]=e;break}e=A>>>8;if((e|0)!=0){if(A>>>0>16777215){e=31}else{G=(e+1048320|0)>>>16&8;H=e<<G;F=(H+520192|0)>>>16&4;H=H<<F;e=(H+245760|0)>>>16&2;e=14-(F|G|e)+(H<<e>>>15)|0;e=A>>>(e+7|0)&1|e<<1}}else{e=0}f=7464+(e<<2)|0;c[z+(a+28)>>2]=e;c[z+(a+20)>>2]=0;c[z+(a+16)>>2]=0;h=c[7164>>2]|0;g=1<<e;if((h&g|0)==0){c[7164>>2]=h|g;c[f>>2]=d;c[z+(a+24)>>2]=f;c[z+(a+12)>>2]=d;c[z+(a+8)>>2]=d;break}f=c[f>>2]|0;if((e|0)==31){e=0}else{e=25-(e>>>1)|0}c:do{if((c[f+4>>2]&-8|0)!=(A|0)){e=A<<e;g=f;while(1){h=g+(e>>>31<<2)+16|0;f=c[h>>2]|0;if((f|0)==0){break}if((c[f+4>>2]&-8|0)==(A|0)){r=f;break c}else{e=e<<1;g=f}}if(h>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[h>>2]=d;c[z+(a+24)>>2]=g;c[z+(a+12)>>2]=d;c[z+(a+8)>>2]=d;break b}}else{r=f}}while(0);f=r+8|0;e=c[f>>2]|0;g=c[7176>>2]|0;if(r>>>0<g>>>0){Ya()}if(e>>>0<g>>>0){Ya()}else{c[e+12>>2]=d;c[f>>2]=d;c[z+(a+8)>>2]=e;c[z+(a+12)>>2]=r;c[z+(a+24)>>2]=0;break}}else{H=A+a|0;c[z+4>>2]=H|3;H=z+(H+4)|0;c[H>>2]=c[H>>2]|1}}while(0);H=z+8|0;i=b;return H|0}}}else{a=-1}}}while(0);r=c[7168>>2]|0;if(!(a>>>0>r>>>0)){e=r-a|0;d=c[7180>>2]|0;if(e>>>0>15){c[7180>>2]=d+a;c[7168>>2]=e;c[d+(a+4)>>2]=e|1;c[d+r>>2]=e;c[d+4>>2]=a|3}else{c[7168>>2]=0;c[7180>>2]=0;c[d+4>>2]=r|3;H=d+(r+4)|0;c[H>>2]=c[H>>2]|1}H=d+8|0;i=b;return H|0}r=c[7172>>2]|0;if(a>>>0<r>>>0){G=r-a|0;c[7172>>2]=G;H=c[7184>>2]|0;c[7184>>2]=H+a;c[H+(a+4)>>2]=G|1;c[H+4>>2]=a|3;H=H+8|0;i=b;return H|0}do{if((c[1908]|0)==0){r=Ja(30)|0;if((r+ -1&r|0)==0){c[7640>>2]=r;c[7636>>2]=r;c[7644>>2]=-1;c[7648>>2]=-1;c[7652>>2]=0;c[7604>>2]=0;c[1908]=(_a(0)|0)&-16^1431655768;break}else{Ya()}}}while(0);w=a+48|0;A=c[7640>>2]|0;x=a+47|0;z=A+x|0;A=0-A|0;v=z&A;if(!(v>>>0>a>>>0)){H=0;i=b;return H|0}r=c[7600>>2]|0;if((r|0)!=0?(G=c[7592>>2]|0,H=G+v|0,H>>>0<=G>>>0|H>>>0>r>>>0):0){H=0;i=b;return H|0}d:do{if((c[7604>>2]&4|0)==0){B=c[7184>>2]|0;e:do{if((B|0)!=0){r=7608|0;while(1){C=c[r>>2]|0;if(!(C>>>0>B>>>0)?(y=r+4|0,(C+(c[y>>2]|0)|0)>>>0>B>>>0):0){break}r=c[r+8>>2]|0;if((r|0)==0){o=182;break e}}if((r|0)!=0){A=z-(c[7172>>2]|0)&A;if(A>>>0<2147483647){o=Da(A|0)|0;B=(o|0)==((c[r>>2]|0)+(c[y>>2]|0)|0);y=o;z=A;r=B?o:-1;A=B?A:0;o=191}else{A=0}}else{o=182}}else{o=182}}while(0);do{if((o|0)==182){r=Da(0)|0;if((r|0)!=(-1|0)){A=r;y=c[7636>>2]|0;z=y+ -1|0;if((z&A|0)==0){A=v}else{A=v-A+(z+A&0-y)|0}B=c[7592>>2]|0;z=B+A|0;if(A>>>0>a>>>0&A>>>0<2147483647){y=c[7600>>2]|0;if((y|0)!=0?z>>>0<=B>>>0|z>>>0>y>>>0:0){A=0;break}y=Da(A|0)|0;o=(y|0)==(r|0);z=A;r=o?r:-1;A=o?A:0;o=191}else{A=0}}else{A=0}}}while(0);f:do{if((o|0)==191){o=0-z|0;if((r|0)!=(-1|0)){p=A;o=202;break d}do{if((y|0)!=(-1|0)&z>>>0<2147483647&z>>>0<w>>>0?(u=c[7640>>2]|0,u=x-z+u&0-u,u>>>0<2147483647):0){if((Da(u|0)|0)==(-1|0)){Da(o|0)|0;break f}else{z=u+z|0;break}}}while(0);if((y|0)!=(-1|0)){r=y;p=z;o=202;break d}}}while(0);c[7604>>2]=c[7604>>2]|4;o=199}else{A=0;o=199}}while(0);if((((o|0)==199?v>>>0<2147483647:0)?(s=Da(v|0)|0,t=Da(0)|0,(t|0)!=(-1|0)&(s|0)!=(-1|0)&s>>>0<t>>>0):0)?(p=t-s|0,q=p>>>0>(a+40|0)>>>0,q):0){r=s;p=q?p:A;o=202}if((o|0)==202){q=(c[7592>>2]|0)+p|0;c[7592>>2]=q;if(q>>>0>(c[7596>>2]|0)>>>0){c[7596>>2]=q}q=c[7184>>2]|0;g:do{if((q|0)!=0){v=7608|0;while(1){w=c[v>>2]|0;t=v+4|0;u=c[t>>2]|0;if((r|0)==(w+u|0)){o=214;break}s=c[v+8>>2]|0;if((s|0)==0){break}else{v=s}}if(((o|0)==214?(c[v+12>>2]&8|0)==0:0)?q>>>0>=w>>>0&q>>>0<r>>>0:0){c[t>>2]=u+p;d=(c[7172>>2]|0)+p|0;e=q+8|0;if((e&7|0)==0){e=0}else{e=0-e&7}H=d-e|0;c[7184>>2]=q+e;c[7172>>2]=H;c[q+(e+4)>>2]=H|1;c[q+(d+4)>>2]=40;c[7188>>2]=c[7648>>2];break}if(r>>>0<(c[7176>>2]|0)>>>0){c[7176>>2]=r}t=r+p|0;s=7608|0;while(1){if((c[s>>2]|0)==(t|0)){o=224;break}u=c[s+8>>2]|0;if((u|0)==0){break}else{s=u}}if((o|0)==224?(c[s+12>>2]&8|0)==0:0){c[s>>2]=r;h=s+4|0;c[h>>2]=(c[h>>2]|0)+p;h=r+8|0;if((h&7|0)==0){h=0}else{h=0-h&7}j=r+(p+8)|0;if((j&7|0)==0){n=0}else{n=0-j&7}o=r+(n+p)|0;j=h+a|0;k=r+j|0;m=o-(r+h)-a|0;c[r+(h+4)>>2]=a|3;h:do{if((o|0)!=(c[7184>>2]|0)){if((o|0)==(c[7180>>2]|0)){H=(c[7168>>2]|0)+m|0;c[7168>>2]=H;c[7180>>2]=k;c[r+(j+4)>>2]=H|1;c[r+(H+j)>>2]=H;break}q=p+4|0;t=c[r+(q+n)>>2]|0;if((t&3|0)==1){a=t&-8;s=t>>>3;do{if(!(t>>>0<256)){l=c[r+((n|24)+p)>>2]|0;v=c[r+(p+12+n)>>2]|0;do{if((v|0)==(o|0)){u=n|16;t=r+(q+u)|0;s=c[t>>2]|0;if((s|0)==0){t=r+(u+p)|0;s=c[t>>2]|0;if((s|0)==0){g=0;break}}while(1){v=s+20|0;u=c[v>>2]|0;if((u|0)!=0){s=u;t=v;continue}v=s+16|0;u=c[v>>2]|0;if((u|0)==0){break}else{s=u;t=v}}if(t>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[t>>2]=0;g=s;break}}else{s=c[r+((n|8)+p)>>2]|0;if(s>>>0<(c[7176>>2]|0)>>>0){Ya()}t=s+12|0;if((c[t>>2]|0)!=(o|0)){Ya()}u=v+8|0;if((c[u>>2]|0)==(o|0)){c[t>>2]=v;c[u>>2]=s;g=v;break}else{Ya()}}}while(0);if((l|0)!=0){s=c[r+(p+28+n)>>2]|0;t=7464+(s<<2)|0;if((o|0)==(c[t>>2]|0)){c[t>>2]=g;if((g|0)==0){c[7164>>2]=c[7164>>2]&~(1<<s);break}}else{if(l>>>0<(c[7176>>2]|0)>>>0){Ya()}s=l+16|0;if((c[s>>2]|0)==(o|0)){c[s>>2]=g}else{c[l+20>>2]=g}if((g|0)==0){break}}if(g>>>0<(c[7176>>2]|0)>>>0){Ya()}c[g+24>>2]=l;l=n|16;o=c[r+(l+p)>>2]|0;do{if((o|0)!=0){if(o>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[g+16>>2]=o;c[o+24>>2]=g;break}}}while(0);l=c[r+(q+l)>>2]|0;if((l|0)!=0){if(l>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[g+20>>2]=l;c[l+24>>2]=g;break}}}}else{q=c[r+((n|8)+p)>>2]|0;g=c[r+(p+12+n)>>2]|0;t=7200+(s<<1<<2)|0;if((q|0)!=(t|0)){if(q>>>0<(c[7176>>2]|0)>>>0){Ya()}if((c[q+12>>2]|0)!=(o|0)){Ya()}}if((g|0)==(q|0)){c[1790]=c[1790]&~(1<<s);break}if((g|0)!=(t|0)){if(g>>>0<(c[7176>>2]|0)>>>0){Ya()}s=g+8|0;if((c[s>>2]|0)==(o|0)){l=s}else{Ya()}}else{l=g+8|0}c[q+12>>2]=g;c[l>>2]=q}}while(0);o=r+((a|n)+p)|0;m=a+m|0}g=o+4|0;c[g>>2]=c[g>>2]&-2;c[r+(j+4)>>2]=m|1;c[r+(m+j)>>2]=m;g=m>>>3;if(m>>>0<256){l=g<<1;d=7200+(l<<2)|0;m=c[1790]|0;g=1<<g;if((m&g|0)!=0){l=7200+(l+2<<2)|0;g=c[l>>2]|0;if(g>>>0<(c[7176>>2]|0)>>>0){Ya()}else{f=l;e=g}}else{c[1790]=m|g;f=7200+(l+2<<2)|0;e=d}c[f>>2]=k;c[e+12>>2]=k;c[r+(j+8)>>2]=e;c[r+(j+12)>>2]=d;break}e=m>>>8;if((e|0)!=0){if(m>>>0>16777215){e=31}else{G=(e+1048320|0)>>>16&8;H=e<<G;F=(H+520192|0)>>>16&4;H=H<<F;e=(H+245760|0)>>>16&2;e=14-(F|G|e)+(H<<e>>>15)|0;e=m>>>(e+7|0)&1|e<<1}}else{e=0}f=7464+(e<<2)|0;c[r+(j+28)>>2]=e;c[r+(j+20)>>2]=0;c[r+(j+16)>>2]=0;l=c[7164>>2]|0;g=1<<e;if((l&g|0)==0){c[7164>>2]=l|g;c[f>>2]=k;c[r+(j+24)>>2]=f;c[r+(j+12)>>2]=k;c[r+(j+8)>>2]=k;break}f=c[f>>2]|0;if((e|0)==31){e=0}else{e=25-(e>>>1)|0}i:do{if((c[f+4>>2]&-8|0)!=(m|0)){e=m<<e;while(1){g=f+(e>>>31<<2)+16|0;l=c[g>>2]|0;if((l|0)==0){break}if((c[l+4>>2]&-8|0)==(m|0)){d=l;break i}else{e=e<<1;f=l}}if(g>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[g>>2]=k;c[r+(j+24)>>2]=f;c[r+(j+12)>>2]=k;c[r+(j+8)>>2]=k;break h}}else{d=f}}while(0);f=d+8|0;e=c[f>>2]|0;g=c[7176>>2]|0;if(d>>>0<g>>>0){Ya()}if(e>>>0<g>>>0){Ya()}else{c[e+12>>2]=k;c[f>>2]=k;c[r+(j+8)>>2]=e;c[r+(j+12)>>2]=d;c[r+(j+24)>>2]=0;break}}else{H=(c[7172>>2]|0)+m|0;c[7172>>2]=H;c[7184>>2]=k;c[r+(j+4)>>2]=H|1}}while(0);H=r+(h|8)|0;i=b;return H|0}e=7608|0;while(1){d=c[e>>2]|0;if(!(d>>>0>q>>>0)?(n=c[e+4>>2]|0,m=d+n|0,m>>>0>q>>>0):0){break}e=c[e+8>>2]|0}e=d+(n+ -39)|0;if((e&7|0)==0){e=0}else{e=0-e&7}d=d+(n+ -47+e)|0;d=d>>>0<(q+16|0)>>>0?q:d;e=d+8|0;f=r+8|0;if((f&7|0)==0){f=0}else{f=0-f&7}H=p+ -40-f|0;c[7184>>2]=r+f;c[7172>>2]=H;c[r+(f+4)>>2]=H|1;c[r+(p+ -36)>>2]=40;c[7188>>2]=c[7648>>2];c[d+4>>2]=27;c[e+0>>2]=c[7608>>2];c[e+4>>2]=c[7612>>2];c[e+8>>2]=c[7616>>2];c[e+12>>2]=c[7620>>2];c[7608>>2]=r;c[7612>>2]=p;c[7620>>2]=0;c[7616>>2]=e;e=d+28|0;c[e>>2]=7;if((d+32|0)>>>0<m>>>0){do{H=e;e=e+4|0;c[e>>2]=7}while((H+8|0)>>>0<m>>>0)}if((d|0)!=(q|0)){d=d-q|0;e=q+(d+4)|0;c[e>>2]=c[e>>2]&-2;c[q+4>>2]=d|1;c[q+d>>2]=d;e=d>>>3;if(d>>>0<256){f=e<<1;d=7200+(f<<2)|0;g=c[1790]|0;e=1<<e;if((g&e|0)!=0){f=7200+(f+2<<2)|0;e=c[f>>2]|0;if(e>>>0<(c[7176>>2]|0)>>>0){Ya()}else{k=f;j=e}}else{c[1790]=g|e;k=7200+(f+2<<2)|0;j=d}c[k>>2]=q;c[j+12>>2]=q;c[q+8>>2]=j;c[q+12>>2]=d;break}e=d>>>8;if((e|0)!=0){if(d>>>0>16777215){e=31}else{G=(e+1048320|0)>>>16&8;H=e<<G;F=(H+520192|0)>>>16&4;H=H<<F;e=(H+245760|0)>>>16&2;e=14-(F|G|e)+(H<<e>>>15)|0;e=d>>>(e+7|0)&1|e<<1}}else{e=0}j=7464+(e<<2)|0;c[q+28>>2]=e;c[q+20>>2]=0;c[q+16>>2]=0;f=c[7164>>2]|0;g=1<<e;if((f&g|0)==0){c[7164>>2]=f|g;c[j>>2]=q;c[q+24>>2]=j;c[q+12>>2]=q;c[q+8>>2]=q;break}f=c[j>>2]|0;if((e|0)==31){e=0}else{e=25-(e>>>1)|0}j:do{if((c[f+4>>2]&-8|0)!=(d|0)){e=d<<e;while(1){j=f+(e>>>31<<2)+16|0;g=c[j>>2]|0;if((g|0)==0){break}if((c[g+4>>2]&-8|0)==(d|0)){h=g;break j}else{e=e<<1;f=g}}if(j>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[j>>2]=q;c[q+24>>2]=f;c[q+12>>2]=q;c[q+8>>2]=q;break g}}else{h=f}}while(0);f=h+8|0;e=c[f>>2]|0;d=c[7176>>2]|0;if(h>>>0<d>>>0){Ya()}if(e>>>0<d>>>0){Ya()}else{c[e+12>>2]=q;c[f>>2]=q;c[q+8>>2]=e;c[q+12>>2]=h;c[q+24>>2]=0;break}}}else{H=c[7176>>2]|0;if((H|0)==0|r>>>0<H>>>0){c[7176>>2]=r}c[7608>>2]=r;c[7612>>2]=p;c[7620>>2]=0;c[7196>>2]=c[1908];c[7192>>2]=-1;d=0;do{H=d<<1;G=7200+(H<<2)|0;c[7200+(H+3<<2)>>2]=G;c[7200+(H+2<<2)>>2]=G;d=d+1|0}while((d|0)!=32);d=r+8|0;if((d&7|0)==0){d=0}else{d=0-d&7}H=p+ -40-d|0;c[7184>>2]=r+d;c[7172>>2]=H;c[r+(d+4)>>2]=H|1;c[r+(p+ -36)>>2]=40;c[7188>>2]=c[7648>>2]}}while(0);d=c[7172>>2]|0;if(d>>>0>a>>>0){G=d-a|0;c[7172>>2]=G;H=c[7184>>2]|0;c[7184>>2]=H+a;c[H+(a+4)>>2]=G|1;c[H+4>>2]=a|3;H=H+8|0;i=b;return H|0}}c[(Sa()|0)>>2]=12;H=0;i=b;return H|0}function Ne(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;b=i;if((a|0)==0){i=b;return}q=a+ -8|0;r=c[7176>>2]|0;if(q>>>0<r>>>0){Ya()}o=c[a+ -4>>2]|0;n=o&3;if((n|0)==1){Ya()}j=o&-8;h=a+(j+ -8)|0;do{if((o&1|0)==0){u=c[q>>2]|0;if((n|0)==0){i=b;return}q=-8-u|0;o=a+q|0;n=u+j|0;if(o>>>0<r>>>0){Ya()}if((o|0)==(c[7180>>2]|0)){d=a+(j+ -4)|0;if((c[d>>2]&3|0)!=3){d=o;m=n;break}c[7168>>2]=n;c[d>>2]=c[d>>2]&-2;c[a+(q+4)>>2]=n|1;c[h>>2]=n;i=b;return}t=u>>>3;if(u>>>0<256){d=c[a+(q+8)>>2]|0;m=c[a+(q+12)>>2]|0;p=7200+(t<<1<<2)|0;if((d|0)!=(p|0)){if(d>>>0<r>>>0){Ya()}if((c[d+12>>2]|0)!=(o|0)){Ya()}}if((m|0)==(d|0)){c[1790]=c[1790]&~(1<<t);d=o;m=n;break}if((m|0)!=(p|0)){if(m>>>0<r>>>0){Ya()}p=m+8|0;if((c[p>>2]|0)==(o|0)){s=p}else{Ya()}}else{s=m+8|0}c[d+12>>2]=m;c[s>>2]=d;d=o;m=n;break}s=c[a+(q+24)>>2]|0;t=c[a+(q+12)>>2]|0;do{if((t|0)==(o|0)){u=a+(q+20)|0;t=c[u>>2]|0;if((t|0)==0){u=a+(q+16)|0;t=c[u>>2]|0;if((t|0)==0){p=0;break}}while(1){w=t+20|0;v=c[w>>2]|0;if((v|0)!=0){t=v;u=w;continue}v=t+16|0;w=c[v>>2]|0;if((w|0)==0){break}else{t=w;u=v}}if(u>>>0<r>>>0){Ya()}else{c[u>>2]=0;p=t;break}}else{u=c[a+(q+8)>>2]|0;if(u>>>0<r>>>0){Ya()}r=u+12|0;if((c[r>>2]|0)!=(o|0)){Ya()}v=t+8|0;if((c[v>>2]|0)==(o|0)){c[r>>2]=t;c[v>>2]=u;p=t;break}else{Ya()}}}while(0);if((s|0)!=0){t=c[a+(q+28)>>2]|0;r=7464+(t<<2)|0;if((o|0)==(c[r>>2]|0)){c[r>>2]=p;if((p|0)==0){c[7164>>2]=c[7164>>2]&~(1<<t);d=o;m=n;break}}else{if(s>>>0<(c[7176>>2]|0)>>>0){Ya()}r=s+16|0;if((c[r>>2]|0)==(o|0)){c[r>>2]=p}else{c[s+20>>2]=p}if((p|0)==0){d=o;m=n;break}}if(p>>>0<(c[7176>>2]|0)>>>0){Ya()}c[p+24>>2]=s;r=c[a+(q+16)>>2]|0;do{if((r|0)!=0){if(r>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[p+16>>2]=r;c[r+24>>2]=p;break}}}while(0);q=c[a+(q+20)>>2]|0;if((q|0)!=0){if(q>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[p+20>>2]=q;c[q+24>>2]=p;d=o;m=n;break}}else{d=o;m=n}}else{d=o;m=n}}else{d=q;m=j}}while(0);if(!(d>>>0<h>>>0)){Ya()}n=a+(j+ -4)|0;o=c[n>>2]|0;if((o&1|0)==0){Ya()}if((o&2|0)==0){if((h|0)==(c[7184>>2]|0)){w=(c[7172>>2]|0)+m|0;c[7172>>2]=w;c[7184>>2]=d;c[d+4>>2]=w|1;if((d|0)!=(c[7180>>2]|0)){i=b;return}c[7180>>2]=0;c[7168>>2]=0;i=b;return}if((h|0)==(c[7180>>2]|0)){w=(c[7168>>2]|0)+m|0;c[7168>>2]=w;c[7180>>2]=d;c[d+4>>2]=w|1;c[d+w>>2]=w;i=b;return}m=(o&-8)+m|0;n=o>>>3;do{if(!(o>>>0<256)){l=c[a+(j+16)>>2]|0;q=c[a+(j|4)>>2]|0;do{if((q|0)==(h|0)){o=a+(j+12)|0;n=c[o>>2]|0;if((n|0)==0){o=a+(j+8)|0;n=c[o>>2]|0;if((n|0)==0){k=0;break}}while(1){p=n+20|0;q=c[p>>2]|0;if((q|0)!=0){n=q;o=p;continue}p=n+16|0;q=c[p>>2]|0;if((q|0)==0){break}else{n=q;o=p}}if(o>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[o>>2]=0;k=n;break}}else{o=c[a+j>>2]|0;if(o>>>0<(c[7176>>2]|0)>>>0){Ya()}p=o+12|0;if((c[p>>2]|0)!=(h|0)){Ya()}n=q+8|0;if((c[n>>2]|0)==(h|0)){c[p>>2]=q;c[n>>2]=o;k=q;break}else{Ya()}}}while(0);if((l|0)!=0){n=c[a+(j+20)>>2]|0;o=7464+(n<<2)|0;if((h|0)==(c[o>>2]|0)){c[o>>2]=k;if((k|0)==0){c[7164>>2]=c[7164>>2]&~(1<<n);break}}else{if(l>>>0<(c[7176>>2]|0)>>>0){Ya()}n=l+16|0;if((c[n>>2]|0)==(h|0)){c[n>>2]=k}else{c[l+20>>2]=k}if((k|0)==0){break}}if(k>>>0<(c[7176>>2]|0)>>>0){Ya()}c[k+24>>2]=l;h=c[a+(j+8)>>2]|0;do{if((h|0)!=0){if(h>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[k+16>>2]=h;c[h+24>>2]=k;break}}}while(0);h=c[a+(j+12)>>2]|0;if((h|0)!=0){if(h>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[k+20>>2]=h;c[h+24>>2]=k;break}}}}else{k=c[a+j>>2]|0;a=c[a+(j|4)>>2]|0;j=7200+(n<<1<<2)|0;if((k|0)!=(j|0)){if(k>>>0<(c[7176>>2]|0)>>>0){Ya()}if((c[k+12>>2]|0)!=(h|0)){Ya()}}if((a|0)==(k|0)){c[1790]=c[1790]&~(1<<n);break}if((a|0)!=(j|0)){if(a>>>0<(c[7176>>2]|0)>>>0){Ya()}j=a+8|0;if((c[j>>2]|0)==(h|0)){l=j}else{Ya()}}else{l=a+8|0}c[k+12>>2]=a;c[l>>2]=k}}while(0);c[d+4>>2]=m|1;c[d+m>>2]=m;if((d|0)==(c[7180>>2]|0)){c[7168>>2]=m;i=b;return}}else{c[n>>2]=o&-2;c[d+4>>2]=m|1;c[d+m>>2]=m}h=m>>>3;if(m>>>0<256){a=h<<1;e=7200+(a<<2)|0;j=c[1790]|0;h=1<<h;if((j&h|0)!=0){h=7200+(a+2<<2)|0;a=c[h>>2]|0;if(a>>>0<(c[7176>>2]|0)>>>0){Ya()}else{f=h;g=a}}else{c[1790]=j|h;f=7200+(a+2<<2)|0;g=e}c[f>>2]=d;c[g+12>>2]=d;c[d+8>>2]=g;c[d+12>>2]=e;i=b;return}f=m>>>8;if((f|0)!=0){if(m>>>0>16777215){f=31}else{v=(f+1048320|0)>>>16&8;w=f<<v;u=(w+520192|0)>>>16&4;w=w<<u;f=(w+245760|0)>>>16&2;f=14-(u|v|f)+(w<<f>>>15)|0;f=m>>>(f+7|0)&1|f<<1}}else{f=0}g=7464+(f<<2)|0;c[d+28>>2]=f;c[d+20>>2]=0;c[d+16>>2]=0;a=c[7164>>2]|0;h=1<<f;a:do{if((a&h|0)!=0){g=c[g>>2]|0;if((f|0)==31){f=0}else{f=25-(f>>>1)|0}b:do{if((c[g+4>>2]&-8|0)!=(m|0)){f=m<<f;a=g;while(1){h=a+(f>>>31<<2)+16|0;g=c[h>>2]|0;if((g|0)==0){break}if((c[g+4>>2]&-8|0)==(m|0)){e=g;break b}else{f=f<<1;a=g}}if(h>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[h>>2]=d;c[d+24>>2]=a;c[d+12>>2]=d;c[d+8>>2]=d;break a}}else{e=g}}while(0);g=e+8|0;f=c[g>>2]|0;h=c[7176>>2]|0;if(e>>>0<h>>>0){Ya()}if(f>>>0<h>>>0){Ya()}else{c[f+12>>2]=d;c[g>>2]=d;c[d+8>>2]=f;c[d+12>>2]=e;c[d+24>>2]=0;break}}else{c[7164>>2]=a|h;c[g>>2]=d;c[d+24>>2]=g;c[d+12>>2]=d;c[d+8>>2]=d}}while(0);w=(c[7192>>2]|0)+ -1|0;c[7192>>2]=w;if((w|0)==0){d=7616|0}else{i=b;return}while(1){d=c[d>>2]|0;if((d|0)==0){break}else{d=d+8|0}}c[7192>>2]=-1;i=b;return}function Oe(a){a=a|0;var b=0,d=0;b=i;a=(a|0)==0?1:a;while(1){d=Me(a)|0;if((d|0)!=0){a=6;break}d=c[1914]|0;c[1914]=d+0;if((d|0)==0){a=5;break}mb[d&3]()}if((a|0)==5){d=ya(4)|0;c[d>>2]=7672;qa(d|0,7720,30)}else if((a|0)==6){i=b;return d|0}return 0}function Pe(a){a=a|0;var b=0;b=i;a=Oe(a)|0;i=b;return a|0}function Qe(a){a=a|0;var b=0;b=i;if((a|0)!=0){Ne(a)}i=b;return}function Re(a){a=a|0;var b=0;b=i;Ta(a|0);Qe(a);i=b;return}function Se(a){a=a|0;var b=0;b=i;Ta(a|0);i=b;return}function Te(a){a=a|0;return 7688}function Ue(){c[1932]=m}function Ve(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;if((e|0)>=20){d=d&255;i=b&3;h=d|d<<8|d<<16|d<<24;g=f&~3;if(i){i=b+4-i|0;while((b|0)<(i|0)){a[b>>0]=d;b=b+1|0}}while((b|0)<(g|0)){c[b>>2]=h;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return b-e|0}function We(b){b=b|0;var c=0;c=b;while(a[c>>0]|0){c=c+1|0}return c-b|0}function Xe(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;if((e|0)>=4096)return La(b|0,d|0,e|0)|0;f=b|0;if((b&3)==(d&3)){while(b&3){if((e|0)==0)return f|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}function Ye(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return gb[a&7](b|0,c|0,d|0)|0}function Ze(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;hb[a&3](b|0,c|0,d|0,e|0,f|0)}function _e(a,b){a=a|0;b=b|0;ib[a&31](b|0)}function $e(a,b,c){a=a|0;b=b|0;c=c|0;jb[a&15](b|0,c|0)}function af(a,b){a=a|0;b=b|0;return kb[a&3](b|0)|0}function bf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;lb[a&3](b|0,c|0,d|0)}function cf(a){a=a|0;mb[a&3]()}function df(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;nb[a&3](b|0,c|0,+d)}function ef(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;ob[a&3](b|0,c|0,d|0,e|0,f|0,g|0)}function ff(a,b,c){a=a|0;b=b|0;c=c|0;return pb[a&3](b|0,c|0)|0}function gf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return qb[a&15](b|0,c|0,d|0,e|0,f|0)|0}function hf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;rb[a&15](b|0,c|0,d|0,e|0)}function jf(a,b,c){a=a|0;b=b|0;c=c|0;$(0);return 0}function kf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;$(1)}function lf(a){a=a|0;$(2)}function mf(a,b){a=a|0;b=b|0;$(3)}function nf(a){a=a|0;$(4);return 0}function of(a,b,c){a=a|0;b=b|0;c=c|0;$(5)}function pf(){$(6)}function qf(){eb()}function rf(a,b,c){a=a|0;b=b|0;c=+c;$(7)}function sf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;$(8)}function tf(a,b){a=a|0;b=b|0;$(9);return 0}function uf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;$(10);return 0}function vf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;$(11)}
+
+
+
+
+// EMSCRIPTEN_END_FUNCS
+var gb=[jf,Kb,Rb,Kc,Ee,jf,jf,jf];var hb=[kf,Je,Ie,kf];var ib=[lf,Cb,Gb,Db,Fb,gc,uc,fc,zc,pd,qd,ud,vd,zd,Ad,Ed,Fd,Jd,Kd,ce,de,he,ie,me,ne,ze,Ce,Ae,Be,De,Se,Re];var jb=[mf,vc,wc,ke,Cd,Hd,sd,xd,ae,fe,mf,mf,mf,mf,mf,mf];var kb=[nf,Jb,Qb,Te];var lb=[of,xc,yc,of];var mb=[pf,qf,Eb,pf];var nb=[rf,Nb,Ub,rf];var ob=[sf,Le,Ke,sf];var pb=[tf,Ib,Ob,oc];var qb=[uf,Lb,Sb,je,Bd,Gd,rd,wd,$d,ee,uf,uf,uf,uf,uf,uf];var rb=[vf,Mb,Tb,td,yd,Dd,Id,be,ge,le,Fe,Ge,vf,vf,vf,vf];return{_strlen:We,_free:Ne,_main:Bb,_memset:Ve,_malloc:Me,_memcpy:Xe,runPostSets:Ue,stackAlloc:sb,stackSave:tb,stackRestore:ub,setThrew:vb,setTempRet0:yb,getTempRet0:zb,dynCall_iiii:Ye,dynCall_viiiii:Ze,dynCall_vi:_e,dynCall_vii:$e,dynCall_ii:af,dynCall_viii:bf,dynCall_v:cf,dynCall_viid:df,dynCall_viiiiii:ef,dynCall_iii:ff,dynCall_iiiiii:gf,dynCall_viiii:hf}
+// EMSCRIPTEN_END_ASM
+
+})({Math:Math,Int8Array:Int8Array,Int16Array:Int16Array,Int32Array:Int32Array,Uint8Array:Uint8Array,Uint16Array:Uint16Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array},{abort:E,assert:z,asmPrintInt:function(a,b){q.print("int "+a+","+b)},asmPrintFloat:function(a,b){q.print("float "+a+","+b)},min:ta,invoke_iiii:function(a,b,c,d){try{return q.dynCall_iiii(a,b,c,d)}catch(f){"number"!==typeof f&&"longjmp"!==f&&e(f),$.setThrew(1,0)}},invoke_viiiii:function(a,
+b,c,d,f,g){try{q.dynCall_viiiii(a,b,c,d,f,g)}catch(h){"number"!==typeof h&&"longjmp"!==h&&e(h),$.setThrew(1,0)}},invoke_vi:function(a,b){try{q.dynCall_vi(a,b)}catch(c){"number"!==typeof c&&"longjmp"!==c&&e(c),$.setThrew(1,0)}},invoke_vii:function(a,b,c){try{q.dynCall_vii(a,b,c)}catch(d){"number"!==typeof d&&"longjmp"!==d&&e(d),$.setThrew(1,0)}},invoke_ii:function(a,b){try{return q.dynCall_ii(a,b)}catch(c){"number"!==typeof c&&"longjmp"!==c&&e(c),$.setThrew(1,0)}},invoke_viii:function(a,b,c,d){try{q.dynCall_viii(a,
+b,c,d)}catch(f){"number"!==typeof f&&"longjmp"!==f&&e(f),$.setThrew(1,0)}},invoke_v:function(a){try{q.dynCall_v(a)}catch(b){"number"!==typeof b&&"longjmp"!==b&&e(b),$.setThrew(1,0)}},invoke_viid:function(a,b,c,d){try{q.dynCall_viid(a,b,c,d)}catch(f){"number"!==typeof f&&"longjmp"!==f&&e(f),$.setThrew(1,0)}},invoke_viiiiii:function(a,b,c,d,f,g,h){try{q.dynCall_viiiiii(a,b,c,d,f,g,h)}catch(k){"number"!==typeof k&&"longjmp"!==k&&e(k),$.setThrew(1,0)}},invoke_iii:function(a,b,c){try{return q.dynCall_iii(a,
+b,c)}catch(d){"number"!==typeof d&&"longjmp"!==d&&e(d),$.setThrew(1,0)}},invoke_iiiiii:function(a,b,c,d,f,g){try{return q.dynCall_iiiiii(a,b,c,d,f,g)}catch(h){"number"!==typeof h&&"longjmp"!==h&&e(h),$.setThrew(1,0)}},invoke_viiii:function(a,b,c,d,f){try{q.dynCall_viiii(a,b,c,d,f)}catch(g){"number"!==typeof g&&"longjmp"!==g&&e(g),$.setThrew(1,0)}},___cxa_throw:jb,_emscripten_run_script:function(a){eval(B(a))},_cosf:Va,_send:function(a,b,c){return!Z.bc(a)?(ob(T.ha),-1):kc(a,b,c)},__ZSt9terminatev:function(){lb(-1234)},
+__reallyNegative:oc,___cxa_is_number_type:fb,___assert_fail:function(a,b,c,d){J=l;e("Assertion failed: "+B(a)+", at: "+[b?B(b):"unknown filename",c,d?B(d):"unknown function"]+" at "+Ca())},___cxa_allocate_exception:function(a){return Aa(a+ib)+ib},___cxa_find_matching_catch:function(a,b){-1==a&&(a=hb);header=a-ib;-1==b&&(b=M[header>>2]);var c=Array.prototype.slice.call(arguments,2);0!=b&&!fb(b)&&0==M[M[b>>2]-8>>2]&&(a=M[a>>2]);for(var d=0;d<c.length;d++)if(gb(c[d],b,a))return($.setTempRet0(c[d]),a)|
+0;return($.setTempRet0(b),a)|0},_fflush:p(),_pwrite:function(a,b,c,d){a=X[a];if(!a)return ob(T.ha),-1;try{return cc(a,L,b,c,d)}catch(f){return Jb(f),-1}},___setErrNo:ob,_sbrk:Tc,___cxa_begin_catch:function(a){eb.Xa--;vc.push(hb);return a},_sinf:Wa,_fileno:lc,___resumeException:function(a){hb||(hb=a);e(a+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.")},__ZSt18uncaught_exceptionv:eb,_sysconf:function(a){switch(a){case 30:return 4096;
+case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 79:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1;
+case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1E3;case 89:return 700;case 71:return 256;
+case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return 1}ob(T.u);return-1},_clock:uc,_emscripten_memcpy_big:function(a,b,c){P.set(P.subarray(b,b+c),a);return a},_puts:function(a){var b=M[Cb>>2],a=sc(a,b);return 0>a?a:0>tc(10,b)?-1:a+1},_mkport:jc,_floorf:rc,_sqrtf:Xa,_write:kc,_emscripten_set_main_loop:function(a,b,c,d){q.noExitRuntime=l;z(!xc,"there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one, if you want to");
+Dc=function(){if(!J)if(0<Bc.length){var b=Date.now(),c=Bc.shift();c.R(c.ka);if(Ec){var h=Ec,k=0==h%1?h-1:Math.floor(h);Ec=c.Fe?k:(8*h+(k+0.5))/9}console.log('main loop blocker "'+c.name+'" took '+(Date.now()-b)+" ms");q.setStatus&&(b=q.statusMessage||"Please wait...",c=Ec,h=Cc.Ke,c?c<h?q.setStatus(b+" ("+(h-c)+"/"+h+")"):q.setStatus(b):q.setStatus(""));setTimeout(Dc,0)}else if(zc)Ac=l,zc=n;else{"timeout"===yc&&q.He&&(q.K("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!"),
+yc="");q.preMainLoop&&q.preMainLoop();try{"undefined"!==typeof d?x.ba("vi",a,[d]):x.ba("v",a)}catch(j){if(j instanceof Wc)return;j&&("object"===typeof j&&j.stack)&&q.K("exception thrown: "+[j,j.stack]);e(j)}q.postMainLoop&&q.postMainLoop();zc?(Ac=l,zc=n):xc()}};b&&0<b?(xc=function(){setTimeout(Dc,1E3/b)},yc="timeout"):(xc=function(){Kc(Dc)},yc="rAF");xc();c&&e("SimulateInfiniteLoop")},___errno_location:function(){return nb},__ZNSt9exceptionD2Ev:p(),_printf:function(a,b){return qc(M[Cb>>2],a,b)},___cxa_does_inherit:gb,
+__exit:lb,_fputc:tc,_abort:function(){q.abort()},_fwrite:mc,_time:function(a){var b=Math.floor(Date.now()/1E3);a&&(M[a>>2]=b);return b},_fprintf:qc,_emscripten_cancel_main_loop:function(){xc=m;zc=l},__formatString:pc,_fputs:sc,_exit:function(a){lb(a)},___cxa_pure_virtual:function(){J=l;e("Pure virtual function called!")},STACKTOP:v,STACK_MAX:Ha,tempDoublePtr:db,ABORT:J,NaN:NaN,Infinity:Infinity,__ZTISt9exception:Uc},R),nc=q._strlen=$._strlen;q._free=$._free;q._main=$._main;
+var kb=q._memset=$._memset,Aa=q._malloc=$._malloc,wc=q._memcpy=$._memcpy;q.runPostSets=$.runPostSets;q.dynCall_iiii=$.dynCall_iiii;q.dynCall_viiiii=$.dynCall_viiiii;q.dynCall_vi=$.dynCall_vi;q.dynCall_vii=$.dynCall_vii;q.dynCall_ii=$.dynCall_ii;q.dynCall_viii=$.dynCall_viii;q.dynCall_v=$.dynCall_v;q.dynCall_viid=$.dynCall_viid;q.dynCall_viiiiii=$.dynCall_viiiiii;q.dynCall_iii=$.dynCall_iii;q.dynCall_iiiiii=$.dynCall_iiiiii;q.dynCall_viiii=$.dynCall_viiii;x.Ua=$.stackAlloc;x.Wa=$.stackSave;x.Va=$.stackRestore;
+x.wc=$.setTempRet0;x.cc=$.getTempRet0;function Wc(a){this.name="ExitStatus";this.message="Program terminated with exit("+a+")";this.status=a}Wc.prototype=Error();var Xc,Yc=m,Za=function Zc(){!q.calledRun&&$c&&ad([].concat(q.arguments));q.calledRun||(Za=Zc)};
+q.callMain=q.De=function(a){function b(){for(var a=0;3>a;a++)d.push(0)}z(0==S,"cannot call main when async dependencies remain! (listen on __ATMAIN__)");z(0==La.length,"cannot call main when preRun functions remain to be called");a=a||[];Qa||(Qa=l,Ka(Ma));var c=a.length+1,d=[O(K("/bin/this.program"),"i8",0)];b();for(var f=0;f<c-1;f+=1)d.push(O(K(a[f]),"i8",0)),b();d.push(0);d=O(d,"i32",0);Xc=v;try{var g=q._main(c,d,0);q.noExitRuntime||bd(g)}catch(h){h instanceof Wc||("SimulateInfiniteLoop"==h?q.noExitRuntime=
+l:(h&&("object"===typeof h&&h.stack)&&q.K("exception thrown: "+[h,h.stack]),e(h)))}finally{}};
+function ad(a){function b(){if(!q.calledRun){q.calledRun=l;Qa||(Qa=l,Ka(Ma));Ka(Na);ca&&Yc!==m&&q.K("pre-main prep time: "+(Date.now()-Yc)+" ms");q._main&&$c&&q.callMain(a);if(q.postRun)for("function"==typeof q.postRun&&(q.postRun=[q.postRun]);q.postRun.length;)Sa(q.postRun.shift());Ka(Pa)}}a=a||q.arguments;Yc===m&&(Yc=Date.now());if(0<S)q.K("run() called, but dependencies remain, so not running");else{if(q.preRun)for("function"==typeof q.preRun&&(q.preRun=[q.preRun]);q.preRun.length;)Ra(q.preRun.shift());
+Ka(La);!(0<S)&&!q.calledRun&&(q.setStatus?(q.setStatus("Running..."),setTimeout(function(){setTimeout(function(){q.setStatus("")},1);J||b()},1)):b())}}q.run=q.ff=ad;function bd(a){J=l;v=Xc;Ka(Oa);e(new Wc(a))}q.exit=q.Je=bd;function E(a){a&&(q.print(a),q.K(a));J=l;e("abort() at "+Ca()+"\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.")}q.abort=q.abort=E;if(q.preInit)for("function"==typeof q.preInit&&(q.preInit=[q.preInit]);0<q.preInit.length;)q.preInit.pop()();
+var $c=l;q.noInitialRun&&($c=n);ad([].concat(q.arguments));
+
new file mode 100644
--- /dev/null
+++ b/third_party/webkit/PerformanceTests/asmjs-apps/bullet.js
@@ -0,0 +1,2793 @@
+function g(a){throw a;}var j=void 0,l=!0,m=null,p=!1;function q(){return function(){}}var s,t;t||(t=eval("(function() { try { return Module || {} } catch(e) { return {} } })()"));var aa={},ba;for(ba in t)t.hasOwnProperty(ba)&&(aa[ba]=t[ba]);var ca="object"===typeof process&&"function"===typeof require,da="object"===typeof window,ea="function"===typeof importScripts,fa=!da&&!ca&&!ea;
+if(ca){t.print||(t.print=function(a){process.stdout.write(a+"\n")});t.printErr||(t.printErr=function(a){process.stderr.write(a+"\n")});var ga=require("fs"),ha=require("path");t.read=function(a,b){var a=ha.normalize(a),c=ga.readFileSync(a);!c&&a!=ha.resolve(a)&&(a=path.join(__dirname,"..","src",a),c=ga.readFileSync(a));c&&!b&&(c=c.toString());return c};t.readBinary=function(a){return t.read(a,l)};t.load=function(a){ia(read(a))};t.arguments=process.argv.slice(2);module.exports=t}else fa?(t.print||(t.print=
+print),"undefined"!=typeof printErr&&(t.printErr=printErr),t.read="undefined"!=typeof read?read:function(){g("no read() available (jsc?)")},t.readBinary=function(a){return read(a,"binary")},"undefined"!=typeof scriptArgs?t.arguments=scriptArgs:"undefined"!=typeof arguments&&(t.arguments=arguments),this.Module=t,eval("if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined")):da||ea?(t.read=function(a){var b=new XMLHttpRequest;b.open("GET",a,p);b.send(m);return b.responseText},
+"undefined"!=typeof arguments&&(t.arguments=arguments),"undefined"!==typeof console?(t.print||(t.print=function(a){console.log(a)}),t.printErr||(t.printErr=function(a){console.log(a)})):t.print||(t.print=q()),da?window.Module=t:t.load=importScripts):g("Unknown runtime environment. Where are we?");function ia(a){eval.call(m,a)}"undefined"==!t.load&&t.read&&(t.load=function(a){ia(t.read(a))});t.print||(t.print=q());t.printErr||(t.printErr=t.print);t.arguments||(t.arguments=[]);t.print=t.print;
+t.la=t.printErr;t.preRun=[];t.postRun=[];for(ba in aa)aa.hasOwnProperty(ba)&&(t[ba]=aa[ba]);
+var v={zd:function(a){ja=a},$c:function(){return ja},Ab:function(){return u},zb:function(a){u=a},Qf:function(a,b){b=b||4;return 1==b?a:isNumber(a)&&isNumber(b)?Math.ceil(a/b)*b:isNumber(b)&&isPowerOfTwo(b)?"((("+a+")+"+(b-1)+")&"+-b+")":"Math.ceil(("+a+")/"+b+")*"+b},jd:function(a){return a in v.Ic||a in v.Gc},kd:function(a){return"*"==a[a.length-1]},ld:function(a){return isPointerType(a)?p:isArrayType(a)||/<?\{ ?[^}]* ?\}>?/.test(a)?l:"%"==a[0]},Ic:{i1:0,i8:0,i16:0,i32:0,i64:0},Gc:{"float":0,"double":0},
+hg:function(a,b){return(a|0|b|0)+4294967296*(Math.round(a/4294967296)|Math.round(b/4294967296))},If:function(a,b){return((a|0)&(b|0))+4294967296*(Math.round(a/4294967296)&Math.round(b/4294967296))},pg:function(a,b){return((a|0)^(b|0))+4294967296*(Math.round(a/4294967296)^Math.round(b/4294967296))},ob:function(a){switch(a){case "i1":case "i8":return 1;case "i16":return 2;case "i32":return 4;case "i64":return 8;case "float":return 4;case "double":return 8;default:return"*"===a[a.length-1]?v.ga:"i"===
+a[0]?(a=parseInt(a.substr(1)),y(0===a%8),a/8):0}},cc:function(a){return Math.max(v.ob(a),v.ga)},Sc:function(a,b){var c={};return b?a.filter(function(a){return c[a[b]]?p:c[a[b]]=l}):a.filter(function(a){return c[a]?p:c[a]=l})},set:function(){for(var a="object"===typeof arguments[0]?arguments[0]:arguments,b={},c=0;c<a.length;c++)b[a[c]]=0;return b},vf:8,nb:function(a,b,c){return!c&&("i64"==a||"double"==a)?8:!a?Math.min(b,8):Math.min(b||(a?v.cc(a):0),v.ga)},Pc:function(a){a.P=0;a.na=0;var b=[],c=-1,
+d=0;a.ac=a.kb.map(function(e){d++;var f,h;v.jd(e)||v.kd(e)?(f=v.ob(e),h=v.nb(e,f)):v.ld(e)?"0"===e[1]?(f=0,h=Types.types[e]?v.nb(m,Types.types[e].na):a.na||QUANTUM_SIZE):(f=Types.types[e].P,h=v.nb(m,Types.types[e].na)):"b"==e[0]?(f=e.substr(1)|0,h=1):"<"===e[0]?f=h=Types.types[e].P:"i"===e[0]?(f=h=parseInt(e.substr(1))/8,y(0===f%1,"cannot handle non-byte-size field "+e)):y(p,"invalid type for calculateStructAlignment");a.ig&&(h=1);a.na=Math.max(a.na,h);e=v.ma(a.P,h);a.P=e+f;0<=c&&b.push(e-c);return c=
+e});a.mc&&"["===a.mc[0]&&(a.P=parseInt(a.mc.substr(1))*a.P/2);a.P=v.ma(a.P,a.na);0==b.length?a.$b=a.P:1==v.Sc(b).length&&(a.$b=b[0]);a.dg=1!=a.$b;return a.ac},Xc:function(a,b,c){var d,e;if(b){c=c||0;d=("undefined"===typeof Types?v.og:Types.types)[b];if(!d)return m;if(d.kb.length!=a.length)return printErr("Number of named fields must match the type for "+b+": possibly duplicate struct names. Cannot return structInfo"),m;e=d.ac}else d={kb:a.map(function(a){return a[0]})},e=v.Pc(d);var f={Af:d.P};b?
+a.forEach(function(a,b){if("string"===typeof a)f[a]=e[b]+c;else{var k,r;for(r in a)k=r;f[k]=v.Xc(a[k],d.kb[b],e[b])}}):a.forEach(function(a,b){f[a[1]]=e[b]});return f},ib:function(a,b,c){return c&&c.length?(c.splice||(c=Array.prototype.slice.call(c)),c.splice(0,0,b),t["dynCall_"+a].apply(m,c)):t["dynCall_"+a].call(m,b)},Ma:[],Bf:function(a){for(var b=0;b<v.Ma.length;b++)if(!v.Ma[b])return v.Ma[b]=a,2*(1+b);g("Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.")},
+kg:function(a){v.Ma[(a-2)/2]=m},Rf:function(a,b){v.fb||(v.fb={});var c=v.fb[a];if(c)return c;for(var c=[],d=0;d<b;d++)c.push(String.fromCharCode(36)+d);d=ka(a);'"'===d[0]&&(d.indexOf('"',1)===d.length-1?d=d.substr(1,d.length-2):A("invalid EM_ASM input |"+d+"|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)"));try{var e=eval("(function("+c.join(",")+"){ "+d+" })")}catch(f){t.la("error in executing inline EM_ASM code: "+f+" on: \n\n"+d+"\n\nwith args |"+
+c+"| (make sure to use the right one out of EM_ASM, EM_ASM_ARGS, etc.)"),g(f)}return v.fb[a]=e},Aa:function(a){v.Aa.wb||(v.Aa.wb={});v.Aa.wb[a]||(v.Aa.wb[a]=1,t.la(a))},mb:{},Tf:function(a,b){y(b);v.mb[a]||(v.mb[a]=function(){return v.ib(b,a,arguments)});return v.mb[a]},bb:function(){var a=[],b=0;this.sb=function(c){c&=255;if(0==a.length){if(0==(c&128))return String.fromCharCode(c);a.push(c);b=192==(c&224)?1:224==(c&240)?2:3;return""}if(b&&(a.push(c),b--,0<b))return"";var c=a[0],d=a[1],e=a[2],f=a[3];
+2==a.length?c=String.fromCharCode((c&31)<<6|d&63):3==a.length?c=String.fromCharCode((c&15)<<12|(d&63)<<6|e&63):(c=(c&7)<<18|(d&63)<<12|(e&63)<<6|f&63,c=String.fromCharCode(Math.floor((c-65536)/1024)+55296,(c-65536)%1024+56320));a.length=0;return c};this.td=function(a){for(var a=unescape(encodeURIComponent(a)),b=[],e=0;e<a.length;e++)b.push(a.charCodeAt(e));return b}},Sf:function(){g("You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work")},
+yb:function(a){var b=u;u=u+a|0;u=u+7&-8;return b},tc:function(a){var b=la;la=la+a|0;la=la+7&-8;return b},va:function(a){var b=B;B=B+a|0;B=B+7&-8;B>=ma&&A("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+ma+", (2) compile with ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.");return b},ma:function(a,b){return Math.ceil(a/(b?b:8))*(b?b:8)},nd:function(a,
+b,c){return c?+(a>>>0)+4294967296*+(b>>>0):+(a>>>0)+4294967296*+(b|0)},k:8,ga:4,zf:0};t.Runtime=v;var na=p,oa,pa,ja;function y(a,b){a||A("Assertion failed: "+b)}t.ccall=function(a,b,c,d){return qa(ra(a),b,c,d)};function ra(a){try{var b=t["_"+a];b||(b=eval("_"+a))}catch(c){}y(b,"Cannot call unknown function "+a+" (perhaps LLVM optimizations or closure removed it?)");return b}
+function qa(a,b,c,d){function e(a,b){if("string"==b){if(a===m||a===j||0===a)return 0;a=C(a);b="array"}if("array"==b){f||(f=v.Ab());var c=v.yb(a.length);sa(a,c);return c}return a}var f=0,h=0,d=d?d.map(function(a){return e(a,c[h++])}):[];a=a.apply(m,d);"string"==b?b=ka(a):(y("array"!=b),b=a);f&&v.zb(f);return b}t.cwrap=function(a,b,c){var d=ra(a);return function(){return qa(d,b,c,Array.prototype.slice.call(arguments))}};
+function ta(a,b,c){c=c||"i8";"*"===c.charAt(c.length-1)&&(c="i32");switch(c){case "i1":D[a>>0]=b;break;case "i8":D[a>>0]=b;break;case "i16":ua[a>>1]=b;break;case "i32":F[a>>2]=b;break;case "i64":pa=[b>>>0,(oa=b,1<=+va(oa)?0<oa?(wa(+xa(oa/4294967296),4294967295)|0)>>>0:~~+ya((oa-+(~~oa>>>0))/4294967296)>>>0:0)];F[a>>2]=pa[0];F[a+4>>2]=pa[1];break;case "float":za[a>>2]=b;break;case "double":Aa[a>>3]=b;break;default:A("invalid type for setValue: "+c)}}t.setValue=ta;
+t.getValue=function(a,b){b=b||"i8";"*"===b.charAt(b.length-1)&&(b="i32");switch(b){case "i1":return D[a>>0];case "i8":return D[a>>0];case "i16":return ua[a>>1];case "i32":return F[a>>2];case "i64":return F[a>>2];case "float":return za[a>>2];case "double":return Aa[a>>3];default:A("invalid type for setValue: "+b)}return m};var Ba=1,H=2,I=4;t.ALLOC_NORMAL=0;t.ALLOC_STACK=Ba;t.ALLOC_STATIC=H;t.ALLOC_DYNAMIC=3;t.ALLOC_NONE=I;
+function K(a,b,c,d){var e,f;"number"===typeof a?(e=l,f=a):(e=p,f=a.length);var h="string"===typeof b?b:m,c=c==I?d:[Ca,v.yb,v.tc,v.va][c===j?H:c](Math.max(f,h?1:b.length));if(e){d=c;y(0==(c&3));for(a=c+(f&-4);d<a;d+=4)F[d>>2]=0;for(a=c+f;d<a;)D[d++>>0]=0;return c}if("i8"===h)return a.subarray||a.slice?M.set(a,c):M.set(new Uint8Array(a),c),c;for(var d=0,i,k;d<f;){var r=a[d];"function"===typeof r&&(r=v.Uf(r));e=h||b[d];0===e?d++:("i64"==e&&(e="i32"),ta(c+d,r,e),k!==e&&(i=v.ob(e),k=e),d+=i)}return c}
+t.allocate=K;function ka(a,b){for(var c=p,d,e=0;;){d=M[a+e>>0];if(128<=d)c=l;else if(0==d&&!b)break;e++;if(b&&e==b)break}b||(b=e);var f="";if(!c){for(;0<b;)d=String.fromCharCode.apply(String,M.subarray(a,a+Math.min(b,1024))),f=f?f+d:d,a+=1024,b-=1024;return f}c=new v.bb;for(e=0;e<b;e++)d=M[a+e>>0],f+=c.sb(d);return f}t.Pointer_stringify=ka;t.UTF16ToString=function(a){for(var b=0,c="";;){var d=ua[a+2*b>>1];if(0==d)return c;++b;c+=String.fromCharCode(d)}};
+t.stringToUTF16=function(a,b){for(var c=0;c<a.length;++c)ua[b+2*c>>1]=a.charCodeAt(c);ua[b+2*a.length>>1]=0};t.UTF32ToString=function(a){for(var b=0,c="";;){var d=F[a+4*b>>2];if(0==d)return c;++b;65536<=d?(d-=65536,c+=String.fromCharCode(55296|d>>10,56320|d&1023)):c+=String.fromCharCode(d)}};t.stringToUTF32=function(a,b){for(var c=0,d=0;d<a.length;++d){var e=a.charCodeAt(d);if(55296<=e&&57343>=e)var f=a.charCodeAt(++d),e=65536+((e&1023)<<10)|f&1023;F[b+4*c>>2]=e;++c}F[b+4*c>>2]=0};
+function Da(a){function b(h,k,r){var k=k||Infinity,z="",n=[],x;if("N"===a[c]){c++;"K"===a[c]&&c++;for(x=[];"E"!==a[c];)if("S"===a[c]){c++;var E=a.indexOf("_",c);x.push(e[a.substring(c,E)||0]||"?");c=E+1}else if("C"===a[c])x.push(x[x.length-1]),c+=2;else{var E=parseInt(a.substr(c)),L=E.toString().length;if(!E||!L){c--;break}var O=a.substr(c+L,E);x.push(O);e.push(O);c+=L+E}c++;x=x.join("::");k--;if(0===k)return h?[x]:x}else if(("K"===a[c]||f&&"L"===a[c])&&c++,E=parseInt(a.substr(c)))L=E.toString().length,
+x=a.substr(c+L,E),c+=L+E;f=p;"I"===a[c]?(c++,E=b(l),L=b(l,1,l),z+=L[0]+" "+x+"<"+E.join(", ")+">"):z=x;a:for(;c<a.length&&0<k--;)if(x=a[c++],x in d)n.push(d[x]);else switch(x){case "P":n.push(b(l,1,l)[0]+"*");break;case "R":n.push(b(l,1,l)[0]+"&");break;case "L":c++;E=a.indexOf("E",c)-c;n.push(a.substr(c,E));c+=E+2;break;case "A":E=parseInt(a.substr(c));c+=E.toString().length;"_"!==a[c]&&g("?");c++;n.push(b(l,1,l)[0]+" ["+E+"]");break;case "E":break a;default:z+="?"+x;break a}!r&&(1===n.length&&"void"===
+n[0])&&(n=[]);return h?(z&&n.push(z+"?"),n):z+("("+n.join(", ")+")")}var c=3,d={v:"void",b:"bool",c:"char",s:"short",i:"int",l:"long",f:"float",d:"double",w:"wchar_t",a:"signed char",h:"unsigned char",t:"unsigned short",j:"unsigned int",m:"unsigned long",x:"long long",y:"unsigned long long",z:"..."},e=[],f=l;try{if("Object._main"==a||"_main"==a)return"main()";"number"===typeof a&&(a=ka(a));if("_"!==a[0]||"_"!==a[1]||"Z"!==a[2])return a;switch(a[3]){case "n":return"operator new()";case "d":return"operator delete()"}return b()}catch(h){return a}}
+function Ea(){var a=Error().stack;return a?a.replace(/__Z[\w\d_]+/g,function(a){var c=Da(a);return a===c?a:a+" ["+c+"]"}):"(no stack trace available)"}for(var D,M,ua,Fa,F,Ha,za,Aa,Ia=0,la=0,Ja=0,u=0,Ka=0,La=0,B=0,Ma=t.TOTAL_STACK||5242880,ma=t.TOTAL_MEMORY||134217728,N=4096;N<ma||N<2*Ma;)N=16777216>N?2*N:N+16777216;N!==ma&&(t.la("increasing TOTAL_MEMORY to "+N+" to be more reasonable"),ma=N);
+y("undefined"!==typeof Int32Array&&"undefined"!==typeof Float64Array&&!!(new Int32Array(1)).subarray&&!!(new Int32Array(1)).set,"JS engine does not provide full typed array support");var P=new ArrayBuffer(ma);D=new Int8Array(P);ua=new Int16Array(P);F=new Int32Array(P);M=new Uint8Array(P);Fa=new Uint16Array(P);Ha=new Uint32Array(P);za=new Float32Array(P);Aa=new Float64Array(P);F[0]=255;y(255===M[0]&&0===M[3],"Typed arrays 2 must be run on a little-endian system");t.HEAP=j;t.HEAP8=D;t.HEAP16=ua;
+t.HEAP32=F;t.HEAPU8=M;t.HEAPU16=Fa;t.HEAPU32=Ha;t.HEAPF32=za;t.HEAPF64=Aa;function Na(a){for(;0<a.length;){var b=a.shift();if("function"==typeof b)b();else{var c=b.Y;"number"===typeof c?b.Fa===j?v.ib("v",c):v.ib("vi",c,[b.Fa]):c(b.Fa===j?m:b.Fa)}}}var Oa=[],Pa=[],Qa=[],Ra=[],Sa=[],Ta=p;function Ua(a){Oa.unshift(a)}t.addOnPreRun=t.Gf=Ua;t.addOnInit=t.Df=function(a){Pa.unshift(a)};t.addOnPreMain=t.Ff=function(a){Qa.unshift(a)};t.addOnExit=t.Cf=function(a){Ra.unshift(a)};
+function Va(a){Sa.unshift(a)}t.addOnPostRun=t.Ef=Va;function C(a,b,c){a=(new v.bb).td(a);c&&(a.length=c);b||a.push(0);return a}t.intArrayFromString=C;t.intArrayToString=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c];255<d&&(d&=255);b.push(String.fromCharCode(d))}return b.join("")};t.writeStringToMemory=function(a,b,c){a=C(a,c);for(c=0;c<a.length;)D[b+c>>0]=a[c],c+=1};function sa(a,b){for(var c=0;c<a.length;c++)D[b+c>>0]=a[c]}t.writeArrayToMemory=sa;
+t.writeAsciiToMemory=function(a,b,c){for(var d=0;d<a.length;d++)D[b+d>>0]=a.charCodeAt(d);c||(D[b+a.length>>0]=0)};function Wa(a,b){return 0<=a?a:32>=b?2*Math.abs(1<<b-1)+a:Math.pow(2,b)+a}function Xa(a,b){if(0>=a)return a;var c=32>=b?Math.abs(1<<b-1):Math.pow(2,b-1);if(a>=c&&(32>=b||a>c))a=-2*c+a;return a}if(!Math.imul||-5!==Math.imul(4294967295,5))Math.imul=function(a,b){var c=a&65535,d=b&65535;return c*d+((a>>>16)*d+c*(b>>>16)<<16)|0};Math.Xf=Math.imul;
+var va=Math.abs,Ya=Math.cos,Za=Math.sin,$a=Math.acos,ab=Math.atan2,bb=Math.sqrt,ya=Math.ceil,xa=Math.floor,cb=Math.pow,wa=Math.min,db=0,eb=m,fb=m;function gb(){db++;t.monitorRunDependencies&&t.monitorRunDependencies(db)}t.addRunDependency=gb;function hb(){db--;t.monitorRunDependencies&&t.monitorRunDependencies(db);if(0==db&&(eb!==m&&(clearInterval(eb),eb=m),fb)){var a=fb;fb=m;a()}}t.removeRunDependency=hb;t.preloadedImages={};t.preloadedAudios={};var ib=460016,jb=460056,Ia=8,la=Ia+v.ma(460819);
+Pa.push({Y:function(){kb()}},{Y:function(){lb()}});
+K([0,0,122,195,158,123,63,64,223,143,226,66,0,0,122,195,42,198,11,64,66,96,234,66,16,24,118,195,3,178,207,63,223,143,226,66,16,24,118,195,119,21,194,63,66,96,234,66,33,48,114,195,237,239,88,63,223,143,226,66,33,48,114,195,10,218,32,63,66,96,234,66,240,71,110,195,42,139,50,191,223,143,226,66,240,71,110,195,15,100,17,191,66,96,234,66,0,96,106,195,113,172,41,192,223,143,226,66,0,96,106,195,231,0,1,192,66,96,234,66,16,120,102,195,208,155,116,192,223,143,226,66,16,120,102,195,6,76,90,192,66,96,234,66,
+33,144,98,195,197,114,127,192,223,143,226,66,33,144,98,195,18,247,116,192,66,96,234,66,240,167,94,195,84,87,176,192,223,143,226,66,240,167,94,195,237,129,160,192,66,96,234,66,0,192,90,195,24,33,180,192,223,143,226,66,0,192,90,195,107,241,151,192,66,96,234,66,16,216,86,195,232,246,156,192,223,143,226,66,16,216,86,195,245,190,83,192,66,96,234,66,33,240,82,195,196,66,61,192,223,143,226,66,33,240,82,195,163,204,20,192,66,96,234,66,240,7,79,195,156,80,28,192,223,143,226,66,240,7,79,195,18,136,219,191,
+66,96,234,66,0,32,75,195,206,25,193,191,223,143,226,66,0,32,75,195,112,148,152,191,66,96,234,66,16,56,71,195,102,250,5,190,223,143,226,66,16,56,71,195,21,196,96,62,66,96,234,66,33,80,67,195,74,68,124,63,223,143,226,66,33,80,67,195,127,222,212,63,66,96,234,66,240,103,63,195,73,215,76,64,223,143,226,66,240,103,63,195,205,59,139,64,66,96,234,66,0,128,59,195,91,177,149,64,223,143,226,66,0,128,59,195,10,162,202,64,66,96,234,66,16,152,55,195,157,104,197,64,223,143,226,66,16,152,55,195,208,39,0,65,66,96,
+234,66,33,176,51,195,123,3,3,65,223,143,226,66,33,176,51,195,17,112,27,65,66,96,234,66,240,199,47,195,245,156,21,65,223,143,226,66,240,199,47,195,251,92,44,65,66,96,234,66,0,224,43,195,61,27,24,65,223,143,226,66,0,224,43,195,94,186,53,65,66,96,234,66,16,248,39,195,228,20,66,65,223,143,226,66,16,248,39,195,229,97,72,65,66,96,234,66,33,16,36,195,253,246,109,65,223,143,226,66,33,16,36,195,120,11,106,65,66,96,234,66,240,39,32,195,65,2,131,65,223,143,226,66,240,39,32,195,187,167,137,65,66,96,234,66,0,
+64,28,195,41,75,148,65,223,143,226,66,0,64,28,195,189,210,159,65,66,96,234,66,16,88,24,195,116,181,179,65,223,143,226,66,16,88,24,195,131,175,187,65,66,96,234,66,33,112,20,195,206,42,209,65,223,143,226,66,33,112,20,195,235,226,212,65,66,96,234,66,240,135,16,195,87,219,228,65,223,143,226,66,240,135,16,195,63,181,227,65,66,96,234,66,0,160,12,195,106,60,242,65,223,143,226,66,0,160,12,195,252,41,238,65,66,96,234,66,16,184,8,195,64,228,0,66,223,143,226,66,16,184,8,195,21,140,248,65,66,96,234,66,33,208,
+4,195,78,145,3,66,223,143,226,66,33,208,4,195,76,183,254,65,66,96,234,66,240,231,0,195,165,14,6,66,223,143,226,66,240,231,0,195,199,169,0,66,66,96,234,66,0,0,250,194,3,201,10,66,223,143,226,66,0,0,250,194,191,253,10,66,66,96,234,66,33,48,242,194,23,153,21,66,223,143,226,66,33,48,242,194,230,63,16,66,66,96,234,66,66,96,234,194,131,47,24,66,223,143,226,66,66,96,234,194,175,20,21,66,66,96,234,66,223,143,226,194,4,103,23,66,223,143,226,66,223,143,226,194,189,99,21,66,66,96,234,66,0,192,218,194,246,151,
+23,66,223,143,226,66,0,192,218,194,207,247,20,66,66,96,234,66,33,240,210,194,131,47,16,66,223,143,226,66,33,240,210,194,27,158,16,66,66,96,234,66,66,32,203,194,84,116,8,66,223,143,226,66,66,32,203,194,172,156,5,66,66,96,234,66,7,80,195,194,184,94,0,66,223,143,226,66,7,80,195,194,29,90,250,65,66,96,234,66,0,128,187,194,18,165,238,65,223,143,226,66,0,128,187,194,3,248,235,65,66,96,234,66,7,176,179,194,255,50,241,65,223,143,226,66,7,176,179,194,222,113,232,65,66,96,234,66,0,224,171,194,156,179,230,65,
+223,143,226,66,0,224,171,194,162,52,226,65,66,96,234,66,7,16,164,194,227,199,215,65,223,143,226,66,7,16,164,194,191,14,213,65,66,96,234,66,0,64,156,194,119,173,203,65,223,143,226,66,0,64,156,194,249,160,198,65,66,96,234,66,7,112,148,194,140,219,186,65,223,143,226,66,7,112,148,194,126,157,181,65,66,96,234,66,0,160,140,194,193,74,169,65,223,143,226,66,0,160,140,194,174,199,163,65,66,96,234,66,7,208,132,194,56,248,144,65,223,143,226,66,7,208,132,194,59,223,143,65,66,96,234,66,0,0,122,194,147,186,130,
+65,223,143,226,66,0,0,122,194,41,109,130,65,66,96,234,66,13,96,106,194,51,51,113,65,223,143,226,66,13,96,106,194,214,86,99,65,66,96,234,66,0,192,90,194,161,248,99,65,223,143,226,66,0,192,90,194,7,240,76,65,66,96,234,66,13,32,75,194,70,182,92,65,223,143,226,66,13,32,75,194,165,189,72,65,66,96,234,66,0,128,59,194,109,86,75,65,223,143,226,66,0,128,59,194,127,217,66,65,66,96,234,66,13,224,43,194,168,53,41,65,223,143,226,66,13,224,43,194,193,57,50,65,66,96,234,66,0,64,28,194,23,229,31,65,223,143,226,66,
+0,64,28,194,149,101,39,65,66,96,234,66,13,160,12,194,99,127,49,65,223,143,226,66,13,160,12,194,69,216,48,65,66,96,234,66,0,0,250,193,233,72,63,65,223,143,226,66,0,0,250,193,150,67,55,65,66,96,234,66,26,192,218,193,165,44,57,65,223,143,226,66,26,192,218,193,87,236,40,65,66,96,234,66,0,128,187,193,156,162,48,65,223,143,226,66,0,128,187,193,243,31,42,65,66,96,234,66,26,64,156,193,254,67,72,65,223,143,226,66,26,64,156,193,16,233,72,65,66,96,234,66,0,0,122,193,45,178,93,65,223,143,226,66,0,0,122,193,86,
+159,88,65,66,96,234,66,52,128,59,193,102,102,104,65,223,143,226,66,52,128,59,193,52,17,102,65,66,96,234,66,0,0,250,192,30,22,108,65,223,143,226,66,0,0,250,192,196,177,119,65,66,96,234,66,0,0,122,192,54,171,126,65,223,143,226,66,0,0,122,192,112,206,128,65,66,96,234,66,0,0,0,0,24,149,136,65,223,143,226,66,0,0,0,0,164,240,138,65,66,96,234,66,0,0,122,64,100,204,146,65,223,143,226,66,0,0,122,64,29,90,151,65,66,96,234,66,0,0,122,195,43,48,149,64,0,192,218,66,16,24,118,195,205,88,16,64,0,192,218,66,33,48,
+114,195,218,255,120,63,0,192,218,66,240,71,110,195,45,38,250,191,0,192,218,66,0,96,106,195,34,113,47,192,0,192,218,66,16,120,102,195,25,4,104,192,0,192,218,66,33,144,98,195,150,178,145,192,0,192,218,66,240,167,94,195,97,50,205,192,0,192,218,66,0,192,90,195,29,119,215,192,0,192,218,66,16,216,86,195,79,88,189,192,0,192,218,66,33,240,82,195,193,173,151,192,0,192,218,66,240,7,79,195,62,232,83,192,0,192,218,66,0,32,75,195,55,84,4,192,0,192,218,66,16,56,71,195,62,32,120,191,0,192,218,66,33,80,67,195,69,
+157,137,62,0,192,218,66,240,103,63,195,188,87,249,63,0,192,218,66,0,128,59,195,188,174,51,64,0,192,218,66,16,152,55,195,249,20,135,64,0,192,218,66,33,176,51,195,161,161,166,64,0,192,218,66,240,199,47,195,97,26,239,64,0,192,218,66,0,224,43,195,35,62,23,65,0,192,218,66,16,248,39,195,174,71,74,65,0,192,218,66,33,16,36,195,222,2,111,65,0,192,218,66,240,39,32,195,164,95,134,65,0,192,218,66,0,64,28,195,86,31,156,65,0,192,218,66,16,88,24,195,57,52,171,65,0,192,218,66,33,112,20,195,216,1,201,65,0,192,218,
+66,240,135,16,195,23,72,227,65,0,192,218,66,0,160,12,195,191,14,246,65,0,192,218,66,16,184,8,195,222,19,4,66,0,192,218,66,33,208,4,195,186,73,4,66,0,192,218,66,240,231,0,195,15,139,4,66,0,192,218,66,0,0,250,194,56,56,12,66,0,192,218,66,33,48,242,194,83,197,17,66,0,192,218,66,66,96,234,194,86,78,25,66,0,192,218,66,223,143,226,194,183,34,26,66,0,192,218,66,0,192,218,194,231,12,20,66,0,192,218,66,33,240,210,194,13,160,11,66,0,192,218,66,66,32,203,194,84,244,3,66,0,192,218,66,7,80,195,194,212,43,247,
+65,0,192,218,66,0,128,187,194,213,9,244,65,0,192,218,66,7,176,179,194,84,244,243,65,0,192,218,66,0,224,171,194,142,6,231,65,0,192,218,66,7,16,164,194,163,146,225,65,0,192,218,66,0,64,156,194,202,84,207,65,0,192,218,66,7,112,148,194,14,190,186,65,0,192,218,66,0,160,140,194,7,223,167,65,0,192,218,66,7,208,132,194,166,27,147,65,0,192,218,66,0,0,122,194,42,58,135,65,0,192,218,66,13,96,106,194,199,41,116,65,0,192,218,66,0,192,90,194,36,40,101,65,0,192,218,66,13,32,75,194,247,6,86,65,0,192,218,66,0,128,
+59,194,220,70,73,65,0,192,218,66,13,224,43,194,217,61,53,65,0,192,218,66,0,64,28,194,57,69,48,65,0,192,218,66,13,160,12,194,161,248,59,65,0,192,218,66,0,0,250,193,40,15,72,65,0,192,218,66,26,192,218,193,150,33,70,65,0,192,218,66,0,128,187,193,136,244,68,65,0,192,218,66,26,64,156,193,47,221,73,65,0,192,218,66,0,0,122,193,241,99,92,65,0,192,218,66,52,128,59,193,217,206,101,65,0,192,218,66,0,0,250,192,125,63,109,65,0,192,218,66,0,0,122,192,129,149,121,65,0,192,218,66,0,0,0,0,166,27,131,65,0,192,218,
+66,0,0,122,64,123,3,144,65,0,192,218,66,0,0,122,195,60,165,167,64,33,240,210,66,16,24,118,195,104,232,57,64,33,240,210,66,33,48,114,195,208,127,135,62,33,240,210,66,240,71,110,195,61,238,147,190,33,240,210,66,0,96,106,195,24,9,105,191,33,240,210,66,16,120,102,195,95,70,13,192,33,240,210,66,33,144,98,195,95,152,108,192,33,240,210,66,240,167,94,195,47,221,166,192,33,240,210,66,0,192,90,195,169,77,194,192,33,240,210,66,16,216,86,195,120,156,173,192,33,240,210,66,33,240,82,195,89,76,154,192,33,240,210,
+66,240,7,79,195,68,23,78,192,33,240,210,66,0,32,75,195,149,241,17,192,33,240,210,66,16,56,71,195,56,132,194,191,33,240,210,66,33,80,67,195,252,25,62,189,33,240,210,66,240,103,63,195,4,28,222,63,33,240,210,66,0,128,59,195,153,100,46,64,33,240,210,66,16,152,55,195,121,204,140,64,33,240,210,66,33,176,51,195,188,92,175,64,33,240,210,66,240,199,47,195,214,226,232,64,33,240,210,66,0,224,43,195,180,200,33,65,33,240,210,66,16,248,39,195,38,228,80,65,33,240,210,66,33,16,36,195,53,94,123,65,33,240,210,66,240,
+39,32,195,39,194,142,65,33,240,210,66,0,64,28,195,233,183,158,65,33,240,210,66,16,88,24,195,109,86,173,65,33,240,210,66,33,112,20,195,20,46,193,65,33,240,210,66,240,135,16,195,164,95,227,65,33,240,210,66,0,160,12,195,108,137,253,65,33,240,210,66,16,184,8,195,142,134,9,66,33,240,210,66,33,208,4,195,186,154,11,66,33,240,210,66,240,231,0,195,239,56,7,66,33,240,210,66,0,0,250,194,88,74,9,66,33,240,210,66,33,48,242,194,165,108,14,66,33,240,210,66,66,96,234,194,186,218,23,66,33,240,210,66,223,143,226,194,
+81,171,26,66,33,240,210,66,0,192,218,194,75,136,19,66,33,240,210,66,33,240,210,194,161,86,10,66,33,240,210,66,66,32,203,194,110,227,0,66,33,240,210,66,7,80,195,194,145,15,243,65,33,240,210,66,0,128,187,194,247,100,243,65,33,240,210,66,7,176,179,194,116,53,246,65,33,240,210,66,0,224,171,194,2,171,238,65,33,240,210,66,7,16,164,194,153,42,224,65,33,240,210,66,0,64,156,194,162,197,205,65,33,240,210,66,7,112,148,194,23,55,183,65,33,240,210,66,0,160,140,194,220,70,167,65,33,240,210,66,7,208,132,194,225,
+11,146,65,33,240,210,66,0,0,122,194,18,131,133,65,33,240,210,66,13,96,106,194,232,217,124,65,33,240,210,66,0,192,90,194,48,76,109,65,33,240,210,66,13,32,75,194,110,52,92,65,33,240,210,66,0,128,59,194,169,19,80,65,33,240,210,66,13,224,43,194,85,193,62,65,33,240,210,66,0,64,28,194,4,86,64,65,33,240,210,66,13,160,12,194,251,92,68,65,33,240,210,66,0,0,250,193,58,35,74,65,33,240,210,66,26,192,218,193,231,251,74,65,33,240,210,66,0,128,187,193,71,3,70,65,33,240,210,66,26,64,156,193,8,61,80,65,33,240,210,
+66,0,0,122,193,128,183,96,65,33,240,210,66,52,128,59,193,208,179,105,65,33,240,210,66,0,0,250,192,156,196,113,65,33,240,210,66,0,0,122,192,32,99,125,65,33,240,210,66,0,0,0,0,117,147,134,65,33,240,210,66,0,0,122,64,184,175,143,65,33,240,210,66,0,0,122,195,177,225,136,64,66,32,203,66,16,24,118,195,65,43,54,64,66,32,203,66,33,48,114,195,42,0,0,64,66,32,203,66,240,71,110,195,182,16,204,63,66,32,203,66,0,96,106,195,101,53,253,62,66,32,203,66,16,120,102,195,224,161,228,191,66,32,203,66,33,144,98,195,167,
+121,55,192,66,32,203,66,240,167,94,195,66,33,160,192,66,32,203,66,0,192,90,195,252,140,192,192,66,32,203,66,16,216,86,195,144,131,169,192,66,32,203,66,33,240,82,195,72,220,130,192,66,32,203,66,240,7,79,195,25,28,113,192,66,32,203,66,0,32,75,195,26,139,34,192,66,32,203,66,16,56,71,195,206,223,136,191,66,32,203,66,33,80,67,195,180,0,229,190,66,32,203,66,240,103,63,195,251,5,195,63,66,32,203,66,0,128,59,195,227,25,90,64,66,32,203,66,16,152,55,195,103,126,143,64,66,32,203,66,33,176,51,195,223,79,217,
+64,66,32,203,66,240,199,47,195,148,251,10,65,66,32,203,66,0,224,43,195,232,106,50,65,66,32,203,66,16,248,39,195,242,65,103,65,66,32,203,66,33,16,36,195,8,189,140,65,66,32,203,66,240,39,32,195,82,73,155,65,66,32,203,66,0,64,28,195,156,34,166,65,66,32,203,66,16,88,24,195,122,37,178,65,66,32,203,66,33,112,20,195,104,51,192,65,66,32,203,66,240,135,16,195,222,241,221,65,66,32,203,66,0,160,12,195,146,220,251,65,66,32,203,66,16,184,8,195,248,147,9,66,66,32,203,66,33,208,4,195,98,97,13,66,66,32,203,66,240,
+231,0,195,253,246,11,66,66,32,203,66,0,0,250,194,181,230,8,66,66,32,203,66,33,48,242,194,188,180,12,66,66,32,203,66,66,96,234,194,238,60,21,66,66,32,203,66,223,143,226,194,4,231,22,66,66,32,203,66,0,192,218,194,178,238,16,66,66,32,203,66,33,240,210,194,113,189,9,66,66,32,203,66,66,32,203,194,141,104,0,66,66,32,203,66,7,80,195,194,24,149,248,65,66,32,203,66,0,128,187,194,56,248,245,65,66,32,203,66,7,176,179,194,0,128,246,65,66,32,203,66,0,224,171,194,13,113,237,65,66,32,203,66,7,16,164,194,28,107,
+218,65,66,32,203,66,0,64,156,194,241,227,200,65,66,32,203,66,7,112,148,194,20,46,181,65,66,32,203,66,0,160,140,194,80,13,161,65,66,32,203,66,7,208,132,194,9,27,144,65,66,32,203,66,0,0,122,194,150,33,137,65,66,32,203,66,13,96,106,194,165,78,134,65,66,32,203,66,0,192,90,194,7,95,123,65,66,32,203,66,13,32,75,194,207,247,106,65,66,32,203,66,0,128,59,194,54,205,85,65,66,32,203,66,13,224,43,194,128,183,57,65,66,32,203,66,0,64,28,194,217,95,53,65,66,32,203,66,13,160,12,194,97,195,70,65,66,32,203,66,0,0,
+250,193,135,22,81,65,66,32,203,66,26,192,218,193,14,45,71,65,66,32,203,66,0,128,187,193,234,149,61,65,66,32,203,66,26,64,156,193,123,20,91,65,66,32,203,66,0,0,122,193,229,97,107,65,66,32,203,66,52,128,59,193,115,104,111,65,66,32,203,66,0,0,250,192,117,2,113,65,66,32,203,66,0,0,122,192,161,248,128,65,66,32,203,66,0,0,0,0,135,167,136,65,66,32,203,66,0,0,122,64,193,168,141,65,66,32,203,66,0,0,122,195,45,236,135,64,7,80,195,66,16,24,118,195,151,86,123,64,7,80,195,66,33,48,114,195,148,251,71,64,7,80,195,
+66,240,71,110,195,95,181,4,64,7,80,195,66,0,96,106,195,157,215,208,62,7,80,195,66,16,120,102,195,225,150,103,191,7,80,195,66,33,144,98,195,230,203,39,192,7,80,195,66,240,167,94,195,47,23,121,192,7,80,195,66,0,192,90,195,116,210,179,192,7,80,195,66,16,216,86,195,79,6,128,192,7,80,195,66,33,240,82,195,81,160,25,192,7,80,195,66,240,7,79,195,152,163,25,192,7,80,195,66,0,32,75,195,255,62,251,191,7,80,195,66,16,56,71,195,245,132,189,191,7,80,195,66,33,80,67,195,115,47,208,189,7,80,195,66,240,103,63,195,
+173,47,222,63,7,80,195,66,0,128,59,195,255,62,107,64,7,80,195,66,16,152,55,195,125,232,163,64,7,80,195,66,33,176,51,195,37,93,244,64,7,80,195,66,240,199,47,195,39,194,34,65,7,80,195,66,0,224,43,195,204,127,68,65,7,80,195,66,16,248,39,195,197,143,116,65,7,80,195,66,33,16,36,195,82,201,145,65,7,80,195,66,240,39,32,195,16,250,163,65,7,80,195,66,0,64,28,195,37,6,175,65,7,80,195,66,16,88,24,195,69,216,185,65,7,80,195,66,33,112,20,195,24,38,194,65,7,80,195,66,240,135,16,195,204,127,225,65,7,80,195,66,0,
+160,12,195,222,19,250,65,7,80,195,66,16,184,8,195,210,64,5,66,7,80,195,66,33,208,4,195,168,70,13,66,7,80,195,66,240,231,0,195,82,103,12,66,7,80,195,66,0,0,250,194,86,78,11,66,7,80,195,66,33,48,242,194,139,44,9,66,7,80,195,66,66,96,234,194,148,246,17,66,7,80,195,66,223,143,226,194,29,201,20,66,7,80,195,66,0,192,218,194,166,138,16,66,7,80,195,66,33,240,210,194,114,138,9,66,7,80,195,66,66,32,203,194,46,16,247,65,7,80,195,66,7,80,195,194,112,223,240,65,7,80,195,66,0,128,187,194,148,118,247,65,7,80,195,
+66,7,176,179,194,52,0,247,65,7,80,195,66,0,224,171,194,221,36,232,65,7,80,195,66,7,16,164,194,231,123,218,65,7,80,195,66,0,64,156,194,209,17,200,65,7,80,195,66,7,112,148,194,61,44,173,65,7,80,195,66,0,160,140,194,206,8,148,65,7,80,195,66,7,208,132,194,174,71,149,65,7,80,195,66,0,0,122,194,11,70,145,65,7,80,195,66,13,96,106,194,2,43,140,65,7,80,195,66,0,192,90,194,17,182,130,65,7,80,195,66,13,32,75,194,198,220,109,65,7,80,195,66,0,128,59,194,234,149,89,65,7,80,195,66,13,224,43,194,207,247,61,65,7,
+80,195,66,0,64,28,194,207,247,55,65,7,80,195,66,13,160,12,194,11,70,56,65,7,80,195,66,0,0,250,193,216,240,72,65,7,80,195,66,26,192,218,193,167,121,67,65,7,80,195,66,0,128,187,193,80,252,51,65,7,80,195,66,26,64,156,193,251,203,83,65,7,80,195,66,0,0,122,193,194,23,89,65,7,80,195,66,52,128,59,193,102,102,97,65,7,80,195,66,0,0,250,192,172,139,106,65,7,80,195,66,0,0,122,192,61,10,114,65,7,80,195,66,0,0,0,0,85,48,125,65,7,80,195,66,0,0,122,64,11,36,144,65,7,80,195,66,0,0,122,195,69,245,157,64,0,128,187,
+66,16,24,118,195,158,12,96,64,0,128,187,66,33,48,114,195,21,169,56,64,0,128,187,66,240,71,110,195,44,154,12,64,0,128,187,66,0,96,106,195,255,9,186,63,0,128,187,66,16,120,102,195,34,222,26,190,0,128,187,66,33,144,98,195,241,244,138,191,0,128,187,66,240,167,94,195,242,176,18,192,0,128,187,66,0,192,90,195,206,141,117,192,0,128,187,66,16,216,86,195,145,68,47,192,0,128,187,66,33,240,82,195,1,135,12,192,0,128,187,66,240,7,79,195,17,86,99,190,0,128,187,66,0,32,75,195,137,149,241,189,0,128,187,66,16,56,71,
+195,178,75,52,190,0,128,187,66,33,80,67,195,58,59,169,63,0,128,187,66,240,103,63,195,154,37,41,64,0,128,187,66,0,128,59,195,144,131,110,64,0,128,187,66,16,152,55,195,123,49,185,64,0,128,187,66,33,176,51,195,223,137,17,65,0,128,187,66,240,199,47,195,153,187,55,65,0,128,187,66,0,224,43,195,169,19,83,65,0,128,187,66,16,248,39,195,72,225,122,65,0,128,187,66,33,16,36,195,13,224,143,65,0,128,187,66,240,39,32,195,129,38,166,65,0,128,187,66,0,64,28,195,164,240,187,65,0,128,187,66,16,88,24,195,54,205,201,
+65,0,128,187,66,33,112,20,195,151,127,207,65,0,128,187,66,240,135,16,195,132,141,225,65,0,128,187,66,0,160,12,195,179,234,255,65,0,128,187,66,16,184,8,195,116,70,6,66,0,128,187,66,33,208,4,195,237,222,10,66,0,128,187,66,240,231,0,195,103,149,12,66,0,128,187,66,0,0,250,194,252,233,11,66,0,128,187,66,33,48,242,194,161,150,9,66,0,128,187,66,66,96,234,194,100,251,12,66,0,128,187,66,223,143,226,194,103,21,16,66,0,128,187,66,0,192,218,194,219,249,12,66,0,128,187,66,33,240,210,194,26,209,5,66,0,128,187,
+66,66,32,203,194,50,247,242,65,0,128,187,66,7,80,195,194,8,172,245,65,0,128,187,66,0,128,187,194,191,253,249,65,0,128,187,66,7,176,179,194,124,97,244,65,0,128,187,66,0,224,171,194,29,201,228,65,0,128,187,66,7,16,164,194,108,120,213,65,0,128,187,66,0,64,156,194,26,81,193,65,0,128,187,66,7,112,148,194,135,22,170,65,0,128,187,66,0,160,140,194,151,144,158,65,0,128,187,66,7,208,132,194,43,246,155,65,0,128,187,66,0,0,122,194,237,158,146,65,0,128,187,66,13,96,106,194,137,210,144,65,0,128,187,66,0,192,90,
+194,208,179,136,65,0,128,187,66,13,32,75,194,251,58,112,65,0,128,187,66,0,128,59,194,109,231,88,65,0,128,187,66,13,224,43,194,109,86,48,65,0,128,187,66,0,64,28,194,119,45,51,65,0,128,187,66,13,160,12,194,34,142,38,65,0,128,187,66,0,0,250,193,253,135,51,65,0,128,187,66,26,192,218,193,45,67,55,65,0,128,187,66,0,128,187,193,34,108,54,65,0,128,187,66,26,64,156,193,26,192,67,65,0,128,187,66,0,0,122,193,138,142,88,65,0,128,187,66,52,128,59,193,105,111,100,65,0,128,187,66,0,0,250,192,23,183,96,65,0,128,
+187,66,0,0,122,192,9,138,98,65,0,128,187,66,0,0,0,0,193,57,117,65,0,128,187,66,0,0,122,64,57,86,137,65,0,128,187,66,0,0,122,195,174,245,172,64,7,176,179,66,16,24,118,195,67,28,123,64,7,176,179,66,33,48,114,195,69,240,49,64,7,176,179,66,240,71,110,195,104,145,21,64,7,176,179,66,0,96,106,195,204,98,186,63,7,176,179,66,16,120,102,195,193,140,249,62,7,176,179,66,33,144,98,195,109,141,80,63,7,176,179,66,240,167,94,195,157,245,121,190,7,176,179,66,0,192,90,195,179,7,6,192,7,176,179,66,16,216,86,195,38,
+1,190,191,7,176,179,66,33,240,82,195,142,31,50,191,7,176,179,66,240,7,79,195,74,8,62,63,7,176,179,66,0,32,75,195,11,41,167,63,7,176,179,66,16,56,71,195,237,187,190,63,7,176,179,66,33,80,67,195,149,101,36,64,7,176,179,66,240,103,63,195,149,72,110,64,7,176,179,66,0,128,59,195,86,14,149,64,7,176,179,66,16,152,55,195,200,152,230,64,7,176,179,66,33,176,51,195,62,162,29,65,7,176,179,66,240,199,47,195,58,146,77,65,7,176,179,66,0,224,43,195,119,45,106,65,7,176,179,66,16,248,39,195,44,212,132,65,7,176,179,
+66,33,16,36,195,174,216,157,65,7,176,179,66,240,39,32,195,135,167,181,65,7,176,179,66,0,64,28,195,53,94,195,65,7,176,179,66,16,88,24,195,54,43,207,65,7,176,179,66,33,112,20,195,204,255,216,65,7,176,179,66,240,135,16,195,67,28,232,65,7,176,179,66,0,160,12,195,113,27,253,65,7,176,179,66,16,184,8,195,36,168,7,66,7,176,179,66,33,208,4,195,169,83,9,66,7,176,179,66,240,231,0,195,168,87,16,66,7,176,179,66,0,0,250,194,185,13,14,66,7,176,179,66,33,48,242,194,98,208,10,66,7,176,179,66,66,96,234,194,34,189,
+6,66,7,176,179,66,223,143,226,194,179,12,9,66,7,176,179,66,0,192,218,194,218,219,8,66,7,176,179,66,33,240,210,194,133,43,1,66,7,176,179,66,66,32,203,194,68,233,243,65,7,176,179,66,7,80,195,194,127,217,246,65,7,176,179,66,0,128,187,194,11,198,251,65,7,176,179,66,7,176,179,194,49,25,242,65,7,176,179,66,0,224,171,194,202,178,227,65,7,176,179,66,7,16,164,194,195,228,212,65,7,176,179,66,0,64,156,194,109,103,193,65,7,176,179,66,7,112,148,194,54,205,179,65,7,176,179,66,0,160,140,194,200,152,162,65,7,176,
+179,66,7,208,132,194,109,231,155,65,7,176,179,66,0,0,122,194,88,40,149,65,7,176,179,66,13,96,106,194,122,37,143,65,7,176,179,66,0,192,90,194,127,106,129,65,7,176,179,66,13,32,75,194,40,15,116,65,7,176,179,66,0,128,59,194,7,95,88,65,7,176,179,66,13,224,43,194,213,120,61,65,7,176,179,66,0,64,28,194,104,145,35,65,7,176,179,66,13,160,12,194,231,181,24,65,7,176,179,66,0,0,250,193,18,194,27,65,7,176,179,66,26,192,218,193,140,74,43,65,7,176,179,66,0,128,187,193,45,178,62,65,7,176,179,66,26,64,156,193,158,
+94,83,65,7,176,179,66,0,0,122,193,140,74,81,65,7,176,179,66,52,128,59,193,173,250,76,65,7,176,179,66,0,0,250,192,85,193,76,65,7,176,179,66,0,0,122,192,172,173,97,65,7,176,179,66,0,0,0,0,120,122,111,65,7,176,179,66,0,0,122,64,128,72,122,65,7,176,179,66,0,0,122,195,43,222,198,64,0,224,171,66,16,24,118,195,197,32,149,64,0,224,171,66,33,48,114,195,244,55,87,64,0,224,171,66,240,71,110,195,141,180,252,63,0,224,171,66,0,96,106,195,7,69,23,63,0,224,171,66,16,120,102,195,54,200,0,64,0,224,171,66,33,144,98,
+195,15,185,9,64,0,224,171,66,240,167,94,195,3,178,71,63,0,224,171,66,0,192,90,195,104,149,217,190,0,224,171,66,16,216,86,195,98,75,3,191,0,224,171,66,33,240,82,195,245,86,81,59,0,224,171,66,240,7,79,195,177,80,135,63,0,224,171,66,0,32,75,195,245,161,7,64,0,224,171,66,16,56,71,195,141,69,31,64,0,224,171,66,33,80,67,195,109,144,121,64,0,224,171,66,240,103,63,195,247,1,183,64,0,224,171,66,0,128,59,195,239,85,205,64,0,224,171,66,16,152,55,195,165,44,254,64,0,224,171,66,33,176,51,195,152,76,47,65,0,224,
+171,66,240,199,47,195,33,31,83,65,0,224,171,66,0,224,43,195,240,133,124,65,0,224,171,66,16,248,39,195,145,143,141,65,0,224,171,66,33,16,36,195,14,207,161,65,0,224,171,66,240,39,32,195,54,43,180,65,0,224,171,66,0,64,28,195,127,123,198,65,0,224,171,66,16,88,24,195,50,85,213,65,0,224,171,66,33,112,20,195,64,164,221,65,0,224,171,66,240,135,16,195,134,201,233,65,0,224,171,66,0,160,12,195,5,180,251,65,0,224,171,66,16,184,8,195,203,97,8,66,0,224,171,66,33,208,4,195,127,217,10,66,0,224,171,66,240,231,0,195,
+79,175,16,66,0,224,171,66,0,0,250,194,175,229,17,66,0,224,171,66,33,48,242,194,57,150,13,66,0,224,171,66,66,96,234,194,233,102,9,66,0,224,171,66,223,143,226,194,236,17,6,66,0,224,171,66,0,192,218,194,139,253,3,66,0,224,171,66,33,240,210,194,60,78,254,65,0,224,171,66,66,32,203,194,149,101,249,65,0,224,171,66,7,80,195,194,128,55,248,65,0,224,171,66,0,128,187,194,14,62,252,65,0,224,171,66,7,176,179,194,197,254,246,65,0,224,171,66,0,224,171,194,175,37,225,65,0,224,171,66,7,16,164,194,87,91,207,65,0,224,
+171,66,0,64,156,194,54,60,195,65,0,224,171,66,7,112,148,194,185,252,175,65,0,224,171,66,0,160,140,194,44,84,160,65,0,224,171,66,7,208,132,194,40,143,159,65,0,224,171,66,0,0,122,194,73,29,147,65,0,224,171,66,13,96,106,194,118,224,135,65,0,224,171,66,0,192,90,194,23,217,121,65,0,224,171,66,13,32,75,194,220,215,105,65,0,224,171,66,0,128,59,194,214,197,75,65,0,224,171,66,13,224,43,194,243,142,66,65,0,224,171,66,0,64,28,194,8,172,33,65,0,224,171,66,13,160,12,194,153,211,25,65,0,224,171,66,0,0,250,193,
+32,65,33,65,0,224,171,66,26,192,218,193,52,128,35,65,0,224,171,66,0,128,187,193,27,47,57,65,0,224,171,66,26,64,156,193,111,240,61,65,0,224,171,66,0,0,122,193,12,147,62,65,0,224,171,66,52,128,59,193,221,36,56,65,0,224,171,66,0,0,250,192,102,247,95,65,0,224,171,66,0,0,122,192,89,134,109,65,0,224,171,66,0,0,0,0,162,180,108,65,0,224,171,66,0,0,122,64,50,119,121,65,0,224,171,66,0,0,122,195,6,47,222,64,7,16,164,66,16,24,118,195,146,174,152,64,7,16,164,66,33,48,114,195,130,197,103,64,7,16,164,66,240,71,
+110,195,22,53,32,64,7,16,164,66,0,96,106,195,64,164,179,63,7,16,164,66,16,120,102,195,139,195,3,64,7,16,164,66,33,144,98,195,111,187,26,64,7,16,164,66,240,167,94,195,208,97,158,63,7,16,164,66,0,192,90,195,181,55,204,63,7,16,164,66,16,216,86,195,144,102,160,63,7,16,164,66,33,240,82,195,175,153,196,63,7,16,164,66,240,7,79,195,174,42,21,64,7,16,164,66,0,32,75,195,152,52,38,64,7,16,164,66,16,56,71,195,229,39,136,64,7,16,164,66,33,80,67,195,67,144,187,64,7,16,164,66,240,103,63,195,95,123,241,64,7,16,164,
+66,0,128,59,195,57,180,11,65,7,16,164,66,16,152,55,195,150,132,26,65,7,16,164,66,33,176,51,195,89,134,56,65,7,16,164,66,240,199,47,195,16,233,100,65,7,16,164,66,0,224,43,195,171,79,130,65,7,16,164,66,16,248,39,195,107,26,141,65,7,16,164,66,33,16,36,195,160,137,163,65,7,16,164,66,240,39,32,195,70,165,183,65,7,16,164,66,0,64,28,195,181,149,200,65,7,16,164,66,16,88,24,195,212,26,219,65,7,16,164,66,33,112,20,195,47,93,230,65,7,16,164,66,240,135,16,195,92,15,242,65,7,16,164,66,0,160,12,195,238,90,2,66,
+7,16,164,66,16,184,8,195,31,244,7,66,7,16,164,66,33,208,4,195,105,239,9,66,7,16,164,66,240,231,0,195,157,17,15,66,7,16,164,66,0,0,250,194,155,102,16,66,7,16,164,66,33,48,242,194,42,186,15,66,7,16,164,66,66,96,234,194,209,226,11,66,7,16,164,66,223,143,226,194,89,70,5,66,7,16,164,66,0,192,218,194,228,148,255,65,7,16,164,66,33,240,210,194,179,140,251,65,7,16,164,66,66,32,203,194,236,64,250,65,7,16,164,66,7,80,195,194,236,81,0,66,7,16,164,66,0,128,187,194,199,58,251,65,7,16,164,66,7,176,179,194,23,55,
+242,65,7,16,164,66,0,224,171,194,101,25,225,65,7,16,164,66,7,16,164,194,232,217,203,65,7,16,164,66,0,64,156,194,253,118,193,65,7,16,164,66,7,112,148,194,28,235,180,65,7,16,164,66,0,160,140,194,104,17,154,65,7,16,164,66,7,208,132,194,145,109,149,65,7,16,164,66,0,0,122,194,171,79,142,65,7,16,164,66,13,96,106,194,27,175,132,65,7,16,164,66,0,192,90,194,157,17,107,65,7,16,164,66,13,32,75,194,79,64,79,65,7,16,164,66,0,128,59,194,56,103,66,65,7,16,164,66,13,224,43,194,30,167,53,65,7,16,164,66,0,64,28,194,
+128,72,29,65,7,16,164,66,13,160,12,194,240,63,31,65,7,16,164,66,0,0,250,193,168,53,44,65,7,16,164,66,26,192,218,193,204,127,35,65,7,16,164,66,0,128,187,193,23,183,33,65,7,16,164,66,26,64,156,193,180,200,52,65,7,16,164,66,0,0,122,193,155,230,56,65,7,16,164,66,52,128,59,193,104,179,94,65,7,16,164,66,0,0,250,192,182,243,115,65,7,16,164,66,0,0,122,192,80,252,122,65,7,16,164,66,0,0,0,0,170,130,127,65,7,16,164,66,0,0,122,64,23,183,135,65,7,16,164,66,0,0,122,195,23,183,204,64,0,64,156,66,16,24,118,195,51,
+254,162,64,0,64,156,66,33,48,114,195,247,30,145,64,0,64,156,66,240,71,110,195,1,106,110,64,0,64,156,66,0,96,106,195,217,177,65,64,0,64,156,66,16,120,102,195,5,81,65,64,0,64,156,66,33,144,98,195,100,93,120,64,0,64,156,66,240,167,94,195,137,41,143,64,0,64,156,66,0,192,90,195,97,195,117,64,0,64,156,66,16,216,86,195,83,5,47,64,0,64,156,66,33,240,82,195,19,155,145,64,0,64,156,66,240,7,79,195,29,119,161,64,0,64,156,66,0,32,75,195,41,179,142,64,0,64,156,66,16,56,71,195,46,115,170,64,0,64,156,66,33,80,67,
+195,194,105,228,64,0,64,156,66,240,103,63,195,28,95,14,65,0,64,156,66,0,128,59,195,242,65,38,65,0,64,156,66,16,152,55,195,235,226,53,65,0,64,156,66,33,176,51,195,65,130,86,65,0,64,156,66,240,199,47,195,227,182,130,65,0,64,156,66,0,224,43,195,115,104,142,65,0,64,156,66,16,248,39,195,47,93,152,65,0,64,156,66,33,16,36,195,168,87,171,65,0,64,156,66,240,39,32,195,164,112,188,65,0,64,156,66,0,64,28,195,147,41,203,65,0,64,156,66,16,88,24,195,193,185,215,65,0,64,156,66,33,112,20,195,34,142,230,65,0,64,156,
+66,240,135,16,195,227,165,251,65,0,64,156,66,0,160,12,195,76,102,5,66,0,64,156,66,16,184,8,195,28,235,8,66,0,64,156,66,33,208,4,195,183,98,10,66,0,64,156,66,240,231,0,195,168,245,14,66,0,64,156,66,0,0,250,194,149,212,13,66,0,64,156,66,33,48,242,194,196,49,15,66,0,64,156,66,66,96,234,194,61,219,9,66,0,64,156,66,223,143,226,194,51,179,7,66,0,64,156,66,0,192,218,194,199,58,0,66,0,64,156,66,33,240,210,194,247,100,253,65,0,64,156,66,66,32,203,194,51,51,253,65,0,64,156,66,7,80,195,194,157,145,255,65,0,
+64,156,66,0,128,187,194,14,207,249,65,0,64,156,66,7,176,179,194,196,194,243,65,0,64,156,66,0,224,171,194,34,14,222,65,0,64,156,66,7,16,164,194,116,164,203,65,0,64,156,66,0,64,156,194,52,34,187,65,0,64,156,66,7,112,148,194,34,142,173,65,0,64,156,66,0,160,140,194,84,116,149,65,0,64,156,66,7,208,132,194,184,64,139,65,0,64,156,66,0,0,122,194,185,13,137,65,0,64,156,66,13,96,106,194,12,19,132,65,0,64,156,66,0,192,90,194,29,56,111,65,0,64,156,66,13,32,75,194,227,165,83,65,0,64,156,66,0,128,59,194,186,107,
+55,65,0,64,156,66,13,224,43,194,5,52,38,65,0,64,156,66,0,64,28,194,220,104,27,65,0,64,156,66,13,160,12,194,97,195,32,65,0,64,156,66,0,0,250,193,51,51,37,65,0,64,156,66,26,192,218,193,111,18,37,65,0,64,156,66,0,128,187,193,136,133,46,65,0,64,156,66,26,64,156,193,40,126,60,65,0,64,156,66,0,0,122,193,74,12,99,65,0,64,156,66,52,128,59,193,240,167,121,65,0,64,156,66,0,0,250,192,128,200,128,65,0,64,156,66,0,0,122,192,215,35,133,65,0,64,156,66,0,0,0,0,5,69,138,65,0,64,156,66,0,0,122,64,95,152,150,65,0,64,
+156,66,0,0,122,195,66,38,193,64,7,112,148,66,16,24,118,195,73,162,165,64,7,112,148,66,33,48,114,195,200,7,109,64,7,112,148,66,240,71,110,195,246,40,108,64,7,112,148,66,0,96,106,195,65,101,147,64,7,112,148,66,16,120,102,195,182,219,144,64,7,112,148,66,33,144,98,195,10,46,179,64,7,112,148,66,240,167,94,195,145,68,200,64,7,112,148,66,0,192,90,195,121,175,163,64,7,112,148,66,16,216,86,195,119,132,149,64,7,112,148,66,33,240,82,195,24,96,184,64,7,112,148,66,240,7,79,195,93,191,217,64,7,112,148,66,0,32,
+75,195,51,109,222,64,7,112,148,66,16,56,71,195,91,124,235,64,7,112,148,66,33,80,67,195,90,59,10,65,7,112,148,66,240,103,63,195,98,161,38,65,7,112,148,66,0,128,59,195,207,247,60,65,7,112,148,66,16,152,55,195,50,85,87,65,7,112,148,66,33,176,51,195,98,16,121,65,7,112,148,66,240,199,47,195,237,13,146,65,7,112,148,66,0,224,43,195,183,98,153,65,7,112,148,66,16,248,39,195,120,122,170,65,7,112,148,66,33,16,36,195,83,22,189,65,7,112,148,66,240,39,32,195,240,133,202,65,7,112,148,66,0,64,28,195,253,7,221,65,
+7,112,148,66,16,88,24,195,147,41,231,65,7,112,148,66,33,112,20,195,18,20,244,65,7,112,148,66,240,135,16,195,169,147,1,66,7,112,148,66,0,160,12,195,123,84,5,66,7,112,148,66,16,184,8,195,31,52,7,66,7,112,148,66,33,208,4,195,58,82,12,66,7,112,148,66,240,231,0,195,176,242,10,66,7,112,148,66,0,0,250,194,96,118,9,66,7,112,148,66,33,48,242,194,194,215,8,66,7,112,148,66,66,96,234,194,115,168,4,66,7,112,148,66,223,143,226,194,250,62,0,66,7,112,148,66,0,192,218,194,175,84,0,66,7,112,148,66,33,240,210,194,251,
+220,1,66,7,112,148,66,66,32,203,194,80,13,253,65,7,112,148,66,7,80,195,194,39,194,247,65,7,112,148,66,0,128,187,194,212,43,245,65,7,112,148,66,7,176,179,194,76,183,239,65,7,112,148,66,0,224,171,194,176,131,219,65,7,112,148,66,7,16,164,194,224,62,202,65,7,112,148,66,0,64,156,194,92,143,188,65,7,112,148,66,7,112,148,194,88,57,165,65,7,112,148,66,0,160,140,194,178,29,145,65,7,112,148,66,7,208,132,194,156,68,141,65,7,112,148,66,0,0,122,194,8,61,138,65,7,112,148,66,13,96,106,194,50,213,132,65,7,112,148,
+66,0,192,90,194,145,15,107,65,7,112,148,66,13,32,75,194,254,67,82,65,7,112,148,66,0,128,59,194,151,255,46,65,7,112,148,66,13,224,43,194,78,81,22,65,7,112,148,66,0,64,28,194,81,131,19,65,7,112,148,66,13,160,12,194,225,250,27,65,7,112,148,66,0,0,250,193,140,74,38,65,7,112,148,66,26,192,218,193,41,203,44,65,7,112,148,66,0,128,187,193,93,220,56,65,7,112,148,66,26,64,156,193,54,171,88,65,7,112,148,66,0,0,122,193,58,35,122,65,7,112,148,66,52,128,59,193,169,19,131,65,7,112,148,66,0,0,250,192,109,231,141,
+65,7,112,148,66,0,0,122,192,10,215,143,65,7,112,148,66,0,0,0,0,208,85,153,65,7,112,148,66,0,0,122,64,148,118,165,65,7,112,148,66,0,0,122,195,155,114,174,64,0,160,140,66,16,24,118,195,45,207,154,64,0,160,140,66,33,48,114,195,163,117,102,64,0,160,140,66,240,71,110,195,174,240,80,64,0,160,140,66,0,96,106,195,102,247,129,64,0,160,140,66,16,120,102,195,206,25,170,64,0,160,140,66,33,144,98,195,19,15,213,64,0,160,140,66,240,167,94,195,121,146,214,64,0,160,140,66,0,192,90,195,178,215,221,64,0,160,140,66,
+16,216,86,195,45,38,219,64,0,160,140,66,33,240,82,195,28,235,222,64,0,160,140,66,240,7,79,195,83,174,247,64,0,160,140,66,0,32,75,195,246,255,10,65,0,160,140,66,16,56,71,195,250,254,16,65,0,160,140,66,33,80,67,195,233,72,33,65,0,160,140,66,240,103,63,195,100,59,67,65,0,160,140,66,0,128,59,195,12,2,97,65,0,160,140,66,16,152,55,195,70,182,123,65,0,160,140,66,33,176,51,195,119,45,147,65,0,160,140,66,240,199,47,195,15,11,156,65,0,160,140,66,0,224,43,195,64,36,167,65,0,160,140,66,16,248,39,195,12,19,187,
+65,0,160,140,66,33,16,36,195,23,183,204,65,0,160,140,66,240,39,32,195,161,103,216,65,0,160,140,66,0,64,28,195,184,47,229,65,0,160,140,66,16,88,24,195,85,48,251,65,0,160,140,66,33,112,20,195,29,26,2,66,0,160,140,66,240,135,16,195,66,32,4,66,0,160,140,66,0,160,12,195,237,94,4,66,0,160,140,66,16,184,8,195,186,9,7,66,0,160,140,66,33,208,4,195,177,191,8,66,0,160,140,66,240,231,0,195,56,248,5,66,0,160,140,66,0,0,250,194,16,186,8,66,0,160,140,66,33,48,242,194,87,219,5,66,0,160,140,66,66,96,234,194,219,74,
+1,66,0,160,140,66,223,143,226,194,119,126,0,66,0,160,140,66,0,192,218,194,45,178,2,66,0,160,140,66,33,240,210,194,240,5,3,66,0,160,140,66,66,32,203,194,90,245,1,66,0,160,140,66,7,80,195,194,35,91,246,65,0,160,140,66,0,128,187,194,19,242,240,65,0,160,140,66,7,176,179,194,64,147,229,65,0,160,140,66,0,224,171,194,23,217,212,65,0,160,140,66,7,16,164,194,65,113,198,65,0,160,140,66,0,64,156,194,19,225,186,65,0,160,140,66,7,112,148,194,88,74,164,65,0,160,140,66,0,160,140,194,82,73,146,65,0,160,140,66,7,
+208,132,194,14,45,141,65,0,160,140,66,0,0,122,194,65,2,139,65,0,160,140,66,13,96,106,194,204,127,130,65,0,160,140,66,0,192,90,194,137,65,96,65,0,160,140,66,13,32,75,194,113,27,58,65,0,160,140,66,0,128,59,194,92,3,27,65,0,160,140,66,13,224,43,194,211,48,10,65,0,160,140,66,0,64,28,194,204,98,8,65,0,160,140,66,13,160,12,194,172,173,37,65,0,160,140,66,0,0,250,193,96,229,49,65,0,160,140,66,26,192,218,193,36,40,77,65,0,160,140,66,0,128,187,193,169,19,100,65,0,160,140,66,26,64,156,193,111,129,118,65,0,160,
+140,66,0,0,122,193,0,0,135,65,0,160,140,66,52,128,59,193],"i8",I,v.k);
+K([248,194,141,65,0,160,140,66,0,0,250,192,112,95,149,65,0,160,140,66,0,0,122,192,143,194,157,65,0,160,140,66,0,0,0,0,3,120,170,65,0,160,140,66,0,0,122,64,129,149,183,65,0,160,140,66,0,0,122,195,109,255,144,64,7,208,132,66,16,24,118,195,98,21,111,64,7,208,132,66,33,48,114,195,115,162,115,64,7,208,132,66,240,71,110,195,86,154,141,64,7,208,132,66,0,96,106,195,176,3,161,64,7,208,132,66,16,120,102,195,156,80,212,64,7,208,132,66,33,144,98,195,223,253,244,64,7,208,132,66,240,167,94,195,75,217,8,65,7,208,
+132,66,0,192,90,195,162,127,11,65,7,208,132,66,16,216,86,195,11,12,246,64,7,208,132,66,33,240,82,195,106,118,9,65,7,208,132,66,240,7,79,195,76,207,27,65,7,208,132,66,0,32,75,195,36,40,34,65,7,208,132,66,16,56,71,195,82,184,33,65,7,208,132,66,33,80,67,195,251,58,50,65,7,208,132,66,240,103,63,195,143,83,89,65,7,208,132,66,0,128,59,195,238,235,119,65,7,208,132,66,16,152,55,195,142,117,140,65,7,208,132,66,33,176,51,195,204,110,159,65,7,208,132,66,240,199,47,195,31,116,168,65,7,208,132,66,0,224,43,195,
+157,0,180,65,7,208,132,66,16,248,39,195,94,203,204,65,7,208,132,66,33,16,36,195,222,19,216,65,7,208,132,66,240,39,32,195,50,85,223,65,7,208,132,66,0,64,28,195,242,48,239,65,7,208,132,66,16,88,24,195,201,182,0,66,7,208,132,66,33,112,20,195,129,68,8,66,7,208,132,66,240,135,16,195,54,13,10,66,7,208,132,66,0,160,12,195,207,183,8,66,7,208,132,66,16,184,8,195,12,83,5,66,7,208,132,66,33,208,4,195,66,224,3,66,7,208,132,66,240,231,0,195,114,202,3,66,7,208,132,66,0,0,250,194,12,19,6,66,7,208,132,66,33,48,242,
+194,209,226,3,66,7,208,132,66,66,96,234,194,142,245,1,66,7,208,132,66,223,143,226,194,220,87,4,66,7,208,132,66,0,192,218,194,180,153,2,66,7,208,132,66,33,240,210,194,84,99,3,66,7,208,132,66,66,32,203,194,199,58,3,66,7,208,132,66,7,80,195,194,95,135,252,65,7,208,132,66,0,128,187,194,121,216,235,65,7,208,132,66,7,176,179,194,100,93,229,65,7,208,132,66,0,224,171,194,150,67,211,65,7,208,132,66,7,16,164,194,242,48,195,65,7,208,132,66,0,64,156,194,85,65,179,65,7,208,132,66,7,112,148,194,237,158,161,65,
+7,208,132,66,0,160,140,194,16,105,148,65,7,208,132,66,7,208,132,194,59,112,136,65,7,208,132,66,0,0,122,194,151,127,136,65,7,208,132,66,13,96,106,194,186,218,127,65,7,208,132,66,0,192,90,194,76,55,86,65,7,208,132,66,13,32,75,194,232,217,61,65,7,208,132,66,0,128,59,194,160,108,16,65,7,208,132,66,13,224,43,194,237,216,15,65,7,208,132,66,0,64,28,194,106,222,32,65,7,208,132,66,13,160,12,194,38,83,59,65,7,208,132,66,0,0,250,193,250,237,71,65,7,208,132,66,26,192,218,193,133,235,96,65,7,208,132,66,0,128,
+187,193,105,111,115,65,7,208,132,66,26,64,156,193,212,171,133,65,7,208,132,66,0,0,122,193,62,104,142,65,7,208,132,66,52,128,59,193,157,17,152,65,7,208,132,66,0,0,250,192,38,228,167,65,7,208,132,66,0,0,122,192,237,141,181,65,7,208,132,66,0,0,0,0,122,182,191,65,7,208,132,66,0,0,122,64,130,115,204,65,7,208,132,66,0,0,122,195,91,177,149,64,0,0,122,66,16,24,118,195,238,90,141,64,0,0,122,66,33,48,114,195,32,239,123,64,0,0,122,66,240,71,110,195,22,53,144,64,0,0,122,66,0,96,106,195,49,177,176,64,0,0,122,
+66,16,120,102,195,143,83,227,64,0,0,122,66,33,144,98,195,32,164,1,65,0,0,122,66,240,167,94,195,76,224,5,65,0,0,122,66,0,192,90,195,212,84,9,65,0,0,122,66,16,216,86,195,230,22,9,65,0,0,122,66,33,240,82,195,89,64,31,65,0,0,122,66,240,7,79,195,174,216,39,65,0,0,122,66,0,32,75,195,244,253,44,65,0,0,122,66,16,56,71,195,216,129,57,65,0,0,122,66,33,80,67,195,246,151,80,65,0,0,122,66,240,103,63,195,140,74,106,65,0,0,122,66,0,128,59,195,102,230,133,65,0,0,122,66,16,152,55,195,159,77,147,65,0,0,122,66,33,176,
+51,195,144,160,167,65,0,0,122,66,240,199,47,195,198,237,184,65,0,0,122,66,0,224,43,195,174,54,200,65,0,0,122,66,16,248,39,195,78,226,213,65,0,0,122,66,33,16,36,195,30,150,221,65,0,0,122,66,240,39,32,195,136,227,232,65,0,0,122,66,0,64,28,195,37,134,249,65,0,0,122,66,16,88,24,195,10,232,3,66,0,0,122,66,33,112,20,195,150,225,5,66,0,0,122,66,240,135,16,195,35,219,6,66,0,0,122,66,0,160,12,195,147,152,6,66,0,0,122,66,16,184,8,195,49,25,4,66,0,0,122,66,33,208,4,195,84,244,2,66,0,0,122,66,240,231,0,195,119,
+109,2,66,0,0,122,66,0,0,250,194,177,161,2,66,0,0,122,66,33,48,242,194,150,195,252,65,0,0,122,66,66,96,234,194,7,223,254,65,0,0,122,66,223,143,226,194,13,224,2,66,0,0,122,66,0,192,218,194,86,142,3,66,0,0,122,66,33,240,210,194,67,237,2,66,0,0,122,66,66,32,203,194,13,177,1,66,0,0,122,66,7,80,195,194,196,177,249,65,0,0,122,66,0,128,187,194,142,117,245,65,0,0,122,66,7,176,179,194,8,172,228,65,0,0,122,66,0,224,171,194,71,242,208,65,0,0,122,66,7,16,164,194,182,132,190,65,0,0,122,66,0,64,156,194,51,68,176,
+65,0,0,122,66,7,112,148,194,139,108,161,65,0,0,122,66,0,160,140,194,203,161,149,65,0,0,122,66,7,208,132,194,198,109,134,65,0,0,122,66,0,0,122,194,16,122,123,65,0,0,122,66,13,96,106,194,186,218,94,65,0,0,122,66,0,192,90,194,107,43,81,65,0,0,122,66,13,32,75,194,192,91,62,65,0,0,122,66,0,128,59,194,147,157,30,65,0,0,122,66,13,224,43,194,106,77,34,65,0,0,122,66,0,64,28,194,47,221,52,65,0,0,122,66,13,160,12,194,119,45,72,65,0,0,122,66,0,0,250,193,193,202,97,65,0,0,122,66,26,192,218,193,236,81,117,65,0,
+0,122,66,0,128,187,193,161,248,132,65,0,0,122,66,26,64,156,193,116,198,142,65,0,0,122,66,0,0,122,193,189,99,154,65,0,0,122,66,52,128,59,193,73,157,167,65,0,0,122,66,0,0,250,192,99,110,187,65,0,0,122,66,0,0,122,192,210,128,199,65,0,0,122,66,0,0,0,0,125,63,209,65,0,0,122,66,0,0,122,64,15,139,217,65,0,0,122,66,0,0,122,195,0,169,135,64,13,96,106,66,16,24,118,195,63,53,154,64,13,96,106,66,33,48,114,195,115,46,148,64,13,96,106,66,240,71,110,195,144,73,169,64,13,96,106,66,0,96,106,195,248,107,207,64,13,
+96,106,66,16,120,102,195,83,121,219,64,13,96,106,66,33,144,98,195,200,152,7,65,13,96,106,66,240,167,94,195,0,58,12,65,13,96,106,66,0,192,90,195,115,232,19,65,13,96,106,66,16,216,86,195,28,211,26,65,13,96,106,66,33,240,82,195,155,230,44,65,13,96,106,66,240,7,79,195,224,45,69,65,13,96,106,66,0,32,75,195,186,218,75,65,13,96,106,66,16,56,71,195,163,35,76,65,13,96,106,66,33,80,67,195,69,216,101,65,13,96,106,66,240,103,63,195,113,44,129,65,13,96,106,66,0,128,59,195,38,100,136,65,13,96,106,66,16,152,55,
+195,61,172,153,65,13,96,106,66,33,176,51,195,233,72,174,65,13,96,106,66,240,199,47,195,97,67,198,65,13,96,106,66,0,224,43,195,179,234,209,65,13,96,106,66,16,248,39,195,110,52,218,65,13,96,106,66,33,16,36,195,208,85,226,65,13,96,106,66,240,39,32,195,137,193,244,65,13,96,106,66,0,64,28,195,251,11,1,66,13,96,106,66,16,88,24,195,158,158,3,66,13,96,106,66,33,112,20,195,104,51,3,66,13,96,106,66,240,135,16,195,129,230,1,66,13,96,106,66,0,160,12,195,158,158,1,66,13,96,106,66,16,184,8,195,157,64,6,66,13,96,
+106,66,33,208,4,195,253,135,5,66,13,96,106,66,240,231,0,195,244,108,4,66,13,96,106,66,0,0,250,194,187,56,1,66,13,96,106,66,33,48,242,194,208,4,2,66,13,96,106,66,66,96,234,194,100,76,1,66,13,96,106,66,223,143,226,194,216,193,1,66,13,96,106,66,0,192,218,194,70,54,2,66,13,96,106,66,33,240,210,194,96,182,3,66,13,96,106,66,66,32,203,194,202,212,254,65,13,96,106,66,7,80,195,194,4,103,247,65,13,96,106,66,0,128,187,194,96,118,243,65,13,96,106,66,7,176,179,194,209,162,226,65,13,96,106,66,0,224,171,194,125,
+80,204,65,13,96,106,66,7,16,164,194,132,141,184,65,13,96,106,66,0,64,156,194,61,10,172,65,13,96,106,66,7,112,148,194,49,153,168,65,13,96,106,66,0,160,140,194,229,242,152,65,13,96,106,66,7,208,132,194,79,64,134,65,13,96,106,66,0,0,122,194,133,124,115,65,13,96,106,66,13,96,106,194,203,16,98,65,13,96,106,66,0,192,90,194,248,194,83,65,13,96,106,66,13,32,75,194,4,86,62,65,13,96,106,66,0,128,59,194,37,117,49,65,13,96,106,66,13,224,43,194,219,249,75,65,13,96,106,66,0,64,28,194,162,69,91,65,13,96,106,66,
+13,160,12,194,7,206,105,65,13,96,106,66,0,0,250,193,106,188,120,65,13,96,106,66,26,192,218,193,45,67,134,65,13,96,106,66,0,128,187,193,249,15,150,65,13,96,106,66,26,64,156,193,93,92,158,65,13,96,106,66,0,0,122,193,13,224,174,65,13,96,106,66,52,128,59,193,177,208,181,65,13,96,106,66,0,0,250,192,47,221,199,65,13,96,106,66,0,0,122,192,164,112,211,65,13,96,106,66,0,0,0,0,163,146,219,65,13,96,106,66,0,0,122,64,199,203,226,65,13,96,106,66,0,0,122,195,162,40,104,64,0,192,90,66,16,24,118,195,160,84,117,64,
+0,192,90,66,33,48,114,195,72,22,142,64,0,192,90,66,240,71,110,195,242,205,168,64,0,192,90,66,0,96,106,195,18,20,238,64,0,192,90,66,16,120,102,195,179,239,242,64,0,192,90,66,33,144,98,195,58,163,4,65,0,192,90,66,240,167,94,195,14,243,25,65,0,192,90,66,0,192,90,195,175,148,42,65,0,192,90,66,16,216,86,195,96,118,49,65,0,192,90,66,33,240,82,195,99,127,67,65,0,192,90,66,240,7,79,195,14,45,83,65,0,192,90,66,0,32,75,195,161,248,95,65,0,192,90,66,16,56,71,195,101,25,101,65,0,192,90,66,33,80,67,195,203,16,
+110,65,0,192,90,66,240,103,63,195,199,169,132,65,0,192,90,66,0,128,59,195,23,217,145,65,0,192,90,66,16,152,55,195,46,127,160,65,0,192,90,66,33,176,51,195,30,39,183,65,0,192,90,66,240,199,47,195,61,172,200,65,0,192,90,66,0,224,43,195,37,134,212,65,0,192,90,66,16,248,39,195,103,213,218,65,0,192,90,66,33,16,36,195,48,204,233,65,0,192,90,66,240,39,32,195,174,71,247,65,0,192,90,66,0,64,28,195,180,89,5,66,0,192,90,66,16,88,24,195,240,133,3,66,0,192,90,66,33,112,20,195,46,80,2,66,0,192,90,66,240,135,16,
+195,136,116,2,66,0,192,90,66,0,160,12,195,206,153,3,66,0,192,90,66,16,184,8,195,192,236,8,66,0,192,90,66,33,208,4,195,129,85,7,66,0,192,90,66,240,231,0,195,2,107,3,66,0,192,90,66,0,0,250,194,87,172,6,66,0,192,90,66,33,48,242,194,48,251,3,66,0,192,90,66,66,96,234,194,213,9,2,66,0,192,90,66,223,143,226,194,9,185,1,66,0,192,90,66,0,192,218,194,58,146,254,65,0,192,90,66,33,240,210,194,217,206,254,65,0,192,90,66,66,32,203,194,61,27,253,65,0,192,90,66,7,80,195,194,185,124,243,65,0,192,90,66,0,128,187,194,
+222,113,231,65,0,192,90,66,7,176,179,194,150,195,212,65,0,192,90,66,0,224,171,194,134,201,197,65,0,192,90,66,7,16,164,194,219,121,184,65,0,192,90,66,0,64,156,194,174,216,170,65,0,192,90,66,7,112,148,194,200,7,163,65,0,192,90,66,0,160,140,194,145,143,154,65,0,192,90,66,7,208,132,194,119,173,135,65,0,192,90,66,0,0,122,194,169,164,106,65,0,192,90,66,13,96,106,194,161,214,103,65,0,192,90,66,0,192,90,194,191,125,85,65,0,192,90,66,13,32,75,194,242,65,69,65,0,192,90,66,0,128,59,194,149,101,74,65,0,192,90,
+66,13,224,43,194,217,61,100,65,0,192,90,66,0,64,28,194,234,4,123,65,0,192,90,66,13,160,12,194,98,161,129,65,0,192,90,66,0,0,250,193,158,222,137,65,0,192,90,66,26,192,218,193,55,26,150,65,0,192,90,66,0,128,187,193,68,250,161,65,0,192,90,66,26,64,156,193,124,114,173,65,0,192,90,66,0,0,122,193,8,172,192,65,0,192,90,66,52,128,59,193,254,67,201,65,0,192,90,66,0,0,250,192,154,153,213,65,0,192,90,66,0,0,122,192,57,86,220,65,0,192,90,66,0,0,0,0,95,152,226,65,0,192,90,66,0,0,122,64,70,165,233,65,0,192,90,
+66,0,0,122,195,206,199,111,64,13,32,75,66,16,24,118,195,241,17,121,64,13,32,75,66,33,48,114,195,53,239,131,64,13,32,75,66,240,71,110,195,173,105,165,64,13,32,75,66,0,96,106,195,224,185,201,64,13,32,75,66,16,120,102,195,49,8,231,64,13,32,75,66,33,144,98,195,194,204,9,65,13,32,75,66,240,167,94,195,111,18,34,65,13,32,75,66,0,192,90,195,52,128,68,65,13,32,75,66,16,216,86,195,94,75,69,65,13,32,75,66,33,240,82,195,79,64,86,65,13,32,75,66,240,7,79,195,222,113,98,65,13,32,75,66,0,32,75,195,206,136,96,65,
+13,32,75,66,16,56,71,195,37,6,109,65,13,32,75,66,33,80,67,195,31,133,133,65,13,32,75,66,240,103,63,195,172,28,141,65,13,32,75,66,0,128,59,195,135,22,154,65,13,32,75,66,16,152,55,195,231,251,165,65,13,32,75,66,33,176,51,195,165,172,186,65,13,32,75,66,240,199,47,195,158,222,203,65,13,32,75,66,0,224,43,195,202,195,214,65,13,32,75,66,16,248,39,195,251,58,222,65,13,32,75,66,33,16,36,195,163,35,240,65,13,32,75,66,240,39,32,195,27,141,248,65,13,32,75,66,0,64,28,195,245,91,2,66,13,32,75,66,16,88,24,195,208,
+68,2,66,13,32,75,66,33,112,20,195,146,220,1,66,13,32,75,66,240,135,16,195,217,206,6,66,13,32,75,66,0,160,12,195,134,9,11,66,13,32,75,66,16,184,8,195,104,162,7,66,13,32,75,66,33,208,4,195,88,185,6,66,13,32,75,66,240,231,0,195,48,140,6,66,13,32,75,66,0,0,250,194,254,37,8,66,13,32,75,66,33,48,242,194,13,49,8,66,13,32,75,66,66,96,234,194,80,13,10,66,13,32,75,66,223,143,226,194,44,212,6,66,13,32,75,66,0,192,218,194,238,26,1,66,13,32,75,66,33,240,210,194,66,62,0,66,13,32,75,66,66,32,203,194,153,170,248,
+65,13,32,75,66,7,80,195,194,155,85,239,65,13,32,75,66,0,128,187,194,77,21,230,65,13,32,75,66,7,176,179,194,129,166,215,65,13,32,75,66,0,224,171,194,143,83,198,65,13,32,75,66,7,16,164,194,10,87,190,65,13,32,75,66,0,64,156,194,45,161,173,65,13,32,75,66,7,112,148,194,20,63,156,65,13,32,75,66,0,160,140,194,144,177,154,65,13,32,75,66,7,208,132,194,29,201,142,65,13,32,75,66,0,0,122,194,80,252,99,65,13,32,75,66,13,96,106,194,198,220,107,65,13,32,75,66,0,192,90,194,203,161,96,65,13,32,75,66,13,32,75,194,
+175,148,79,65,13,32,75,66,0,128,59,194,82,39,95,65,13,32,75,66,13,224,43,194,118,79,125,65,13,32,75,66,0,64,28,194,184,64,133,65,13,32,75,66,13,160,12,194,105,0,137,65,13,32,75,66,0,0,250,193,49,153,149,65,13,32,75,66,26,192,218,193,25,4,167,65,13,32,75,66,0,128,187,193,255,50,176,65,13,32,75,66,26,64,156,193,197,126,183,65,13,32,75,66,0,0,122,193,238,124,205,65,13,32,75,66,52,128,59,193,10,104,209,65,13,32,75,66,0,0,250,192,249,15,227,65,13,32,75,66,0,0,122,192,223,96,230,65,13,32,75,66,0,0,0,0,
+32,210,237,65,13,32,75,66,0,0,122,64,222,113,243,65,13,32,75,66,0,0,122,195,240,80,108,64,0,128,59,66,16,24,118,195,112,177,120,64,0,128,59,66,33,48,114,195,255,4,127,64,0,128,59,66,240,71,110,195,42,145,160,64,0,128,59,66,0,96,106,195,245,156,231,64,0,128,59,66,16,120,102,195,88,255,248,64,0,128,59,66,33,144,98,195,2,217,8,65,0,128,59,66,240,167,94,195,94,75,36,65,0,128,59,66,0,192,90,195,52,17,51,65,0,128,59,66,16,216,86,195,117,147,70,65,0,128,59,66,33,240,82,195,219,138,91,65,0,128,59,66,240,
+7,79,195,142,117,103,65,0,128,59,66,0,32,75,195,117,147,120,65,0,128,59,66,16,56,71,195,240,167,121,65,0,128,59,66,33,80,67,195,202,195,134,65,0,128,59,66,240,103,63,195,140,185,147,65,0,128,59,66,0,128,59,195,236,81,155,65,0,128,59,66,16,152,55,195,159,205,166,65,0,128,59,66,33,176,51,195,170,130,191,65,0,128,59,66,240,199,47,195,100,93,210,65,0,128,59,66,0,224,43,195,229,97,221,65,0,128,59,66,16,248,39,195,99,255,225,65,0,128,59,66,33,16,36,195,208,51,237,65,0,128,59,66,240,39,32,195,167,121,255,
+65,0,128,59,66,0,64,28,195,75,170,5,66,0,128,59,66,16,88,24,195,70,182,5,66,0,128,59,66,33,112,20,195,71,67,5,66,0,128,59,66,240,135,16,195,32,129,6,66,0,128,59,66,0,160,12,195,85,193,12,66,0,128,59,66,16,184,8,195,164,95,11,66,0,128,59,66,33,208,4,195,211,124,8,66,0,128,59,66,240,231,0,195,91,211,9,66,0,128,59,66,0,0,250,194,64,228,11,66,0,128,59,66,33,48,242,194,63,134,11,66,0,128,59,66,66,96,234,194,113,189,12,66,0,128,59,66,223,143,226,194,80,141,8,66,0,128,59,66,0,192,218,194,175,212,2,66,0,
+128,59,66,33,240,210,194,58,227,0,66,0,128,59,66,66,32,203,194,225,250,249,65,0,128,59,66,7,80,195,194,168,181,239,65,0,128,59,66,0,128,187,194,161,248,224,65,0,128,59,66,7,176,179,194,17,182,216,65,0,128,59,66,0,224,171,194,106,188,200,65,0,128,59,66,7,16,164,194,184,47,187,65,0,128,59,66,0,64,156,194,51,51,178,65,0,128,59,66,7,112,148,194,223,224,158,65,0,128,59,66,0,160,140,194,160,9,151,65,0,128,59,66,7,208,132,194,114,249,137,65,0,128,59,66,0,0,122,194,219,249,119,65,0,128,59,66,13,96,106,194,
+58,146,104,65,0,128,59,66,0,192,90,194,116,36,107,65,0,128,59,66,13,32,75,194,246,151,85,65,0,128,59,66,0,128,59,194,153,42,122,65,0,128,59,66,13,224,43,194,217,189,133,65,0,128,59,66,0,64,28,194,33,159,139,65,0,128,59,66,13,160,12,194,196,66,146,65,0,128,59,66,0,0,250,193,104,162,162,65,0,128,59,66,26,192,218,193,213,120,181,65,0,128,59,66,0,128,187,193,211,77,188,65,0,128,59,66,26,64,156,193,210,111,194,65,0,128,59,66,0,0,122,193,241,227,208,65,0,128,59,66,52,128,59,193,161,231,219,65,0,128,59,
+66,0,0,250,192,140,219,234,65,0,128,59,66,0,0,122,192,186,73,238,65,0,128,59,66,0,0,0,0,220,232,242,65,0,128,59,66,0,0,122,64,129,4,247,65,0,128,59,66,0,0,122,195,41,150,130,64,13,224,43,66,16,24,118,195,4,33,131,64,13,224,43,66,33,48,114,195,119,21,120,64,13,224,43,66,240,71,110,195,146,232,163,64,13,224,43,66,0,96,106,195,191,183,214,64,13,224,43,66,16,120,102,195,7,66,248,64,13,224,43,66,33,144,98,195,43,48,2,65,13,224,43,66,240,167,94,195,201,159,13,65,13,224,43,66,0,192,90,195,59,1,47,65,13,
+224,43,66,16,216,86,195,3,120,70,65,13,224,43,66,33,240,82,195,232,106,87,65,13,224,43,66,240,7,79,195,97,195,107,65,13,224,43,66,0,32,75,195,20,174,121,65,13,224,43,66,16,56,71,195,197,254,123,65,13,224,43,66,33,80,67,195,213,120,137,65,13,224,43,66,240,103,63,195,118,241,154,65,13,224,43,66,0,128,59,195,93,92,169,65,13,224,43,66,16,152,55,195,97,195,181,65,13,224,43,66,33,176,51,195,157,128,198,65,13,224,43,66,240,199,47,195,101,42,214,65,13,224,43,66,0,224,43,195,77,4,222,65,13,224,43,66,16,248,
+39,195,130,243,230,65,13,224,43,66,33,16,36,195,201,246,248,65,13,224,43,66,240,39,32,195,240,39,5,66,13,224,43,66,0,64,28,195,66,32,9,66,13,224,43,66,16,88,24,195,54,235,7,66,13,224,43,66,33,112,20,195,196,2,9,66,13,224,43,66,240,135,16,195,32,193,8,66,13,224,43,66,0,160,12,195,213,120,11,66,13,224,43,66,16,184,8,195,170,160,14,66,13,224,43,66,33,208,4,195,230,255,13,66,13,224,43,66,240,231,0,195,204,191,13,66,13,224,43,66,0,0,250,194,244,125,17,66,13,224,43,66,33,48,242,194,187,184,13,66,13,224,
+43,66,66,96,234,194,206,106,9,66,13,224,43,66,223,143,226,194,170,66,12,66,13,224,43,66,0,192,218,194,57,5,6,66,13,224,43,66,33,240,210,194,78,226,1,66,13,224,43,66,66,32,203,194,17,54,250,65,13,224,43,66,7,80,195,194,61,27,238,65,13,224,43,66,0,128,187,194,29,73,223,65,13,224,43,66,7,176,179,194,233,55,212,65,13,224,43,66,0,224,171,194,136,244,201,65,13,224,43,66,7,16,164,194,217,223,188,65,13,224,43,66,0,64,156,194,72,191,175,65,13,224,43,66,7,112,148,194,93,254,155,65,13,224,43,66,0,160,140,194,
+181,149,142,65,13,224,43,66,7,208,132,194,254,67,139,65,13,224,43,66,0,0,122,194,26,192,136,65,13,224,43,66,13,96,106,194,87,91,117,65,13,224,43,66,0,192,90,194,14,190,108,65,13,224,43,66,13,32,75,194,179,234,111,65,13,224,43,66,0,128,59,194,19,114,137,65,13,224,43,66,13,224,43,194,170,241,144,65,13,224,43,66,0,64,28,194,175,165,152,65,13,224,43,66,13,160,12,194,169,147,157,65,13,224,43,66,0,0,250,193,76,55,173,65,13,224,43,66,26,192,218,193,114,121,187,65,13,224,43,66,0,128,187,193,0,145,196,65,
+13,224,43,66,26,64,156,193,55,154,201,65,13,224,43,66,0,0,122,193,122,182,214,65,13,224,43,66,52,128,59,193,114,121,231,65,13,224,43,66,0,0,250,192,97,67,239,65,13,224,43,66,0,0,122,192,221,36,250,65,13,224,43,66,0,0,0,0,255,33,251,65,13,224,43,66,0,0,122,64,240,39,255,65,13,224,43,66,0,0,122,195,203,243,136,64,0,64,28,66,16,24,118,195,86,130,134,64,0,64,28,66,33,48,114,195,6,100,115,64,0,64,28,66,240,71,110,195,150,91,153,64,0,64,28,66,0,96,106,195,57,151,176,64,0,64,28,66,16,120,102,195,160,79,
+221,64,0,64,28,66,33,144,98,195,189,29,4,65,0,64,28,66,240,167,94,195,30,155,13,65,0,64,28,66,0,192,90,195,75,48,25,65,0,64,28,66,16,216,86,195,8,61,54,65,0,64,28,66,33,240,82,195,35,74,73,65,0,64,28,66,240,7,79,195,176,3,100,65,0,64,28,66,0,32,75,195,89,134,108,65,0,64,28,66,16,56,71,195,125,174,127,65,0,64,28,66,33,80,67,195,72,97,139,65,0,64,28,66,240,103,63,195,125,208,156,65,0,64,28,66,0,128,59,195,66,224,176,65,0,64,28,66,16,152,55,195,153,170,190,65,0,64,28,66,33,176,51,195,108,137,200,65,
+0,64,28,66,240,199,47,195,134,218,216,65,0,64,28,66,0,224,43,195,0,0,228,65,0,64,28,66,16,248,39,195,51,179,239,65,0,64,28,66,33,16,36,195,217,142,1,66,0,64,28,66,240,39,32,195,35,74,7,66,0,64,28,66,0,64,28,195,240,86,9,66,0,64,28,66,16,88,24,195,73,221,9,66,0,64,28,66,33,112,20,195,247,228,10,66,0,64,28,66,240,135,16,195,156,115,8,66,0,64,28,66,0,160,12,195,251,156,11,66,0,64,28,66,16,184,8,195,217,125,14,66,0,64,28,66,33,208,4,195,113,219,14,66,0,64,28,66,240,231,0,195,67,220,18,66,0,64,28,66,0,
+0,250,194,97,212,19,66,0,64,28,66,33,48,242,194,166,74,16,66,0,64,28,66,66,96,234,194,79,222,12,66,0,64,28,66,223,143,226,194,185,188,11,66,0,64,28,66,0,192,218,194,102,72,10,66,0,64,28,66,33,240,210,194,182,4,6,66,0,64,28,66,66,32,203,194,242,210,250,65,0,64,28,66,7,80,195,194,245,57,240,65,0,64,28,66,0,128,187,194,129,4,229,65,0,64,28,66,7,176,179,194,222,130,211,65,0,64,28,66,0,224,171,194,247,134,198,65,0,64,28,66,7,16,164,194,106,60,184,65,0,64,28,66,0,64,156,194,152,221,168,65,0,64,28,66,7,
+112,148,194,191,253,152,65,0,64,28,66,0,160,140,194,48,187,144,65,0,64,28,66,7,208,132,194,228,148,138,65,0,64,28,66,0,0,122,194,78,209,136,65,0,64,28,66,13,96,106,194,59,112,131,65,0,64,28,66,0,192,90,194,245,185,122,65,0,64,28,66,13,32,75,194,253,135,132,65,0,64,28,66,0,128,59,194,242,210,147,65,0,64,28,66,13,224,43,194,177,80,155,65,0,64,28,66,0,64,28,194,22,123,159,65,0,64,28,66,13,160,12,194,242,193,162,65,0,64,28,66,0,0,250,193,120,122,179,65,0,64,28,66,26,192,218,193,6,146,196,65,0,64,28,66,
+0,128,187,193,59,95,204,65,0,64,28,66,26,64,156,193,72,225,211,65,0,64,28,66,0,0,122,193,4,86,226,65,0,64,28,66,52,128,59,193,71,3,240,65,0,64,28,66,0,0,250,192,71,3,1,66,0,64,28,66,0,0,122,192,227,135,6,66,0,64,28,66,0,0,0,0,10,87,7,66,0,64,28,66,0,0,122,64,28,171,11,66,0,64,28,66,0,0,122,195,24,207,122,64,13,160,12,66,16,24,118,195,186,102,88,64,13,160,12,66,33,48,114,195,8,61,81,64,13,160,12,66,240,71,110,195,65,43,130,64,13,160,12,66,0,96,106,195,182,248,155,64,13,160,12,66,16,120,102,195,173,
+163,207,64,13,160,12,66,33,144,98,195,89,139,229,64,13,160,12,66,240,167,94,195,201,101,3,65,13,160,12,66,0,192,90,195,176,131,3,65,13,160,12,66,16,216,86,195,8,172,38,65,13,160,12,66,33,240,82,195,249,49,63,65,13,160,12,66,240,7,79,195,203,161,86,65,13,160,12,66,0,32,75,195,207,102,97,65,13,160,12,66,16,56,71,195,138,31,120,65,13,160,12,66,33,80,67,195,116,53,135,65,13,160,12,66,240,103,63,195,25,132,163,65,13,160,12,66,0,128,59,195,12,2,184,65,13,160,12,66,16,152,55,195,193,40,192,65,13,160,12,
+66,33,176,51,195,101,170,205,65,13,160,12,66,240,199,47,195,22,106,218,65,13,160,12,66,0,224,43,195,206,170,231,65,13,160,12,66,16,248,39,195,178,46,249,65,13,160,12,66,33,16,36,195,57,116,3,66,13,160,12,66,240,39,32,195,241,52,6,66,13,160,12,66,0,64,28,195,237,77,10,66,13,160,12,66,16,88,24,195,237,77,10,66,13,160,12,66,33,112,20,195,1,205,8,66,13,160,12,66,240,135,16,195,237,222,10,66,13,160,12,66,0,160,12,195,222,66,14,66,13,160,12,66,16,184,8,195,124,50,15,66,13,160,12,66,33,208,4,195,104,115,
+20,66,13,160,12,66,240,231,0,195,165,253,20,66,13,160,12,66,0,0,250,194,93,126,19,66,13,160,12,66,33,48,242,194,95,169,13,66,13,160,12,66,66,96,234,194,2,107,11,66,13,160,12,66,223,143,226,194,16,186,13,66,13,160,12,66,0,192,218,194,152,174,11,66,13,160,12,66,33,240,210,194,199,11,6,66,13,160,12,66,66,32,203,194,124,242,0,66,13,160,12,66,7,80,195,194,124,225,242,65,13,160,12,66,0,128,187,194,149,84,234,65,13,160,12,66,7,176,179,194,50,213,219,65,13,160,12,66,0,224,171,194,238,124,198,65,13,160,12,
+66,7,16,164,194,185,252,187,65,13,160,12,66,0,64,156,194,227,165,171,65,13,160,12,66,7,112,148,194,144,49,159,65,13,160,12,66,0,160,140,194,25,226,141,65,13,160,12,66,7,208,132,194,235,115,138,65,13,160,12,66,0,0,122,194,96,101,137,65,13,160,12,66,13,96,106,194,94,58,132,65,13,160,12,66,0,192,90,194,196,66,138,65,13,160,12,66,13,32,75,194,126,140,149,65,13,160,12,66,0,128,59,194,229,97,155,65,13,160,12,66,13,224,43,194,27,158,161,65,13,160,12,66,0,64,28,194,167,104,171,65,13,160,12,66,13,160,12,194,
+138,159,172,65,13,160,12,66,0,0,250,193,222,19,192,65,13,160,12,66,26,192,218,193,181,149,203,65,13,160,12,66,0,128,187,193,95,7,208,65,13,160,12,66,26,64,156,193,16,122,219,65,13,160,12,66,0,0,122,193,154,247,241,65,13,160,12,66,52,128,59,193,113,61,3,66,13,160,12,66,0,0,250,192,107,43,11,66,13,160,12,66,0,0,122,192,20,144,15,66,13,160,12,66,0,0,0,0,233,230,19,66,13,160,12,66,0,0,122,64,186,43,26,66,13,160,12,66,0,0,122,195,87,67,18,64,0,0,250,65,16,24,118,195,191,183,209,63,0,0,250,65,33,48,114,
+195,84,198,25,64,0,0,250,65,240,71,110,195,212,125,76,64,0,0,250,65,0,96,106,195,183,156,127,64,0,0,250,65,16,120,102,195,75,229,159,64,0,0,250,65,33,144,98,195,54,60,180,64,0,0,250,65,240,167,94,195,60,160,219,64,0,0,250,65,0,192,90,195,59,1,236,64,0,0,250,65,16,216,86,195,212,142,21,65,0,0,250,65,33,240,82,195,32,65,59,65,0,0,250,65,240,7,79,195,247,228,86,65,0,0,250,65,0,32,75,195,141,40,103,65,0,0,250,65,16,56,71,195,113,27,126,65,0,0,250,65,33,80,67,195,195,245,142,65,0,0,250,65,240,103,63,195,
+77,243,167,65,0,0,250,65,0,128,59,195,51,68,188,65,0,0,250,65,16,152,55,195,29,73,195,65,0,0,250,65,33,176,51,195,24,166,208,65,0,0,250,65,240,199,47,195,109,214,223,65,0,0,250,65,0,224,43,195,180,217,235,65,0,0,250,65,16,248,39,195,36,168,253,65,0,0,250,65,33,16,36,195,155,85,4,66,0,0,250,65,240,39,32,195,50,102,6,66,0,0,250,65,0,64,28,195,33,31,6,66,0,0,250,65,16,88,24,195,187,248,7,66,0,0,250,65,33,112,20,195,3,184,13,66,0,0,250,65,240,135,16,195,249,207,17,66,0,0,250,65,0,160,12,195,198,173,15,
+66,0,0,250,65,16,184,8,195,86,189,18,66,0,0,250,65,33,208,4,195,176,67,23,66,0,0,250,65,240,231,0,195,102,119,22,66,0,0,250,65,0,0,250,194,57,197,19,66,0,0,250,65,33,48,242,194,34,142,14,66,0,0,250,65,66,96,234,194,170,2,12,66,0,0,250,65,223,143,226,194,68,139,13,66,0,0,250,65,0,192,218,194,202,131,10,66,0,0,250,65,33,240,210,194,181,149,7,66,0,0,250,65,66,32,203,194,211,188,0,66,0,0,250,65,7,80,195,194,94,75,246,65,0,0,250,65,0,128,187,194,209,34,234,65,0,0,250,65,7,176,179,194,104,17,218,65,0,0,
+250,65,0,224,171,194,136,99,203,65,0,0,250,65,7,16,164,194,140,57,184,65,0,0,250,65,0,64,156,194,165,172,171,65,0,0,250,65,7,112,148,194,18,165,155,65,0,0,250,65,0,160,140,194,29,201,144,65,0,0,250,65,7,208,132,194,161,248,136,65,0,0,250,65,0,0,122,194,155,102,137,65,0,0,250,65,13,96,106,194,169,36,137,65,0,0,250,65,0,192,90,194,21,140,147,65,0,0,250,65,13,32,75,194,160,137,159,65,0,0,250,65,0,128,59,194,255,178,169,65,0,0,250,65,13,224,43,194,79,175,169,65,0,0,250,65,0,64,28,194,169,19,177,65,0,
+0,250,65,13,160,12,194,50,119,186,65,0,0,250,65,0,0,250,193,156,162,197,65,0,0,250,65,26,192,218,193,129,38,210,65,0,0,250,65,0,128,187,193,185,141,220,65,0,0,250,65,26,64,156,193,122,71,243,65,0,0,250,65,0,0,122,193,99,46,4,66,0,0,250,65,52,128,59,193,91,241,11,66,0,0,250,65,0,0,250,192,114,74,20,66,0,0,250,65,0,0,122,192,58,227,28,66,0,0,250,65,0,0,0,0,148,118,33,66,0,0,250,65,0,0,122,64,157,192,37,66,0,0,250,65,0,0,122,195,170,96,244,62,26,192,218,65,16,24,118,195,186,192,33,63,26,192,218,65,33,
+48,114,195,105,116,155,63,26,192,218,65,240,71,110,195,233,125,195,63,26,192,218,65,0,96,106,195,62,208,46,64,26,192,218,65,16,120,102,195,10,215,105,64,26,192,218,65,33,144,98,195,4,28,161,64,26,192,218,65,240,167,94,195,42,169,200,64,26,192,218,65,0,192,90,195,126,58,242,64,26,192,218,65,16,216,86,195,238,49,26,65,26,192,218,65,33,240,82,195,105,111,54,65,26,192,218,65,240,7,79,195,4,86,75,65,26,192,218,65,0,32,75,195,194,23,102,65,26,192,218,65,16,56,71,195,246,151,126,65,26,192,218,65,33,80,67,
+195,147,41,143,65,26,192,218,65,240,103,63,195,202,195,166,65,26,192,218,65,0,128,59,195,252,41,182,65,26,192,218,65,16,152,55,195,156,162,196,65,230,191,218,65,33,176,51,195,164,112,216,65,26,192,218,65,240,199,47,195,161,214,234,65,230,191,218,65,0,224,43,195,144,160,243,65,26,192,218,65,16,248,39,195,20,191,1,66,230,191,218,65,33,16,36,195,159,252,9,66,26,192,218,65,240,39,32,195,121,216,11,66,230,191,218,65,0,64,28,195,18,195,11,66,26,192,218,65,16,88,24,195,178,221,14,66,230,191,218,65,33,112,
+20,195,161,39,20,66,26,192,218,65,240,135,16,195,164,95,24,66,230,191,218,65,0,160,12,195,126,140,21,66,26,192,218,65,16,184,8,195,2,188,17,66,230,191,218,65,33,208,4,195,96,37,20,66,26,192,218,65,240,231,0,195,82,9,21,66,230,191,218,65,0,0,250,194,104,51,18,66,26,192,218,65,33,48,242,194,244,236,13,66,230,191,218,65,66,96,234,194,138,78,13,66,26,192,218,65,223,143,226,194,184,128,9,66,230,191,218,65,0,192,218,194,100,251,8,66,26,192,218,65,33,240,210,194,139,189,6,66,230,191,218,65,66,32,203,194,
+42,105,1,66,26,192,218,65,7,80,195,194,84,227,240,65,230,191,218,65,0,128,187,194,250,237,227,65,26,192,218,65,7,176,179,194,131,81,216,65,230,191,218,65,0,224,171,194,91,194,199,65,26,192,218,65,7,16,164,194,45,195,183,65,230,191,218,65,0,64,156,194,105,0,174,65,26,192,218,65,7,112,148,194,97,212,150,65,26,192,218,65,0,160,140,194,229,225,145,65,26,192,218,65,7,208,132,194,102,247,146,65,26,192,218,65,0,0,122,194,241,99,149,65,26,192,218,65,13,96,106,194,124,114,148,65,26,192,218,65,0,192,90,194,
+75,72,153,65,26,192,218,65,13,32,75,194,224,173,166,65,26,192,218,65,0,128,59,194,164,223,172,65,26,192,218,65,13,224,43,194,31,116,175,65,230,191,218,65,0,64,28,194,136,99,184,65,26,192,218,65,13,160,12,194,164,240,198,65,230,191,218,65,0,0,250,193,89,134,205,65,26,192,218,65,26,192,218,193,137,193,223,65,230,191,218,65,0,128,187,193,231,123,242,65,26,192,218,65,26,64,156,193,116,245,7,66,230,191,218,65,0,0,122,193,146,203,14,66,26,192,218,65,52,128,59,193,105,175,23,66,230,191,218,65,0,0,250,192,
+193,138,32,66,26,192,218,65,0,0,122,192,192,108,38,66,230,191,218,65,0,0,0,0,141,23,41,66,26,192,218,65,0,0,122,64,0,239,42,66,230,191,218,65,0,0,122,195,97,107,54,62,0,128,187,65,16,24,118,195,195,42,138,63,0,128,187,65,33,48,114,195,90,42,195,63,0,128,187,65,240,71,110,195,139,137,37,64,0,128,187,65,0,96,106,195,187,237,96,64,0,128,187,65,16,120,102,195,153,100,135,64,0,128,187,65,33,144,98,195,13,195,185,64,0,128,187,65,240,167,94,195,247,88,232,64,0,128,187,65,0,192,90,195,213,161,13,65,0,128,
+187,65,16,216,86,195,71,114,46,65,0,128,187,65,33,240,82,195,186,107,75,65,0,128,187,65,240,7,79,195,100,204,110,65,0,128,187,65,0,32,75,195,220,104,122,65,0,128,187,65,16,56,71,195,100,59,132,65,0,128,187,65,33,80,67,195,94,58,137,65,0,128,187,65,240,103,63,195,111,129,164,65,0,128,187,65,0,128,59,195,165,206,184,65,0,128,187,65,16,152,55,195,134,73,198,65,0,128,187,65,33,176,51,195,115,232,214,65,0,128,187,65,240,199,47,195,18,148,228,65,0,128,187,65,0,224,43,195,155,85,242,65,0,128,187,65,16,248,
+39,195,113,27,3,66,0,128,187,65,33,16,36,195,199,122,10,66,0,128,187,65,240,39,32,195,196,194,14,66,0,128,187,65,0,64,28,195,102,119,20,66,0,128,187,65,16,88,24,195,143,83,20,66,0,128,187,65,33,112,20,195,125,255,23,66,0,128,187,65,240,135,16,195,125,191,26,66,0,128,187,65,0,160,12,195,84,180,23,66,0,128,187,65,16,184,8,195,139,253,18,66,0,128,187,65,33,208,4,195,80,188,20,66,0,128,187,65,240,231,0,195,9,121,19,66,0,128,187,65,0,0,250,194,162,5,17,66,0,128,187,65,33,48,242,194,104,98,11,66,0,128,
+187,65,66,96,234,194,132,77,10,66,0,128,187,65,223,143,226,194,4,150,7,66,0,128,187,65,0,192,218,194,171,254,5,66,0,128,187,65,33,240,210,194,123,20,4,66,0,128,187,65,66,32,203,194,104,162,251,65,0,128,187,65,7,80,195,194,29,184,236,65,0,128,187,65,0,128,187,194,225,11,223,65,0,128,187,65,7,176,179,194,167,232,211,65,0,128,187,65,0,224,171,194,149,84,196,65,0,128,187,65,7,16,164,194,170,224,180,65,0,128,187,65,0,64,156,194,61,10,171,65,0,128,187,65,7,112,148,194,40,15,154,65,0,128,187,65,0,160,140,
+194,86,125,157,65,0,128,187,65,7,208,132,194,92,160,154,65,0,128,187,65,0,0,122,194,235,226,162,65,0,128,187,65,13,96,106,194,167,249,167,65,0,128,187,65,0,192,90,194,25,132,164,65,0,128,187,65,13,32,75,194,6,18,173,65,0,128,187,65,0,128,59,194,98,144,176,65,0,128,187,65,13,224,43,194,214,86,186,65,0,128,187,65,0,64,28,194,207,230,198,65,0,128,187,65,13,160,12,194,0,111,207,65,0,128,187,65,0,0,250,193,215,180,217,65,0,128,187,65,26,192,218,193,57,214,237,65,0,128,187,65,0,128,187,193,117,66,3,66,
+0,128,187,65,26,64,156,193,223,32,14,66,0,128,187,65,0,0,122,193,140,219,24,66,0,128,187,65,52,128,59,193,233,247,32,66,0,128,187,65,0,0,250,192,217,253,38,66,0,128,187,65,0,0,122,192,238,124,45,66,0,128,187,65,0,0,0,0,170,2,47,66,0,128,187,65,0,0,122,64,148,182,50,66,0,128,187,65,0,0,122,195,206,137,13,62,26,64,156,65,16,24,118,195,79,64,179,63,26,64,156,65,33,48,114,195,56,248,80,64,26,64,156,65,240,71,110,195,210,198,105,64,26,64,156,65,0,96,106,195,30,254,156,64,26,64,156,65,16,120,102,195,90,
+18,193,64,26,64,156,65,33,144,98,195,103,237,255,64,26,64,156,65,240,167,94,195,46,173,22,65,26,64,156,65,0,192,90,195,45,178,32,65,26,64,156,65,16,216,86,195,175,148,66,65,26,64,156,65,33,240,82,195,202,50,91,65,26,64,156,65,240,7,79,195,48,42,124,65,26,64,156,65,0,32,75,195,60,61,129,65,26,64,156,65,16,56,71,195,26,209,136,65,26,64,156,65,33,80,67,195,93,126,145,65,26,64,156,65,240,103,63,195,3,120,165,65,26,64,156,65,0,128,59,195,39,177,184,65,230,63,156,65,16,152,55,195,121,105,194,65,26,64,156,
+65,33,176,51,195,100,76,213,65,230,63,156,65,240,199,47,195,35,219,225,65,26,64,156,65,0,224,43,195,199,41,245,65,230,63,156,65,16,248,39,195,56,120,3,66,26,64,156,65,33,16,36,195,55,90,12,66,230,63,156,65,240,39,32,195,4,22,21,66,26,64,156,65,0,64,28,195,246,104,26,66,230,63,156,65,16,88,24,195,198,28,25,66,26,64,156,65,33,112,20,195,218,236,25,66,230,63,156,65,240,135,16,195,249,79,25,66,26,64,156,65,0,160,12,195,143,147,24,66,230,63,156,65,16,184,8,195,41,109,22,66,230,63,156,65,33,208,4,195,188,
+214,20,66,230,63,156,65,240,231,0,195,17,71,18,66,230,63,156,65,0,0,250,194,102,247,16,66,230,63,156,65,33,48,242,194,59,31,10,66,230,63,156,65,66,96,234,194,62,121,5,66,230,63,156,65,223,143,226,194,59,31,3,66,230,63,156,65,0,192,218,194,180,217,254,65,230,63,156,65,33,240,210,194,233,183,250,65,230,63,156,65,66,32,203,194,220,232,237,65,230,63,156,65,7,80,195,194,97,178,229,65,230,63,156,65,0,128,187,194,138,31,223,65,230,63,156,65,7,176,179,194,110,52,208,65,230,63,156,65,0,224,171,194,13,96,196,
+65,230,63,156,65,7,16,164,194,38,211,186,65,230,63,156,65,0,64,156,194,97,178,171,65,26,64,156,65,7,112,148,194,60,206,162,65,26,64,156,65,0,160,140,194,210,128,161,65,26,64,156,65,7,208,132,194,211,222,167,65,26,64,156,65,0,0,122,194,254,212,177,65,230,63,156,65,13,96,106,194,10,215,178,65,230,63,156,65,0,192,90,194,144,32,182,65,230,63,156,65,13,32,75,194,10,104,183,65,230,63,156,65,0,128,59,194,152,110,188,65,230,63,156,65,13,224,43,194,188,22,195,65,230,63,156,65,0,64,28,194,240,22,204,65,230,
+63,156,65,13,160,12,194,235,243,214,65,230,63,156,65,0,0,250,193,119,190,231,65],"i8",I,v.k+10240);
+K([230,63,156,65,26,192,218,193,101,25,248,65,230,63,156,65,0,128,187,193,194,87,11,66,230,63,156,65,26,64,156,193,222,241,20,66,230,63,156,65,0,0,122,193,158,94,30,66,230,63,156,65,52,128,59,193,194,70,38,66,230,63,156,65,0,0,250,192,245,249,44,66,230,63,156,65,0,0,122,192,154,119,52,66,230,63,156,65,0,0,0,0,162,5,55,66,230,63,156,65,0,0,122,64,59,159,59,66,230,63,156,65,0,0,122,195,243,5,237,62,0,0,122,65,16,24,118,195,184,233,9,64,0,0,122,65,33,48,114,195,249,78,108,64,0,0,122,65,240,71,110,195,
+116,152,156,64,0,0,122,65,0,96,106,195,60,160,222,64,0,0,122,65,16,120,102,195,10,17,6,65,0,0,122,65,33,144,98,195,65,113,19,65,0,0,122,65,240,167,94,195,151,255,32,65,0,0,122,65,0,192,90,195,251,92,58,65,0,0,122,65,16,216,86,195,172,28,84,65,0,0,122,65,33,240,82,195,28,235,109,65,0,0,122,65,240,7,79,195,97,195,127,65,0,0,122,65,0,32,75,195,51,51,136,65,0,0,122,65,16,56,71,195,14,207,142,65,0,0,122,65,33,80,67,195,100,221,162,65,0,0,122,65,240,103,63,195,199,169,176,65,0,0,122,65,0,128,59,195,112,
+95,195,65,0,0,122,65,16,152,55,195,0,128,204,65,0,0,122,65,33,176,51,195,208,196,216,65,0,0,122,65,240,199,47,195,51,196,240,65,0,0,122,65,0,224,43,195,177,97,254,65,0,0,122,65,16,248,39,195,52,209,10,66,0,0,122,65,33,16,36,195,121,169,20,66,0,0,122,65,240,39,32,195,173,186,22,66,0,0,122,65,0,64,28,195,74,123,22,66,0,0,122,65,16,88,24,195,253,54,23,66,0,0,122,65,33,112,20,195,8,108,23,66,0,0,122,65,240,135,16,195,238,218,23,66,0,0,122,65,0,160,12,195,172,237,21,66,0,0,122,65,16,184,8,195,175,20,20,
+66,0,0,122,65,33,208,4,195,115,215,17,66,0,0,122,65,240,231,0,195,72,161,16,66,0,0,122,65,0,0,250,194,236,175,13,66,0,0,122,65,33,48,242,194,175,20,6,66,0,0,122,65,66,96,234,194,201,118,0,66,0,0,122,65,223,143,226,194,74,123,247,65,0,0,122,65,0,192,218,194,58,163,238,65,0,0,122,65,33,240,210,194,26,81,239,65,0,0,122,65,66,32,203,194,199,203,229,65,0,0,122,65,7,80,195,194,150,195,221,65,0,0,122,65,0,128,187,194,164,95,219,65,0,0,122,65,7,176,179,194,121,216,206,65,0,0,122,65,0,224,171,194,185,124,
+192,65,0,0,122,65,7,16,164,194,146,75,182,65,0,0,122,65,0,64,156,194,59,240,163,65,0,0,122,65,7,112,148,194,31,5,168,65,0,0,122,65,0,160,140,194,84,99,170,65,0,0,122,65,7,208,132,194,215,146,180,65,0,0,122,65,0,0,122,194,136,116,184,65,0,0,122,65,13,96,106,194,202,178,185,65,0,0,122,65,0,192,90,194,34,125,193,65,0,0,122,65,13,32,75,194,52,128,196,65,0,0,122,65,0,128,59,194,216,1,201,65,0,0,122,65,13,224,43,194,250,254,207,65,0,0,122,65,0,64,28,194,19,242,214,65,0,0,122,65,13,160,12,194,217,223,222,
+65,0,0,122,65,0,0,250,193,163,35,239,65,0,0,122,65,26,192,218,193,191,142,3,66,0,0,122,65,0,128,187,193,16,41,17,66,0,0,122,65,26,64,156,193,113,253,24,66,0,0,122,65,0,0,122,193,59,95,34,66,0,0,122,65,52,128,59,193,111,48,41,66,0,0,122,65,0,0,250,192,189,82,53,66,0,0,122,65,0,0,122,192,72,97,61,66,0,0,122,65,0,0,0,0,87,236,67,66,0,0,122,65,0,0,122,64,2,235,68,66,0,0,122,65,0,0,122,195,144,78,149,63,52,128,59,65,16,24,118,195,100,146,63,64,52,128,59,65,33,48,114,195,244,26,140,64,52,128,59,65,240,
+71,110,195,230,232,166,64,52,128,59,65,0,96,106,195,235,255,218,64,52,128,59,65,16,120,102,195,223,137,5,65,52,128,59,65,33,144,98,195,136,133,20,65,52,128,59,65,240,167,94,195,169,106,30,65,52,128,59,65,0,192,90,195,211,188,46,65,204,127,59,65,16,216,86,195,117,2,91,65,204,127,59,65,33,240,82,195,90,100,124,65,204,127,59,65,240,7,79,195,41,220,129,65,204,127,59,65,0,32,75,195,31,5,138,65,204,127,59,65,16,56,71,195,235,226,152,65,204,127,59,65,33,80,67,195,94,203,171,65,204,127,59,65,240,103,63,195,
+2,43,192,65,204,127,59,65,0,128,59,195,216,240,206,65,204,127,59,65,16,152,55,195,2,43,216,65,204,127,59,65,33,176,51,195,49,8,226,65,204,127,59,65,240,199,47,195,44,212,252,65,204,127,59,65,0,224,43,195,25,132,2,66,204,127,59,65,16,248,39,195,118,207,11,66,204,127,59,65,33,16,36,195,94,75,19,66,204,127,59,65,240,39,32,195,166,155,20,66,204,127,59,65,0,64,28,195,226,169,22,66,204,127,59,65,16,88,24,195,11,164,21,66,204,127,59,65,33,112,20,195,137,82,20,66,204,127,59,65,240,135,16,195,5,133,22,66,
+204,127,59,65,0,160,12,195,88,232,18,66,204,127,59,65,16,184,8,195,184,239,17,66,204,127,59,65,33,208,4,195,214,5,13,66,204,127,59,65,240,231,0,195,143,211,10,66,204,127,59,65,0,0,250,194,249,96,8,66,204,127,59,65,33,48,242,194,236,239,2,66,204,127,59,65,66,96,234,194,231,123,252,65,204,127,59,65,223,143,226,194,93,254,245,65,204,127,59,65,0,192,218,194,82,73,241,65,204,127,59,65,33,240,210,194,177,80,239,65,204,127,59,65,66,32,203,194,244,108,228,65,204,127,59,65,7,80,195,194,11,164,209,65,204,127,
+59,65,0,128,187,194,121,88,208,65,204,127,59,65,7,176,179,194,253,118,201,65,204,127,59,65,0,224,171,194,23,89,190,65,204,127,59,65,7,16,164,194,197,143,181,65,204,127,59,65,0,64,156,194,127,217,175,65,204,127,59,65,7,112,148,194,8,189,178,65,204,127,59,65,0,160,140,194,154,247,179,65,204,127,59,65,7,208,132,194,231,140,183,65,204,127,59,65,0,0,122,194,214,69,189,65,204,127,59,65,13,96,106,194,165,78,193,65,204,127,59,65,0,192,90,194,89,6,199,65,204,127,59,65,13,32,75,194,220,198,202,65,204,127,59,
+65,0,128,59,194,70,20,206,65,204,127,59,65,13,224,43,194,72,225,212,65,204,127,59,65,0,64,28,194,194,6,220,65,204,127,59,65,13,160,12,194,104,51,234,65,204,127,59,65,0,0,250,193,78,81,255,65,204,127,59,65,26,192,218,193,29,201,8,66,204,127,59,65,0,128,187,193,246,23,19,66,204,127,59,65,26,64,156,193,245,249,28,66,204,127,59,65,0,0,122,193,191,78,37,66,204,127,59,65,52,128,59,193,163,18,49,66,204,127,59,65,0,0,250,192,179,251,60,66,204,127,59,65,0,0,122,192,45,225,68,66,204,127,59,65,0,0,0,0,182,4,
+73,66,204,127,59,65,0,0,122,64,66,126,76,66,204,127,59,65,0,0,122,195,21,116,195,63,0,0,250,64,16,24,118,195,172,57,62,64,0,0,250,64,33,48,114,195,242,123,113,64,0,0,250,64,240,71,110,195,77,243,153,64,0,0,250,64,0,96,106,195,0,58,190,64,0,0,250,64,16,120,102,195,60,131,238,64,0,0,250,64,33,144,98,195,40,126,15,65,0,0,250,64,240,167,94,195,198,249,21,65,0,0,250,64,0,192,90,195,218,27,38,65,0,0,250,64,16,216,86,195,222,2,81,65,0,0,250,64,33,240,82,195,109,86,121,65,0,0,250,64,240,7,79,195,193,57,137,
+65,0,0,250,64,0,32,75,195,182,115,154,65,0,0,250,64,16,56,71,195,207,247,173,65,0,0,250,64,33,80,67,195,83,5,184,65,0,0,250,64,240,103,63,195,52,128,201,65,0,0,250,64,0,128,59,195,198,237,219,65,0,0,250,64,16,152,55,195,63,53,229,65,0,0,250,64,33,176,51,195,125,191,231,65,0,0,250,64,240,199,47,195,31,5,249,65,0,0,250,64,0,224,43,195,248,211,1,66,0,0,250,64,16,248,39,195,2,188,9,66,0,0,250,64,33,16,36,195,76,166,15,66,0,0,250,64,240,39,32,195,253,7,18,66,0,0,250,64,0,64,28,195,230,255,19,66,0,0,250,
+64,16,88,24,195,138,206,19,66,0,0,250,64,33,112,20,195,156,226,23,66,0,0,250,64,240,135,16,195,76,183,23,66,0,0,250,64,0,160,12,195,52,34,22,66,0,0,250,64,16,184,8,195,132,30,17,66,0,0,250,64,33,208,4,195,248,194,12,66,0,0,250,64,240,231,0,195,65,241,6,66,0,0,250,64,0,0,250,194,32,99,8,66,0,0,250,64,33,48,242,194,208,85,6,66,0,0,250,64,66,96,234,194,151,191,3,66,0,0,250,64,223,143,226,194,38,36,0,66,0,0,250,64,0,192,218,194,202,178,251,65,0,0,250,64,33,240,210,194,175,37,244,65,0,0,250,64,66,32,203,
+194,179,234,229,65,0,0,250,64,7,80,195,194,8,44,218,65,0,0,250,64,0,128,187,194,93,254,208,65,0,0,250,64,7,176,179,194,132,141,196,65,0,0,250,64,0,224,171,194,176,114,191,65,0,0,250,64,7,16,164,194,73,29,190,65,0,0,250,64,0,64,156,194,159,171,179,65,0,0,250,64,7,112,148,194,229,80,180,65,0,0,250,64,0,160,140,194,37,117,183,65,0,0,250,64,7,208,132,194,34,125,187,65,0,0,250,64,0,0,122,194,184,47,194,65,0,0,250,64,13,96,106,194,151,127,193,65,0,0,250,64,0,192,90,194,255,33,194,65,0,0,250,64,13,32,75,
+194,129,4,202,65,0,0,250,64,0,128,59,194,146,203,210,65,0,0,250,64,13,224,43,194,39,177,214,65,0,0,250,64,0,64,28,194,121,105,220,65,0,0,250,64,13,160,12,194,132,141,243,65,0,0,250,64,0,0,250,193,3,56,6,66,0,0,250,64,26,192,218,193,72,144,16,66,0,0,250,64,0,128,187,193,242,112,24,66,0,0,250,64,26,64,156,193,182,68,31,66,0,0,250,64,0,0,122,193,90,117,40,66,0,0,250,64,52,128,59,193,242,112,53,66,0,0,250,64,0,0,250,192,11,164,62,66,0,0,250,64,0,0,122,192,29,218,71,66,0,0,250,64,0,0,0,0,99,63,79,66,0,
+0,250,64,0,0,122,64,196,2,81,66,0,0,250,64,0,0,122,195,100,59,15,62,0,0,122,64,16,24,118,195,0,111,221,63,0,0,122,64,33,48,114,195,99,122,38,64,0,0,122,64,240,71,110,195,68,110,128,64,0,0,122,64,0,96,106,195,137,94,164,64,0,0,122,64,16,120,102,195,245,74,214,64,0,0,122,64,33,144,98,195,152,233,6,65,0,0,122,64,240,167,94,195,201,89,29,65,0,0,122,64,0,192,90,195,254,212,53,65,0,0,122,64,16,216,86,195,80,141,99,65,0,0,122,64,33,240,82,195,10,104,129,65,0,0,122,64,240,7,79,195,54,77,151,65,0,0,122,64,
+0,32,75,195,127,251,169,65,0,0,122,64,16,56,71,195,161,120,184,65,0,0,122,64,33,80,67,195,236,209,196,65,0,0,122,64,240,103,63,195,176,131,206,65,0,0,122,64,0,128,59,195,138,142,220,65,0,0,122,64,16,152,55,195,165,189,233,65,0,0,122,64,33,176,51,195,207,119,237,65,0,0,122,64,240,199,47,195,204,238,245,65,0,0,122,64,0,224,43,195,37,134,251,65,0,0,122,64,16,248,39,195,24,85,4,66,0,0,122,64,33,16,36,195,113,125,10,66,0,0,122,64,240,39,32,195,46,255,13,66,0,0,122,64,0,64,28,195,129,166,21,66,0,0,122,
+64,16,88,24,195,223,207,25,66,0,0,122,64,33,112,20,195,86,253,27,66,0,0,122,64,240,135,16,195,254,37,27,66,0,0,122,64,0,160,12,195,141,104,22,66,0,0,122,64,16,184,8,195,3,184,16,66,0,0,122,64,33,208,4,195,96,246,11,66,0,0,122,64,240,231,0,195,136,133,8,66,0,0,122,64,0,0,250,194,36,104,9,66,0,0,122,64,33,48,242,194,18,165,6,66,0,0,122,64,66,96,234,194,157,209,2,66,0,0,122,64,223,143,226,194,77,149,1,66,0,0,122,64,0,192,218,194,135,167,248,65,0,0,122,64,33,240,210,194,249,160,247,65,0,0,122,64,66,32,
+203,194,98,144,238,65,0,0,122,64,7,80,195,194,57,214,227,65,0,0,122,64,0,128,187,194,249,49,221,65,0,0,122,64,7,176,179,194,169,147,204,65,0,0,122,64,0,224,171,194,229,208,193,65,0,0,122,64,7,16,164,194,188,22,186,65,0,0,122,64,0,64,156,194,212,171,179,65,0,0,122,64,7,112,148,194,14,207,185,65,0,0,122,64,0,160,140,194,31,5,188,65,0,0,122,64,7,208,132,194,200,135,189,65,0,0,122,64,0,0,122,194,145,109,197,65,0,0,122,64,13,96,106,194,241,244,203,65,0,0,122,64,0,192,90,194,17,199,207,65,0,0,122,64,13,
+32,75,194,228,148,209,65,0,0,122,64,0,128,59,194,202,212,214,65,0,0,122,64,13,224,43,194,125,208,221,65,0,0,122,64,0,64,28,194,5,163,233,65,0,0,122,64,13,160,12,194,236,81,254,65,0,0,122,64,0,0,250,193,46,16,9,66,0,0,122,64,26,192,218,193,50,247,15,66,0,0,122,64,0,128,187,193,170,130,25,66,0,0,122,64,26,64,156,193,114,138,31,66,0,0,122,64,0,0,122,193,254,148,44,66,0,0,122,64,52,128,59,193,11,6,54,66,0,0,122,64,0,0,250,192,235,179,61,66,0,0,122,64,0,0,122,192,224,156,71,66,0,0,122,64,0,0,0,0,249,32,
+80,66,0,0,122,64,0,0,122,64,114,121,82,66,0,0,122,64,0,0,1,0,2,0,3,0,2,0,1,0,2,0,3,0,4,0,5,0,4,0,3,0,4,0,5,0,6,0,7,0,6,0,5,0,6,0,7,0,8,0,9,0,8,0,7,0,8,0,9,0,10,0,11,0,10,0,9,0,10,0,11,0,12,0,13,0,12,0,11,0,12,0,13,0,14,0,15,0,14,0,13,0,14,0,15,0,16,0,17,0,16,0,15,0,16,0,17,0,18,0,19,0,18,0,17,0,18,0,19,0,20,0,21,0,20,0,19,0,20,0,21,0,22,0,23,0,22,0,21,0,22,0,23,0,24,0,25,0,24,0,23,0,24,0,25,0,26,0,27,0,26,0,25,0,26,0,27,0,28,0,29,0,28,0,27,0,28,0,29,0,30,0,31,0,30,0,29,0,30,0,31,0,32,0,33,0,32,0,
+31,0,32,0,33,0,34,0,35,0,34,0,33,0,34,0,35,0,36,0,37,0,36,0,35,0,36,0,37,0,38,0,39,0,38,0,37,0,38,0,39,0,40,0,41,0,40,0,39,0,40,0,41,0,42,0,43,0,42,0,41,0,42,0,43,0,44,0,45,0,44,0,43,0,44,0,45,0,46,0,47,0,46,0,45,0,46,0,47,0,48,0,49,0,48,0,47,0,48,0,49,0,50,0,51,0,50,0,49,0,50,0,51,0,52,0,53,0,52,0,51,0,52,0,53,0,54,0,55,0,54,0,53,0,54,0,55,0,56,0,57,0,56,0,55,0,56,0,57,0,58,0,59,0,58,0,57,0,58,0,59,0,60,0,61,0,60,0,59,0,60,0,61,0,62,0,63,0,62,0,61,0,62,0,63,0,64,0,65,0,64,0,63,0,64,0,65,0,66,0,67,
+0,66,0,65,0,66,0,67,0,68,0,69,0,68,0,67,0,68,0,69,0,70,0,71,0,70,0,69,0,70,0,71,0,72,0,73,0,72,0,71,0,72,0,73,0,74,0,75,0,74,0,73,0,74,0,75,0,76,0,77,0,76,0,75,0,76,0,77,0,78,0,79,0,78,0,77,0,78,0,79,0,80,0,81,0,80,0,79,0,80,0,81,0,82,0,83,0,82,0,81,0,82,0,83,0,84,0,85,0,84,0,83,0,84,0,85,0,86,0,87,0,86,0,85,0,86,0,87,0,88,0,89,0,88,0,87,0,88,0,89,0,90,0,91,0,90,0,89,0,90,0,91,0,92,0,93,0,92,0,91,0,92,0,93,0,94,0,95,0,94,0,93,0,94,0,95,0,96,0,97,0,96,0,95,0,96,0,97,0,98,0,99,0,98,0,97,0,98,0,99,0,
+100,0,101,0,100,0,99,0,100,0,101,0,102,0,103,0,102,0,101,0,102,0,103,0,104,0,105,0,104,0,103,0,104,0,105,0,106,0,107,0,106,0,105,0,106,0,107,0,108,0,109,0,108,0,107,0,108,0,109,0,110,0,111,0,110,0,109,0,110,0,111,0,112,0,113,0,112,0,111,0,112,0,113,0,114,0,115,0,114,0,113,0,114,0,115,0,116,0,117,0,116,0,115,0,116,0,117,0,118,0,119,0,118,0,117,0,118,0,119,0,120,0,121,0,120,0,119,0,120,0,121,0,122,0,123,0,122,0,121,0,122,0,123,0,124,0,125,0,124,0,123,0,124,0,125,0,126,0,127,0,126,0,125,0,126,0,127,
+0,128,0,129,0,128,0,127,0,128,0,129,0,130,0,131,0,130,0,129,0,132,0,0,0,133,0,2,0,133,0,0,0,133,0,2,0,134,0,4,0,134,0,2,0,134,0,4,0,135,0,6,0,135,0,4,0,135,0,6,0,136,0,8,0,136,0,6,0,136,0,8,0,137,0,10,0,137,0,8,0,137,0,10,0,138,0,12,0,138,0,10,0,138,0,12,0,139,0,14,0,139,0,12,0,139,0,14,0,140,0,16,0,140,0,14,0,140,0,16,0,141,0,18,0,141,0,16,0,141,0,18,0,142,0,20,0,142,0,18,0,142,0,20,0,143,0,22,0,143,0,20,0,143,0,22,0,144,0,24,0,144,0,22,0,144,0,24,0,145,0,26,0,145,0,24,0,145,0,26,0,146,0,28,0,146,
+0,26,0,146,0,28,0,147,0,30,0,147,0,28,0,147,0,30,0,148,0,32,0,148,0,30,0,148,0,32,0,149,0,34,0,149,0,32,0,149,0,34,0,150,0,36,0,150,0,34,0,150,0,36,0,151,0,38,0,151,0,36,0,151,0,38,0,152,0,40,0,152,0,38,0,152,0,40,0,153,0,42,0,153,0,40,0,153,0,42,0,154,0,44,0,154,0,42,0,154,0,44,0,155,0,46,0,155,0,44,0,155,0,46,0,156,0,48,0,156,0,46,0,156,0,48,0,157,0,50,0,157,0,48,0,157,0,50,0,158,0,52,0,158,0,50,0,158,0,52,0,159,0,54,0,159,0,52,0,159,0,54,0,160,0,56,0,160,0,54,0,160,0,56,0,161,0,58,0,161,0,56,0,
+161,0,58,0,162,0,60,0,162,0,58,0,162,0,60,0,163,0,62,0,163,0,60,0,163,0,62,0,164,0,64,0,164,0,62,0,164,0,64,0,165,0,66,0,165,0,64,0,165,0,66,0,166,0,68,0,166,0,66,0,166,0,68,0,167,0,70,0,167,0,68,0,167,0,70,0,168,0,72,0,168,0,70,0,168,0,72,0,169,0,74,0,169,0,72,0,169,0,74,0,170,0,76,0,170,0,74,0,170,0,76,0,171,0,78,0,171,0,76,0,171,0,78,0,172,0,80,0,172,0,78,0,172,0,80,0,173,0,82,0,173,0,80,0,173,0,82,0,174,0,84,0,174,0,82,0,174,0,84,0,175,0,86,0,175,0,84,0,175,0,86,0,176,0,88,0,176,0,86,0,176,0,
+88,0,177,0,90,0,177,0,88,0,177,0,90,0,178,0,92,0,178,0,90,0,178,0,92,0,179,0,94,0,179,0,92,0,179,0,94,0,180,0,96,0,180,0,94,0,180,0,96,0,181,0,98,0,181,0,96,0,181,0,98,0,182,0,100,0,182,0,98,0,182,0,100,0,183,0,102,0,183,0,100,0,183,0,102,0,184,0,104,0,184,0,102,0,184,0,104,0,185,0,106,0,185,0,104,0,185,0,106,0,186,0,108,0,186,0,106,0,186,0,108,0,187,0,110,0,187,0,108,0,187,0,110,0,188,0,112,0,188,0,110,0,188,0,112,0,189,0,114,0,189,0,112,0,189,0,114,0,190,0,116,0,190,0,114,0,190,0,116,0,191,0,118,
+0,191,0,116,0,191,0,118,0,192,0,120,0,192,0,118,0,192,0,120,0,193,0,122,0,193,0,120,0,193,0,122,0,194,0,124,0,194,0,122,0,194,0,124,0,195,0,126,0,195,0,124,0,195,0,126,0,196,0,128,0,196,0,126,0,196,0,128,0,197,0,130,0,197,0,128,0,198,0,132,0,199,0,133,0,199,0,132,0,199,0,133,0,200,0,134,0,200,0,133,0,200,0,134,0,201,0,135,0,201,0,134,0,201,0,135,0,202,0,136,0,202,0,135,0,202,0,136,0,203,0,137,0,203,0,136,0,203,0,137,0,204,0,138,0,204,0,137,0,204,0,138,0,205,0,139,0,205,0,138,0,205,0,139,0,206,0,140,
+0,206,0,139,0,206,0,140,0,207,0,141,0,207,0,140,0,207,0,141,0,208,0,142,0,208,0,141,0,208,0,142,0,209,0,143,0,209,0,142,0,209,0,143,0,210,0,144,0,210,0,143,0,210,0,144,0,211,0,145,0,211,0,144,0,211,0,145,0,212,0,146,0,212,0,145,0,212,0,146,0,213,0,147,0,213,0,146,0,213,0,147,0,214,0,148,0,214,0,147,0,214,0,148,0,215,0,149,0,215,0,148,0,215,0,149,0,216,0,150,0,216,0,149,0,216,0,150,0,217,0,151,0,217,0,150,0,217,0,151,0,218,0,152,0,218,0,151,0,218,0,152,0,219,0,153,0,219,0,152,0,219,0,153,0,220,0,154,
+0,220,0,153,0,220,0,154,0,221,0,155,0,221,0,154,0,221,0,155,0,222,0,156,0,222,0,155,0,222,0,156,0,223,0,157,0,223,0,156,0,223,0,157,0,224,0,158,0,224,0,157,0,224,0,158,0,225,0,159,0,225,0,158,0,225,0,159,0,226,0,160,0,226,0,159,0,226,0,160,0,227,0,161,0,227,0,160,0,227,0,161,0,228,0,162,0,228,0,161,0,228,0,162,0,229,0,163,0,229,0,162,0,229,0,163,0,230,0,164,0,230,0,163,0,230,0,164,0,231,0,165,0,231,0,164,0,231,0,165,0,232,0,166,0,232,0,165,0,232,0,166,0,233,0,167,0,233,0,166,0,233,0,167,0,234,0,168,
+0,234,0,167,0,234,0,168,0,235,0,169,0,235,0,168,0,235,0,169,0,236,0,170,0,236,0,169,0,236,0,170,0,237,0,171,0,237,0,170,0,237,0,171,0,238,0,172,0,238,0,171,0,238,0,172,0,239,0,173,0,239,0,172,0,239,0,173,0,240,0,174,0,240,0,173,0,240,0,174,0,241,0,175,0,241,0,174,0,241,0,175,0,242,0,176,0,242,0,175,0,242,0,176,0,243,0,177,0,243,0,176,0,243,0,177,0,244,0,178,0,244,0,177,0,244,0,178,0,245,0,179,0,245,0,178,0,245,0,179,0,246,0,180,0,246,0,179,0,246,0,180,0,247,0,181,0,247,0,180,0,247,0,181,0,248,0,182,
+0,248,0,181,0,248,0,182,0,249,0,183,0,249,0,182,0,249,0,183,0,250,0,184,0,250,0,183,0,250,0,184,0,251,0,185,0,251,0,184,0,251,0,185,0,252,0,186,0,252,0,185,0,252,0,186,0,253,0,187,0,253,0,186,0,253,0,187,0,254,0,188,0,254,0,187,0,254,0,188,0,255,0,189,0,255,0,188,0,255,0,189,0,0,1,190,0,0,1,189,0,0,1,190,0,1,1,191,0,1,1,190,0,1,1,191,0,2,1,192,0,2,1,191,0,2,1,192,0,3,1,193,0,3,1,192,0,3,1,193,0,4,1,194,0,4,1,193,0,4,1,194,0,5,1,195,0,5,1,194,0,5,1,195,0,6,1,196,0,6,1,195,0,6,1,196,0,7,1,197,0,7,1,
+196,0,8,1,198,0,9,1,199,0,9,1,198,0,9,1,199,0,10,1,200,0,10,1,199,0,10,1,200,0,11,1,201,0,11,1,200,0,11,1,201,0,12,1,202,0,12,1,201,0,12,1,202,0,13,1,203,0,13,1,202,0,13,1,203,0,14,1,204,0,14,1,203,0,14,1,204,0,15,1,205,0,15,1,204,0,15,1,205,0,16,1,206,0,16,1,205,0,16,1,206,0,17,1,207,0,17,1,206,0,17,1,207,0,18,1,208,0,18,1,207,0,18,1,208,0,19,1,209,0,19,1,208,0,19,1,209,0,20,1,210,0,20,1,209,0,20,1,210,0,21,1,211,0,21,1,210,0,21,1,211,0,22,1,212,0,22,1,211,0,22,1,212,0,23,1,213,0,23,1,212,0,23,1,
+213,0,24,1,214,0,24,1,213,0,24,1,214,0,25,1,215,0,25,1,214,0,25,1,215,0,26,1,216,0,26,1,215,0,26,1,216,0,27,1,217,0,27,1,216,0,27,1,217,0,28,1,218,0,28,1,217,0,28,1,218,0,29,1,219,0,29,1,218,0,29,1,219,0,30,1,220,0,30,1,219,0,30,1,220,0,31,1,221,0,31,1,220,0,31,1,221,0,32,1,222,0,32,1,221,0,32,1,222,0,33,1,223,0,33,1,222,0,33,1,223,0,34,1,224,0,34,1,223,0,34,1,224,0,35,1,225,0,35,1,224,0,35,1,225,0,36,1,226,0,36,1,225,0,36,1,226,0,37,1,227,0,37,1,226,0,37,1,227,0,38,1,228,0,38,1,227,0,38,1,228,0,
+39,1,229,0,39,1,228,0,39,1,229,0,40,1,230,0,40,1,229,0,40,1,230,0,41,1,231,0,41,1,230,0,41,1,231,0,42,1,232,0,42,1,231,0,42,1,232,0,43,1,233,0,43,1,232,0,43,1,233,0,44,1,234,0,44,1,233,0,44,1,234,0,45,1,235,0,45,1,234,0,45,1,235,0,46,1,236,0,46,1,235,0,46,1,236,0,47,1,237,0,47,1,236,0,47,1,237,0,48,1,238,0,48,1,237,0,48,1,238,0,49,1,239,0,49,1,238,0,49,1,239,0,50,1,240,0,50,1,239,0,50,1,240,0,51,1,241,0,51,1,240,0,51,1,241,0,52,1,242,0,52,1,241,0,52,1,242,0,53,1,243,0,53,1,242,0,53,1,243,0,54,1,244,
+0,54,1,243,0,54,1,244,0,55,1,245,0,55,1,244,0,55,1,245,0,56,1,246,0,56,1,245,0,56,1,246,0,57,1,247,0,57,1,246,0,57,1,247,0,58,1,248,0,58,1,247,0,58,1,248,0,59,1,249,0,59,1,248,0,59,1,249,0,60,1,250,0,60,1,249,0,60,1,250,0,61,1,251,0,61,1,250,0,61,1,251,0,62,1,252,0,62,1,251,0,62,1,252,0,63,1,253,0,63,1,252,0,63,1,253,0,64,1,254,0,64,1,253,0,64,1,254,0,65,1,255,0,65,1,254,0,65,1,255,0,66,1,0,1,66,1,255,0,66,1,0,1,67,1,1,1,67,1,0,1,67,1,1,1,68,1,2,1,68,1,1,1,68,1,2,1,69,1,3,1,69,1,2,1,69,1,3,1,70,1,
+4,1,70,1,3,1,70,1,4,1,71,1,5,1,71,1,4,1,71,1,5,1,72,1,6,1,72,1,5,1,72,1,6,1,73,1,7,1,73,1,6,1,74,1,8,1,75,1,9,1,75,1,8,1,75,1,9,1,76,1,10,1,76,1,9,1,76,1,10,1,77,1,11,1,77,1,10,1,77,1,11,1,78,1,12,1,78,1,11,1,78,1,12,1,79,1,13,1,79,1,12,1,79,1,13,1,80,1,14,1,80,1,13,1,80,1,14,1,81,1,15,1,81,1,14,1,81,1,15,1,82,1,16,1,82,1,15,1,82,1,16,1,83,1,17,1,83,1,16,1,83,1,17,1,84,1,18,1,84,1,17,1,84,1,18,1,85,1,19,1,85,1,18,1,85,1,19,1,86,1,20,1,86,1,19,1,86,1,20,1,87,1,21,1,87,1,20,1,87,1,21,1,88,1,22,1,88,
+1,21,1,88,1,22,1,89,1,23,1,89,1,22,1,89,1,23,1,90,1,24,1,90,1,23,1,90,1,24,1,91,1,25,1,91,1,24,1,91,1,25,1,92,1,26,1,92,1,25,1,92,1,26,1,93,1,27,1,93,1,26,1,93,1,27,1,94,1,28,1,94,1,27,1,94,1,28,1,95,1,29,1,95,1,28,1,95,1,29,1,96,1,30,1,96,1,29,1,96,1,30,1,97,1,31,1,97,1,30,1,97,1,31,1,98,1,32,1,98,1,31,1,98,1,32,1,99,1,33,1,99,1,32,1,99,1,33,1,100,1,34,1,100,1,33,1,100,1,34,1,101,1,35,1,101,1,34,1,101,1,35,1,102,1,36,1,102,1,35,1,102,1,36,1,103,1,37,1,103,1,36,1,103,1,37,1,104,1,38,1,104,1,37,1,
+104,1,38,1,105,1,39,1,105,1,38,1,105,1,39,1,106,1,40,1,106,1,39,1,106,1,40,1,107,1,41,1,107,1,40,1,107,1,41,1,108,1,42,1,108,1,41,1,108,1,42,1,109,1,43,1,109,1,42,1,109,1,43,1,110,1,44,1,110,1,43,1,110,1,44,1,111,1,45,1,111,1,44,1,111,1,45,1,112,1,46,1,112,1,45,1,112,1,46,1,113,1,47,1,113,1,46,1,113,1,47,1,114,1,48,1,114,1,47,1,114,1,48,1,115,1,49,1,115,1,48,1,115,1,49,1,116,1,50,1,116,1,49,1,116,1,50,1,117,1,51,1,117,1,50,1,117,1,51,1,118,1,52,1,118,1,51,1,118,1,52,1,119,1,53,1,119,1,52,1,119,1,
+53,1,120,1,54,1,120,1,53,1,120,1,54,1,121,1,55,1,121,1,54,1,121,1,55,1,122,1,56,1,122,1,55,1,122,1,56,1,123,1,57,1,123,1,56,1,123,1,57,1,124,1,58,1,124,1,57,1,124,1,58,1,125,1,59,1,125,1,58,1,125,1,59,1,126,1,60,1,126,1,59,1,126,1,60,1,127,1,61,1,127,1,60,1,127,1,61,1,128,1,62,1,128,1,61,1,128,1,62,1,129,1,63,1,129,1,62,1,129,1,63,1,130,1,64,1,130,1,63,1,130,1,64,1,131,1,65,1,131,1,64,1,131,1,65,1,132,1,66,1,132,1,65,1,132,1,66,1,133,1,67,1,133,1,66,1,133,1,67,1,134,1,68,1,134,1,67,1,134,1,68,1,135,
+1,69,1,135,1,68,1,135,1,69,1,136,1,70,1,136,1,69,1,136,1,70,1,137,1,71,1,137,1,70,1,137,1,71,1,138,1,72,1,138,1,71,1,138,1,72,1,139,1,73,1,139,1,72,1,140,1,74,1,141,1,75,1,141,1,74,1,141,1,75,1,142,1,76,1,142,1,75,1,142,1,76,1,143,1,77,1,143,1,76,1,143,1,77,1,144,1,78,1,144,1,77,1,144,1,78,1,145,1,79,1,145,1,78,1,145,1,79,1,146,1,80,1,146,1,79,1,146,1,80,1,147,1,81,1,147,1,80,1,147,1,81,1,148,1,82,1,148,1,81,1,148,1,82,1,149,1,83,1,149,1,82,1,149,1,83,1,150,1,84,1,150,1,83,1,150,1,84,1,151,1,85,1,
+151,1,84,1,151,1,85,1,152,1,86,1,152,1,85,1,152,1,86,1,153,1,87,1,153,1,86,1,153,1,87,1,154,1,88,1,154,1,87,1,154,1,88,1,155,1,89,1,155,1,88,1,155,1,89,1,156,1,90,1,156,1,89,1,156,1,90,1,157,1,91,1,157,1,90,1,157,1,91,1,158,1,92,1,158,1,91,1,158,1,92,1,159,1,93,1,159,1,92,1,159,1,93,1,160,1,94,1,160,1,93,1,160,1,94,1,161,1,95,1,161,1,94,1,161,1,95,1,162,1,96,1,162,1,95,1,162,1,96,1,163,1,97,1,163,1,96,1,163,1,97,1,164,1,98,1,164,1,97,1,164,1,98,1,165,1,99,1,165,1,98,1,165,1,99,1,166,1,100,1,166,1,
+99,1,166,1,100,1,167,1,101,1,167,1,100,1,167,1,101,1,168,1,102,1,168,1,101,1,168,1,102,1,169,1,103,1,169,1,102,1,169,1,103,1,170,1,104,1,170,1,103,1,170,1,104,1,171,1,105,1,171,1,104,1,171,1,105,1,172,1,106,1,172,1,105,1,172,1,106,1,173,1,107,1,173,1,106,1,173,1,107,1,174,1,108,1,174,1,107,1,174,1,108,1,175,1,109,1,175,1,108,1,175,1,109,1,176,1,110,1,176,1,109,1,176,1,110,1,177,1,111,1,177,1,110,1,177,1,111,1,178,1,112,1,178,1,111,1,178,1,112,1,179,1,113,1,179,1,112,1,179,1,113,1,180,1,114,1,180,
+1,113,1,180,1,114,1,181,1,115,1,181,1,114,1,181,1,115,1,182,1,116,1,182,1,115,1,182,1,116,1,183,1,117,1,183,1,116,1,183,1,117,1,184,1,118,1,184,1,117,1,184,1,118,1,185,1,119,1,185,1,118,1,185,1,119,1,186,1,120,1,186,1,119,1,186,1,120,1,187,1,121,1,187,1,120,1,187,1,121,1,188,1,122,1,188,1,121,1,188,1,122,1,189,1,123,1,189,1,122,1,189,1,123,1,190,1,124,1,190,1,123,1,190,1,124,1,191,1,125,1,191,1,124,1,191,1,125,1,192,1,126,1,192,1,125,1,192,1,126,1,193,1,127,1,193,1,126,1,193,1,127,1,194,1,128,1,194,
+1,127,1,194,1,128,1,195,1,129,1,195,1,128,1,195,1,129,1,196,1,130,1,196,1,129,1,196,1,130,1,197,1,131,1,197,1,130,1,197,1,131,1,198,1,132,1,198,1,131,1,198,1,132,1,199,1,133,1,199,1,132,1,199,1,133,1,200,1,134,1,200,1,133,1,200,1,134,1,201,1,135,1,201,1,134,1,201,1,135,1,202,1,136,1,202,1,135,1,202,1,136,1,203,1,137,1,203,1,136,1,203,1,137,1,204,1,138,1,204,1,137,1,204,1,138,1,205,1,139,1,205,1,138,1,206,1,140,1,207,1,141,1,207,1,140,1,207,1,141,1,208,1,142,1,208,1,141,1,208,1,142,1,209,1,143,1,209,
+1,142,1,209,1,143,1,210,1,144,1,210,1,143,1,210,1,144,1,211,1,145,1,211,1,144,1,211,1,145,1,212,1,146,1,212,1,145,1,212,1,146,1,213,1,147,1,213,1,146,1,213,1,147,1,214,1,148,1,214,1,147,1,214,1,148,1,215,1,149,1,215,1,148,1,215,1,149,1,216,1,150,1,216,1,149,1,216,1,150,1,217,1,151,1,217,1,150,1,217,1,151,1,218,1,152,1,218,1,151,1,218,1,152,1,219,1,153,1,219,1,152,1,219,1,153,1,220,1,154,1,220,1,153,1,220,1,154,1,221,1,155,1,221,1,154,1,221,1,155,1,222,1,156,1,222,1,155,1,222,1,156,1,223,1,157,1,223,
+1,156,1,223,1,157,1,224,1,158,1,224,1,157,1,224,1,158,1,225,1,159,1,225,1,158,1,225,1,159,1,226,1,160,1,226,1,159,1,226,1,160,1,227,1,161,1,227,1,160,1,227,1,161,1,228,1,162,1,228,1,161,1,228,1,162,1,229,1,163,1,229,1,162,1,229,1,163,1,230,1,164,1,230,1,163,1,230,1,164,1,231,1,165,1,231,1,164,1,231,1,165,1,232,1,166,1,232,1,165,1,232,1,166,1,233,1,167,1,233,1,166,1,233,1,167,1,234,1,168,1,234,1,167,1,234,1,168,1,235,1,169,1,235,1,168,1,235,1,169,1,236,1,170,1,236,1,169,1,236,1,170,1,237,1,171,1,237,
+1,170,1,237,1,171,1,238,1,172,1,238,1,171,1,238,1,172,1,239,1,173,1,239,1,172,1,239,1,173,1,240,1,174,1,240,1,173,1,240,1,174,1,241,1,175,1,241,1,174,1,241,1,175,1,242,1,176,1,242,1,175,1,242,1,176,1,243,1,177,1,243,1,176,1,243,1,177,1,244,1,178,1,244,1,177,1,244,1,178,1,245,1,179,1,245,1,178,1,245,1,179,1,246,1,180,1,246,1,179,1,246,1,180,1,247,1,181,1,247,1,180,1,247,1,181,1,248,1,182,1,248,1,181,1,248,1,182,1,249,1,183,1,249,1,182,1,249,1,183,1,250,1,184,1,250,1,183,1,250,1,184,1,251,1,185,1,251,
+1,184,1,251,1,185,1,252,1,186,1,2