Merge m-c to b2ginbound, a=merge
authorWes Kocher <wkocher@mozilla.com>
Tue, 11 Aug 2015 15:56:37 -0700
changeset 257402 ff964955edb14bf32a934a7217bd1700b11434a4
parent 257401 6bcde12ee7884659e5d2a48983584ac15b92da1a (current diff)
parent 257348 d4f3a8a75577e4af2914a4e899ca2e724f9715c4 (diff)
child 257403 22fdbacd8e8aa5489d53d8118663ef05ee66f436
push id63615
push userryanvm@gmail.com
push dateWed, 12 Aug 2015 14:48:55 +0000
treeherdermozilla-inbound@aa6830e2abd8 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone43.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge m-c to b2ginbound, a=merge
build/autoconf/llvm-pr8927.m4
dom/imptests/editing/conformancetest/data.js
dom/imptests/editing/conformancetest/test_runtest.html
dom/imptests/failures/editing/conformancetest/test_runtest.html.json
dom/media/TaskQueue.cpp
dom/media/TaskQueue.h
js/src/jit-test/tests/debug/Script-staticLevel.js
--- a/CLOBBER
+++ b/CLOBBER
@@ -17,9 +17,10 @@
 #
 # Modifying this file will now automatically clobber the buildbot machines \o/
 #
 
 # Are you updating CLOBBER because you think it's needed for your WebIDL
 # changes to stick? As of bug 928195, this shouldn't be necessary! Please
 # don't change CLOBBER for WebIDL changes any more.
 
-Merge day clobber
\ No newline at end of file
+Bug 1179909 - Android's build system apparently doesn't pick up the removal of
+a Cpptest from the moz.build file and errors out trying to run it anyway.
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -14,17 +14,16 @@ builtin(include, build/autoconf/nspr-bui
 builtin(include, build/autoconf/nss.m4)dnl
 builtin(include, build/autoconf/pkg.m4)dnl
 builtin(include, build/autoconf/codeset.m4)dnl
 builtin(include, build/autoconf/altoptions.m4)dnl
 builtin(include, build/autoconf/mozprog.m4)dnl
 builtin(include, build/autoconf/mozheader.m4)dnl
 builtin(include, build/autoconf/mozcommonheader.m4)dnl
 builtin(include, build/autoconf/lto.m4)dnl
-builtin(include, build/autoconf/llvm-pr8927.m4)dnl
 builtin(include, build/autoconf/frameptr.m4)dnl
 builtin(include, build/autoconf/compiler-opts.m4)dnl
 builtin(include, build/autoconf/expandlibs.m4)dnl
 builtin(include, build/autoconf/arch.m4)dnl
 builtin(include, build/autoconf/android.m4)dnl
 builtin(include, build/autoconf/zlib.m4)dnl
 builtin(include, build/autoconf/linux.m4)dnl
 builtin(include, build/autoconf/python-virtualenv.m4)dnl
--- a/b2g/chrome/content/shell.js
+++ b/b2g/chrome/content/shell.js
@@ -733,16 +733,24 @@ Services.obs.addObserver(function onBlue
     value: data
   });
 }, 'bluetooth-volume-change', false);
 
 Services.obs.addObserver(function(subject, topic, data) {
   shell.sendCustomEvent('mozmemorypressure');
 }, 'memory-pressure', false);
 
+let permissionMap = new Map([
+  ['unknown', Services.perms.UNKNOWN_ACTION],
+  ['allow', Services.perms.ALLOW_ACTION],
+  ['deny', Services.perms.DENY_ACTION],
+  ['prompt', Services.perms.PROMPT_ACTION],
+]);
+let permissionMapRev = new Map(Array.from(permissionMap.entries()).reverse());
+
 var CustomEventManager = {
   init: function custevt_init() {
     window.addEventListener("ContentStart", (function(evt) {
       let content = shell.contentBrowser.contentWindow;
       content.addEventListener("mozContentEvent", this, false, true);
     }).bind(this), false);
   },
 
@@ -778,16 +786,32 @@ var CustomEventManager = {
         break;
       case 'do-command':
         DoCommandHelper.handleEvent(detail.cmd);
         break;
       case 'copypaste-do-command':
         Services.obs.notifyObservers({ wrappedJSObject: shell.contentBrowser },
                                      'ask-children-to-execute-copypaste-command', detail.cmd);
         break;
+      case 'add-permission':
+        Services.perms.add(Services.io.newURI(detail.uri, null, null),
+                           detail.permissionType, permissionMap.get(detail.permission));
+        break;
+      case 'remove-permission':
+        Services.perms.remove(Services.io.newURI(detail.uri, null, null),
+                              detail.permissionType);
+        break;
+      case 'test-permission':
+        let result = Services.perms.testExactPermission(
+          Services.io.newURI(detail.uri, null, null), detail.permissionType);
+        // Not equal check here because we want to prevent default only if it's not set
+        if (result !== permissionMapRev.get(detail.permission)) {
+          evt.preventDefault();
+        }
+        break;
     }
   }
 }
 
 let DoCommandHelper = {
   _event: null,
   setEvent: function docommand_setEvent(evt) {
     this._event = evt;
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -1859,16 +1859,18 @@ pref("browser.translation.neverForLangua
 // Show the translation UI bits, like the info bar, notification icon and preferences.
 pref("browser.translation.ui.show", false);
 // Allows to define the translation engine. Bing is default, Yandex may optionally switched on.
 pref("browser.translation.engine", "bing");
 
 // Telemetry settings.
 // Determines if Telemetry pings can be archived locally.
 pref("toolkit.telemetry.archive.enabled", true);
+// Whether we enable opt-out Telemetry for a sample of the release population.
+pref("toolkit.telemetry.optoutSample", true);
 
 // Telemetry experiments settings.
 pref("experiments.enabled", true);
 pref("experiments.manifest.fetchIntervalSeconds", 86400);
 pref("experiments.manifest.uri", "https://telemetry-experiment.cdn.mozilla.net/manifest/v1/firefox/%VERSION%/%CHANNEL%");
 // Whether experiments are supported by the current application profile.
 pref("experiments.supported", true);
 
--- a/browser/base/content/browser-addons.js
+++ b/browser/base/content/browser-addons.js
@@ -44,17 +44,16 @@ const gXPInstallObserver = {
     }
 
     const anchorID = "addons-notification-icon";
 
     // Make notifications persist a minimum of 30 seconds
     var options = {
       displayURI: installInfo.originatingURI,
       timeout: Date.now() + 30000,
-      removeOnDismissal: true,
     };
 
     let cancelInstallation = () => {
       if (installInfo) {
         for (let install of installInfo.installs)
           install.cancel();
       }
 
--- a/browser/base/content/test/plugins/browser.ini
+++ b/browser/base/content/test/plugins/browser.ini
@@ -62,17 +62,16 @@ skip-if = !crashreporter
 [browser_CTP_outsideScrollArea.js]
 [browser_CTP_remove_navigate.js]
 [browser_CTP_resize.js]
 [browser_CTP_zoom.js]
 [browser_blocking.js]
 [browser_plugins_added_dynamically.js]
 [browser_pluginnotification.js]
 [browser_plugin_infolink.js]
-skip-if = e10s # bug 1160166
 [browser_plugin_reloading.js]
 [browser_blocklist_content.js]
 skip-if = !e10s
 [browser_globalplugin_crashinfobar.js]
 skip-if = !crashreporter
 [browser_pluginCrashCommentAndURL.js]
 skip-if = !crashreporter
 [browser_pageInfo_plugins.js]
--- a/browser/base/content/test/social/browser.ini
+++ b/browser/base/content/test/social/browser.ini
@@ -35,25 +35,21 @@ skip-if = e10s && debug # Leaking docshe
 skip-if = true # bug 1115131
 [browser_social_activation.js]
 skip-if = e10s && debug # e10s/Linux/Debug Leaking docshells (bug 1150147)
 [browser_social_chatwindow.js]
 [browser_social_chatwindow_resize.js]
 [browser_social_chatwindowfocus.js]
 skip-if = e10s # tab crash on data url used in this test
 [browser_social_contextmenu.js]
-skip-if = e10s # Bug 1072669 context menu relies on target element
 [browser_social_errorPage.js]
 [browser_social_flyout.js]
-skip-if = e10s # when we backed out bug 1047603, this test broke.
 [browser_social_isVisible.js]
 [browser_social_marks.js]
-skip-if = e10s && debug # Leaking docshells (bug 1150147)
 [browser_social_multiprovider.js]
-skip-if = e10s # Bug 1069162 - lots of orange
 [browser_social_multiworker.js]
 [browser_social_perwindowPB.js]
 [browser_social_sidebar.js]
 [browser_social_status.js]
 [browser_social_window.js]
 [browser_social_workercrash.js]
 #skip-if = !crashreporter
 skip-if = true # Bug 1060813 - frequent leaks on all platforms
--- a/browser/components/loop/content/shared/js/mixins.js
+++ b/browser/components/loop/content/shared/js/mixins.js
@@ -278,287 +278,19 @@ loop.shared.mixins = (function() {
     componentWillUnmount: function() {
       rootObject.document.removeEventListener(
         "visibilitychange", this._onDocumentVisibilityChanged);
     }
   };
 
   /**
    * Media setup mixin. Provides a common location for settings for the media
-   * elements and handling updates of the media containers.
+   * elements.
    */
   var MediaSetupMixin = {
-    componentDidMount: function() {
-      this.resetDimensionsCache();
-    },
-
-    /**
-     * Resets the dimensions cache, e.g. for when the session is ended, and
-     * before a new session, so that we always ensure we see an update when a
-     * new session is started.
-     */
-    resetDimensionsCache: function() {
-      this._videoDimensionsCache = {
-        local: {},
-        remote: {}
-      };
-    },
-
-    /**
-     * Whenever the dimensions change of a video stream, this function is called
-     * by `updateVideoDimensions` to store the new values and notifies the callee
-     * if the dimensions changed compared to the currently stored values.
-     *
-     * @param  {String} which         Type of video stream. May be 'local' or 'remote'
-     * @param  {Object} newDimensions Object containing 'width' and 'height' properties
-     * @return {Boolean}              `true` when the dimensions have changed,
-     *                                `false` if not
-     */
-    _updateDimensionsCache: function(which, newDimensions) {
-      var cache = this._videoDimensionsCache[which];
-      var cacheKeys = Object.keys(cache);
-      var changed = false;
-      Object.keys(newDimensions).forEach(function(videoType) {
-        if (cacheKeys.indexOf(videoType) === -1) {
-          cache[videoType] = newDimensions[videoType];
-          cache[videoType].aspectRatio = this.getAspectRatio(cache[videoType]);
-          changed = true;
-          return;
-        }
-        if (cache[videoType].width !== newDimensions[videoType].width) {
-          cache[videoType].width = newDimensions[videoType].width;
-          changed = true;
-        }
-        if (cache[videoType].height !== newDimensions[videoType].height) {
-          cache[videoType].height = newDimensions[videoType].height;
-          changed = true;
-        }
-        if (changed) {
-          cache[videoType].aspectRatio = this.getAspectRatio(cache[videoType]);
-        }
-      }, this);
-      // Remove any streams that are no longer being published.
-      cacheKeys.forEach(function(videoType) {
-        if (!(videoType in newDimensions)) {
-          delete cache[videoType];
-          changed = true;
-        }
-      });
-      return changed;
-    },
-
-    /**
-     * Whenever the dimensions change of a video stream, this function is called
-     * to process these changes and possibly trigger an update to the video
-     * container elements.
-     *
-     * @param  {Object} localVideoDimensions  Object containing 'width' and 'height'
-     *                                        properties grouped by stream name
-     * @param  {Object} remoteVideoDimensions Object containing 'width' and 'height'
-     *                                        properties grouped by stream name
-     */
-    updateVideoDimensions: function(localVideoDimensions, remoteVideoDimensions) {
-      var localChanged = this._updateDimensionsCache("local", localVideoDimensions);
-      var remoteChanged = this._updateDimensionsCache("remote", remoteVideoDimensions);
-      if (localChanged || remoteChanged) {
-        this.updateVideoContainer();
-      }
-    },
-
-    /**
-     * Get the aspect ratio of a width/ height pair, which should be the dimensions
-     * of a stream. The returned object is an aspect ratio indexed by 1; the leading
-     * size has a value smaller than 1 and the slave size has a value of 1.
-     * this is exactly the same as notations like 4:3 and 16:9, which are merely
-     * human-readable forms of their fractional counterparts. 4:3 === 1:0.75 and
-     * 16:9 === 1:0.5625.
-     * So we're using the aspect ratios in their original form, because that's
-     * easier to do calculus with.
-     *
-     * Example:
-     * A stream with dimensions `{ width: 640, height: 480 }` yields an indexed
-     * aspect ratio of `{ width: 1, height: 0.75 }`. This means that the 'height'
-     * will determine the value of 'width' when the stream is stretched or shrunk
-     * to fit inside its container element at the maximum size.
-     *
-     * @param  {Object} dimensions Object containing 'width' and 'height' properties
-     * @return {Object}            Contains the indexed aspect ratio for 'width'
-     *                             and 'height' assigned to the corresponding
-     *                             properties.
-     */
-    getAspectRatio: function(dimensions) {
-      if (dimensions.width === dimensions.height) {
-        return {width: 1, height: 1};
-      }
-      var denominator = Math.max(dimensions.width, dimensions.height);
-      return {
-        width: dimensions.width / denominator,
-        height: dimensions.height / denominator
-      };
-    },
-
-    /**
-     * Retrieve the dimensions of the active remote video stream. This assumes
-     * that if screens are being shared, the remote camera stream is hidden.
-     * Example output:
-     *   {
-     *     width: 680,
-     *     height: 480,
-     *     streamWidth: 640,
-     *     streamHeight: 480,
-     *     offsetX: 20,
-     *     offsetY: 0
-     *   }
-     *
-     * Note: This expects a class on the element that has the name "remote" or the
-     *       same name as the possible video types (currently only "screen").
-     * Note: Once we support multiple remote video streams, this function will
-     *       need to be updated.
-     *
-     * @param {string} videoType The video type according to the sdk, e.g. "camera" or
-     *                           "screen".
-     * @return {Object} contains the remote stream dimension properties of its
-     *                  container node, the stream itself and offset of the stream
-     *                  relative to its container node in pixels.
-     */
-    getRemoteVideoDimensions: function(videoType) {
-      var remoteVideoDimensions;
-
-      if (videoType in this._videoDimensionsCache.remote) {
-        var node = this._getElement("." + (videoType === "camera" ? "remote" : videoType));
-        var width = node.offsetWidth;
-        // If the width > 0 then we record its real size by taking its aspect
-        // ratio in account. Due to the 'contain' fit-mode, the stream will be
-        // centered inside the video element.
-        // We'll need to deal with more than one remote video stream whenever
-        // that becomes something we need to support.
-        if (width) {
-          remoteVideoDimensions = {
-            width: width,
-            height: node.offsetHeight
-          };
-
-          var ratio = this._videoDimensionsCache.remote[videoType].aspectRatio;
-          // Leading axis is the side that has the smallest ratio.
-          var leadingAxis = Math.min(ratio.width, ratio.height) === ratio.width ?
-            "width" : "height";
-          var slaveAxis = leadingAxis === "height" ? "width" : "height";
-
-          // We need to work out if the leading axis of the video is full, by
-          // calculating the expected length of the leading axis based on the
-          // length of the slave axis and aspect ratio.
-          var leadingAxisFull = remoteVideoDimensions[slaveAxis] * ratio[leadingAxis] >
-            remoteVideoDimensions[leadingAxis];
-
-          if (leadingAxisFull) {
-            // If the leading axis is "full" then we need to adjust the slave axis.
-            var slaveAxisSize = remoteVideoDimensions[leadingAxis] / ratio[leadingAxis];
-
-            remoteVideoDimensions.streamWidth = leadingAxis === "width" ?
-              remoteVideoDimensions.width : slaveAxisSize;
-            remoteVideoDimensions.streamHeight = leadingAxis === "height" ?
-              remoteVideoDimensions.height : slaveAxisSize;
-          } else {
-            // If the leading axis is not "full" then we need to adjust it, based
-            // on the length of the leading axis.
-            var leadingAxisSize = remoteVideoDimensions[slaveAxis] * ratio[leadingAxis];
-
-            remoteVideoDimensions.streamWidth = leadingAxis === "height" ?
-              remoteVideoDimensions.width : leadingAxisSize;
-            remoteVideoDimensions.streamHeight = leadingAxis === "width" ?
-              remoteVideoDimensions.height : leadingAxisSize;
-          }
-        }
-      }
-
-      // Supply some sensible defaults for the remoteVideoDimensions if no remote
-      // stream is connected (yet).
-      if (!remoteVideoDimensions) {
-        node = this._getElement(".remote");
-        width = node.offsetWidth;
-        var height = node.offsetHeight;
-        remoteVideoDimensions = {
-          width: width,
-          height: height,
-          streamWidth: width,
-          streamHeight: height
-        };
-      }
-
-      // Calculate the size of each individual letter- or pillarbox for convenience.
-      remoteVideoDimensions.offsetX = remoteVideoDimensions.width -
-        remoteVideoDimensions.streamWidth;
-      if (remoteVideoDimensions.offsetX > 0) {
-        remoteVideoDimensions.offsetX /= 2;
-      }
-      remoteVideoDimensions.offsetY = remoteVideoDimensions.height -
-        remoteVideoDimensions.streamHeight;
-      if (remoteVideoDimensions.offsetY > 0) {
-        remoteVideoDimensions.offsetY /= 2;
-      }
-
-      return remoteVideoDimensions;
-    },
-
-    /**
-     * Used to update the video container whenever the orientation or size of the
-     * display area changes.
-     *
-     * Buffer the calls to this function to make sure we don't overflow the stack
-     * with update calls when many 'resize' event are fired, to prevent blocking
-     * the event loop.
-     */
-    updateVideoContainer: function() {
-      if (this._bufferedUpdateVideo) {
-        rootObject.clearTimeout(this._bufferedUpdateVideo);
-        this._bufferedUpdateVideo = null;
-      }
-
-      this._bufferedUpdateVideo = rootObject.setTimeout(function() {
-        // Since this is being called from setTimeout, any exceptions thrown
-        // will propagate upwards into nothingness, unless we go out of our
-        // way to catch and log them explicitly, so...
-        try {
-          this._bufferedUpdateVideo = null;
-          var localStreamParent = this._getElement(".local .OT_publisher");
-          var remoteStreamParent = this._getElement(".remote .OT_subscriber");
-          var screenShareStreamParent = this._getElement(".screen .OT_subscriber");
-          if (localStreamParent) {
-            localStreamParent.style.width = "100%";
-          }
-          if (remoteStreamParent) {
-            remoteStreamParent.style.height = "100%";
-          }
-          if (screenShareStreamParent) {
-            screenShareStreamParent.style.height = "100%";
-          }
-
-          // Update the position and dimensions of the containers of local and
-          // remote video streams, if necessary. The consumer of this mixin
-          // should implement the actual updating mechanism.
-          Object.keys(this._videoDimensionsCache.local).forEach(
-            function (videoType) {
-              var ratio = this._videoDimensionsCache.local[videoType].aspectRatio;
-              if (videoType == "camera" && this.updateLocalCameraPosition) {
-                this.updateLocalCameraPosition(ratio);
-              }
-            }, this);
-          Object.keys(this._videoDimensionsCache.remote).forEach(
-            function (videoType) {
-              var ratio = this._videoDimensionsCache.remote[videoType].aspectRatio;
-              if (videoType == "camera" && this.updateRemoteCameraPosition) {
-                this.updateRemoteCameraPosition(ratio);
-              }
-            }, this);
-        } catch (ex) {
-          console.error("updateVideoContainer: _bufferedVideoUpdate exception:", ex);
-        }
-      }.bind(this), 0);
-    },
-
     /**
      * Returns the default configuration for publishing media on the sdk.
      *
      * @param {Object} options An options object containing:
      * - publishVideo A boolean set to true to publish video when the stream is initiated.
      */
     getDefaultPublisherConfig: function(options) {
       options = options || {};
@@ -571,25 +303,16 @@ loop.shared.mixins = (function() {
       return {
         insertMode: "append",
         fitMode: "contain",
         width: "100%",
         height: "100%",
         publishVideo: options.publishVideo,
         showControls: false
       };
-    },
-
-    /**
-     * Returns either the required DOMNode
-     *
-     * @param {String} className The name of the class to get the element for.
-     */
-    _getElement: function(className) {
-      return this.getDOMNode().querySelector(className);
     }
   };
 
   /**
    * Audio mixin. Allows playing a single audio file and ensuring it
    * is stopped when the component is unmounted.
    */
   var AudioMixin = {
--- a/browser/components/loop/test/shared/mixins_test.js
+++ b/browser/components/loop/test/shared/mixins_test.js
@@ -187,243 +187,40 @@ describe("loop.shared.mixins", function(
 
         comp = TestUtils.renderIntoDocument(React.createElement(TestComp));
 
         sinon.assert.calledOnce(onDocumentHiddenStub);
       });
   });
 
   describe("loop.shared.mixins.MediaSetupMixin", function() {
-    var view, TestComp, rootObject;
-    var localElement, remoteElement, screenShareElement;
+    var view;
 
     beforeEach(function() {
-      TestComp = React.createClass({
+      var TestComp = React.createClass({
         mixins: [loop.shared.mixins.MediaSetupMixin],
         render: function() {
           return React.DOM.div();
         }
       });
 
-      sandbox.useFakeTimers();
-
-      rootObject = {
-        events: {},
-        setTimeout: function(func, timeout) {
-          return setTimeout(func, timeout);
-        },
-        clearTimeout: function(timer) {
-          return clearTimeout(timer);
-        },
-        addEventListener: function(eventName, listener) {
-          this.events[eventName] = listener;
-        },
-        removeEventListener: function(eventName) {
-          delete this.events[eventName];
-        }
-      };
-
-      sharedMixins.setRootObject(rootObject);
-
       view = TestUtils.renderIntoDocument(React.createElement(TestComp));
-
-      sandbox.stub(view, "getDOMNode").returns({
-        querySelector: function(classSelector) {
-          if (classSelector.indexOf("local") > -1) {
-            return localElement;
-          } else if (classSelector.indexOf("screen") > -1) {
-            return screenShareElement;
-          }
-          return remoteElement;
-        }
-      });
-    });
-
-    afterEach(function() {
-      localElement = null;
-      remoteElement = null;
-      screenShareElement = null;
     });
 
     describe("#getDefaultPublisherConfig", function() {
-      it("should provide a default publisher configuration", function() {
-        var defaultConfig = view.getDefaultPublisherConfig({publishVideo: true});
-
-        expect(defaultConfig.publishVideo).eql(true);
-      });
-    });
-
-    describe("#getRemoteVideoDimensions", function() {
-      var localVideoDimensions, remoteVideoDimensions;
-
-      beforeEach(function() {
-        localVideoDimensions = {
-          camera: {
-            width: 640,
-            height: 480
-          }
-        };
+      it("should throw if publishVideo is not given", function() {
+        expect(function() {
+          view.getDefaultPublisherConfig();
+        }).to.throw(/missing/);
       });
 
-      it("should fetch the correct stream sizes for leading axis width and full",
-        function() {
-          remoteVideoDimensions = {
-            screen: {
-              width: 240,
-              height: 320
-            }
-          };
-          screenShareElement = {
-            offsetWidth: 480,
-            offsetHeight: 700
-          };
-
-          view.updateVideoDimensions(localVideoDimensions, remoteVideoDimensions);
-          var result = view.getRemoteVideoDimensions("screen");
-
-          expect(result.width).eql(screenShareElement.offsetWidth);
-          expect(result.height).eql(screenShareElement.offsetHeight);
-          expect(result.streamWidth).eql(screenShareElement.offsetWidth);
-          // The real height of the stream accounting for the aspect ratio.
-          expect(result.streamHeight).eql(640);
-          expect(result.offsetX).eql(0);
-          // The remote element height (700) minus the stream height (640) split in 2.
-          expect(result.offsetY).eql(30);
-        });
-
-      it("should fetch the correct stream sizes for leading axis width and not full",
-        function() {
-          remoteVideoDimensions = {
-            camera: {
-              width: 240,
-              height: 320
-            }
-          };
-          remoteElement = {
-            offsetWidth: 640,
-            offsetHeight: 480
-          };
-
-          view.updateVideoDimensions(localVideoDimensions, remoteVideoDimensions);
-          var result = view.getRemoteVideoDimensions("camera");
-
-          expect(result.width).eql(remoteElement.offsetWidth);
-          expect(result.height).eql(remoteElement.offsetHeight);
-          // Aspect ratio modified from the height.
-          expect(result.streamWidth).eql(360);
-          expect(result.streamHeight).eql(remoteElement.offsetHeight);
-          // The remote element width (640) minus the stream width (360) split in 2.
-          expect(result.offsetX).eql(140);
-          expect(result.offsetY).eql(0);
-        });
-
-      it("should fetch the correct stream sizes for leading axis height and full",
-        function() {
-          remoteVideoDimensions = {
-            screen: {
-              width: 320,
-              height: 240
-            }
-          };
-          screenShareElement = {
-            offsetWidth: 700,
-            offsetHeight: 480
-          };
-
-          view.updateVideoDimensions(localVideoDimensions, remoteVideoDimensions);
-          var result = view.getRemoteVideoDimensions("screen");
-
-          expect(result.width).eql(screenShareElement.offsetWidth);
-          expect(result.height).eql(screenShareElement.offsetHeight);
-          // The real width of the stream accounting for the aspect ratio.
-          expect(result.streamWidth).eql(640);
-          expect(result.streamHeight).eql(screenShareElement.offsetHeight);
-          // The remote element width (700) minus the stream width (640) split in 2.
-          expect(result.offsetX).eql(30);
-          expect(result.offsetY).eql(0);
-        });
-
-      it("should fetch the correct stream sizes for leading axis height and not full",
-        function() {
-          remoteVideoDimensions = {
-            camera: {
-              width: 320,
-              height: 240
-            }
-          };
-          remoteElement = {
-            offsetWidth: 480,
-            offsetHeight: 640
-          };
-
-          view.updateVideoDimensions(localVideoDimensions, remoteVideoDimensions);
-          var result = view.getRemoteVideoDimensions("camera");
-
-          expect(result.width).eql(remoteElement.offsetWidth);
-          expect(result.height).eql(remoteElement.offsetHeight);
-          expect(result.streamWidth).eql(remoteElement.offsetWidth);
-          // Aspect ratio modified from the width.
-          expect(result.streamHeight).eql(360);
-          expect(result.offsetX).eql(0);
-          // The remote element width (640) minus the stream width (360) split in 2.
-          expect(result.offsetY).eql(140);
-        });
-    });
-
-    describe("Events", function() {
-
-      describe("Video stream dimensions", function() {
-        var localVideoDimensions = {
-          camera: {
-            width: 640,
-            height: 480
-          }
-        };
-        var remoteVideoDimensions = {
-          camera: {
-            width: 420,
-            height: 138
-          }
-        };
-
-        it("should register video dimension updates correctly", function() {
-          view.updateVideoDimensions(localVideoDimensions, remoteVideoDimensions);
-
-          expect(view._videoDimensionsCache.local.camera.width)
-            .eql(localVideoDimensions.camera.width);
-          expect(view._videoDimensionsCache.local.camera.height)
-            .eql(localVideoDimensions.camera.height);
-          expect(view._videoDimensionsCache.local.camera.aspectRatio.width).eql(1);
-          expect(view._videoDimensionsCache.local.camera.aspectRatio.height).eql(0.75);
-          expect(view._videoDimensionsCache.remote.camera.width)
-            .eql(remoteVideoDimensions.camera.width);
-          expect(view._videoDimensionsCache.remote.camera.height)
-            .eql(remoteVideoDimensions.camera.height);
-          expect(view._videoDimensionsCache.remote.camera.aspectRatio.width).eql(1);
-          expect(view._videoDimensionsCache.remote.camera.aspectRatio.height)
-            .eql(0.32857142857142857);
-        });
-
-        it("should unregister video dimension updates correctly", function() {
-          view.updateVideoDimensions(localVideoDimensions, {});
-
-          expect("camera" in view._videoDimensionsCache.local).eql(true);
-          expect("camera" in view._videoDimensionsCache.remote).eql(false);
-        });
-
-        it("should not populate the cache on another component instance", function() {
-            view.updateVideoDimensions(localVideoDimensions, remoteVideoDimensions);
-
-            var view2 =
-              TestUtils.renderIntoDocument(React.createElement(TestComp));
-
-            expect(view2._videoDimensionsCache.local).to.be.empty;
-            expect(view2._videoDimensionsCache.remote).to.be.empty;
-        });
-
+      it("should return a set of defaults based on the options", function() {
+        expect(view.getDefaultPublisherConfig({
+          publishVideo: true
+        }).publishVideo).eql(true);
       });
     });
   });
 
   describe("loop.shared.mixins.AudioMixin", function() {
     var view, fakeAudio, TestComp;
 
     beforeEach(function() {
--- a/browser/config/version_display.txt
+++ b/browser/config/version_display.txt
@@ -1,1 +1,1 @@
-42.0a1
+43.0a1
--- a/browser/devtools/webconsole/test/browser_webconsole_hpkp_invalid-headers.js
+++ b/browser/devtools/webconsole/test/browser_webconsole_hpkp_invalid-headers.js
@@ -4,16 +4,18 @@
  *  to the web console */
 
 "use strict";
 
 const TEST_URI = "data:text/html;charset=utf-8,Web Console HPKP invalid " +
                  "header test";
 const SJS_URL = "https://example.com/browser/browser/devtools/webconsole/" +
                 "test/test_hpkp-invalid-headers.sjs";
+const LEARN_MORE_URI = "https://developer.mozilla.org/docs/Web/Security/" +
+                       "Public_Key_Pinning";
 const NON_BUILTIN_ROOT_PREF = "security.cert_pinning.process_headers_from_" +
                               "non_builtin_roots";
 
 let test = asyncTest(function* () {
   registerCleanupFunction(() => {
     Services.prefs.clearUserPref(NON_BUILTIN_ROOT_PREF);
   });
   // The root used for mochitests is not built-in, so set the relevant pref to
@@ -81,20 +83,30 @@ let test = asyncTest(function* () {
   }, hud);
 });
 
 function* checkForMessage(curTest, hud) {
   hud.jsterm.clearOutput();
 
   content.location = curTest.url;
 
-  yield waitForMessages({
+  let results = yield waitForMessages({
     webconsole: hud,
     messages: [
       {
         name: curTest.name,
         text: curTest.text,
         category: CATEGORY_SECURITY,
         severity: SEVERITY_WARNING,
+        objects: true,
       },
     ],
   });
+
+  yield testClickOpenNewTab(hud, results);
 }
+
+function testClickOpenNewTab(hud, results) {
+  let warningNode = results[0].clickableElements[0];
+  ok(warningNode, "link element");
+  ok(warningNode.classList.contains("learn-more-link"), "link class name");
+  return simulateMessageLinkClick(warningNode, LEARN_MORE_URI);
+}
--- a/browser/devtools/webconsole/webconsole.js
+++ b/browser/devtools/webconsole/webconsole.js
@@ -41,16 +41,18 @@ let l10n = new WebConsoleUtils.l10n(STRI
 const XHTML_NS = "http://www.w3.org/1999/xhtml";
 
 const MIXED_CONTENT_LEARN_MORE = "https://developer.mozilla.org/docs/Security/MixedContent";
 
 const TRACKING_PROTECTION_LEARN_MORE = "https://developer.mozilla.org/Firefox/Privacy/Tracking_Protection";
 
 const INSECURE_PASSWORDS_LEARN_MORE = "https://developer.mozilla.org/docs/Security/InsecurePasswords";
 
+const PUBLIC_KEY_PINS_LEARN_MORE = "https://developer.mozilla.org/docs/Web/Security/Public_Key_Pinning";
+
 const STRICT_TRANSPORT_SECURITY_LEARN_MORE = "https://developer.mozilla.org/docs/Security/HTTP_Strict_Transport_Security";
 
 const WEAK_SIGNATURE_ALGORITHM_LEARN_MORE = "https://developer.mozilla.org/docs/Security/Weak_Signature_Algorithm";
 
 const HELP_URL = "https://developer.mozilla.org/docs/Tools/Web_Console/Helpers";
 
 const VARIABLES_VIEW_URL = "chrome://browser/content/devtools/widgets/VariablesView.xul";
 
@@ -1663,35 +1665,38 @@ WebConsoleFrame.prototype = {
    *        The node to which we will be adding the more info link node
    * @param aScriptError
    *        The script error object that we are reporting to the console
    */
   addMoreInfoLink: function WCF_addMoreInfoLink(aNode, aScriptError)
   {
     let url;
     switch (aScriptError.category) {
-     case "Insecure Password Field":
-       url = INSECURE_PASSWORDS_LEARN_MORE;
-     break;
-     case "Mixed Content Message":
-     case "Mixed Content Blocker":
-      url = MIXED_CONTENT_LEARN_MORE;
-     break;
-     case "Invalid HSTS Headers":
-      url = STRICT_TRANSPORT_SECURITY_LEARN_MORE;
-     break;
-     case "SHA-1 Signature":
-      url = WEAK_SIGNATURE_ALGORITHM_LEARN_MORE;
-     break;
-     case "Tracking Protection":
-      url = TRACKING_PROTECTION_LEARN_MORE;
-     break;
-     default:
-      // Unknown category. Return without adding more info node.
-      return;
+      case "Insecure Password Field":
+        url = INSECURE_PASSWORDS_LEARN_MORE;
+        break;
+      case "Mixed Content Message":
+      case "Mixed Content Blocker":
+        url = MIXED_CONTENT_LEARN_MORE;
+        break;
+      case "Invalid HPKP Headers":
+        url = PUBLIC_KEY_PINS_LEARN_MORE;
+        break;
+      case "Invalid HSTS Headers":
+        url = STRICT_TRANSPORT_SECURITY_LEARN_MORE;
+        break;
+      case "SHA-1 Signature":
+        url = WEAK_SIGNATURE_ALGORITHM_LEARN_MORE;
+        break;
+      case "Tracking Protection":
+        url = TRACKING_PROTECTION_LEARN_MORE;
+        break;
+      default:
+        // Unknown category. Return without adding more info node.
+        return;
     }
 
     this.addLearnMoreWarningNode(aNode, url);
   },
 
   /*
    * Appends a clickable warning node to the node passed
    * as a parameter to the function. When a user clicks on the appended
--- a/browser/extensions/shumway/chrome/FileLoader.jsm
+++ b/browser/extensions/shumway/chrome/FileLoader.jsm
@@ -16,20 +16,36 @@
 
 var EXPORTED_SYMBOLS = ['FileLoader'];
 
 Components.utils.import('resource://gre/modules/Services.jsm');
 Components.utils.import('resource://gre/modules/Promise.jsm');
 Components.utils.import('resource://gre/modules/XPCOMUtils.jsm');
 Components.utils.import('resource://gre/modules/NetUtil.jsm');
 
-function FileLoader(swfUrl, baseUrl, callback) {
+function FileLoaderSession(sessionId) {
+  this.sessionId = sessionId;
+  this.xhr = null;
+}
+FileLoaderSession.prototype = {
+  abort() {
+    if (this.xhr) {
+      this.xhr.abort();
+      this.xhr = null;
+    }
+  }
+};
+
+
+function FileLoader(swfUrl, baseUrl, refererUrl, callback) {
   this.swfUrl = swfUrl;
   this.baseUrl = baseUrl;
+  this.refererUrl = refererUrl;
   this.callback = callback;
+  this.activeSessions = Object.create(null);
 
   this.crossdomainRequestsCache = Object.create(null);
 }
 
 FileLoader.prototype = {
   load: function (data) {
     function notifyLoadFileListener(data) {
       if (!onLoadFileCallback) {
@@ -45,64 +61,91 @@ FileLoader.prototype = {
 
     var url = data.url;
     var checkPolicyFile = data.checkPolicyFile;
     var sessionId = data.sessionId;
     var limit = data.limit || 0;
     var method = data.method || "GET";
     var mimeType = data.mimeType;
     var postData = data.postData || null;
+    var sendReferer = canSendReferer(swfUrl, this.refererUrl);
 
+    var session = new FileLoaderSession(sessionId);
+    this.activeSessions[sessionId] = session;
+    var self = this;
 
     var performXHR = function () {
-      var xhr = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
-        .createInstance(Components.interfaces.nsIXMLHttpRequest);
+      // Load has been aborted before we reached this point.
+      if (!self.activeSessions[sessionId]) {
+        return;
+      }
+      var xhr = session.xhr = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"].
+                              createInstance(Components.interfaces.nsIXMLHttpRequest);
       xhr.open(method, url, true);
       xhr.responseType = "moz-chunked-arraybuffer";
 
-      if (baseUrl) {
+      if (sendReferer) {
         // Setting the referer uri, some site doing checks if swf is embedded
         // on the original page.
-        xhr.setRequestHeader("Referer", baseUrl);
+        xhr.setRequestHeader("Referer", self.refererUrl);
       }
 
       // TODO apply range request headers if limit is specified
 
       var lastPosition = 0;
       xhr.onprogress = function (e) {
         var position = e.loaded;
+        var total = e.total;
         var data = new Uint8Array(xhr.response);
+        // The event's `loaded` and `total` properties are sometimes lower than the actual
+        // number of loaded bytes. In that case, increase them to that value.
+        position = Math.max(position, data.byteLength);
+        total = Math.max(total, data.byteLength);
+
         notifyLoadFileListener({callback:"loadFile", sessionId: sessionId,
-          topic: "progress", array: data, loaded: position, total: e.total});
+          topic: "progress", array: data, loaded: position, total: total});
         lastPosition = position;
-        if (limit && e.total >= limit) {
+        if (limit && total >= limit) {
           xhr.abort();
         }
       };
       xhr.onreadystatechange = function(event) {
         if (xhr.readyState === 4) {
+          delete self.activeSessions[sessionId];
           if (xhr.status !== 200 && xhr.status !== 0) {
             notifyLoadFileListener({callback:"loadFile", sessionId: sessionId, topic: "error", error: xhr.statusText});
           }
           notifyLoadFileListener({callback:"loadFile", sessionId: sessionId, topic: "close"});
         }
       };
       if (mimeType)
         xhr.setRequestHeader("Content-Type", mimeType);
       xhr.send(postData);
       notifyLoadFileListener({callback:"loadFile", sessionId: sessionId, topic: "open"});
     };
 
     canDownloadFile(url, checkPolicyFile, swfUrl, crossdomainRequestsCache).then(function () {
       performXHR();
     }, function (reason) {
       log("data access is prohibited to " + url + " from " + baseUrl);
-      notifyLoadFileListener({callback:"loadFile", sessionId: sessionId, topic: "error",
-        error: "only original swf file or file from the same origin loading supported"});
+      delete self.activeSessions[sessionId];
+      notifyLoadFileListener({
+        callback: "loadFile", sessionId: sessionId, topic: "error",
+        error: "only original swf file or file from the same origin loading supported (XDOMAIN)"
+      });
     });
+  },
+  abort: function(sessionId) {
+    var session = this.activeSessions[sessionId];
+    if (!session) {
+      log("Warning: trying to abort invalid session " + sessionId);
+      return;
+    }
+    session.abort();
+    delete this.activeSessions[sessionId];
   }
 };
 
 function log(aMsg) {
   let msg = 'FileLoader.js: ' + (aMsg.join ? aMsg.join('') : aMsg);
   Services.console.logStringMessage(msg);
   dump(msg + '\n');
 }
@@ -124,16 +167,35 @@ function disableXHRRedirect(xhr) {
     getInterface: function(iid) {
       return this.QueryInterface(iid);
     },
     QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIChannelEventSink])
   };
   xhr.channel.notificationCallbacks = listener;
 }
 
+function canSendReferer(url, refererUrl) {
+  if (!refererUrl) {
+    return false;
+  }
+  // Allow sending HTTPS referer only to HTTPS.
+  var parsedUrl, parsedRefererUrl;
+  try {
+    parsedRefererUrl = NetUtil.newURI(refererUrl);
+  } catch (ex) { /* skipping invalid urls */ }
+  if (!parsedRefererUrl ||
+      parsedRefererUrl.scheme.toLowerCase() !== 'https') {
+    return true;
+  }
+  try {
+    parsedUrl = NetUtil.newURI(url);
+  } catch (ex) { /* skipping invalid urls */ }
+  return !!parsedUrl && parsedUrl.scheme.toLowerCase() === 'https';
+}
+
 function canDownloadFile(url, checkPolicyFile, swfUrl, cache) {
   // TODO flash cross-origin request
   if (url === swfUrl) {
     // Allows downloading for the original file.
     return Promise.resolve(undefined);
   }
 
   // Allows downloading from the same origin.
new file mode 100644
--- /dev/null
+++ b/browser/extensions/shumway/chrome/LocalConnection.jsm
@@ -0,0 +1,258 @@
+/*
+ * Copyright 2015 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var EXPORTED_SYMBOLS = ['LocalConnectionService'];
+
+Components.utils.import('resource://gre/modules/NetUtil.jsm');
+Components.utils.import('resource://gre/modules/Services.jsm');
+
+const localConnectionsRegistry = Object.create(null);
+
+function isConnectionNameValid(connectionName) {
+  return typeof connectionName === 'string' &&
+         (connectionName[0] === '_' || connectionName.split(':').length === 2);
+}
+
+/**
+ * Creates a trusted qualified connection name from an already qualified name and a swfUrl.
+ *
+ * While connection names are already qualified at this point, the qualification happens in
+ * untrusted code. To ensure that the name is correctly qualified, this function compares the
+ * qualification domain with the current SWF's URL and substitutes that URL's domain if
+ * required. A warning is logged in that case.
+ */
+function _getQualifiedConnectionName(connectionName, swfUrl) {
+  // Already syntactically invalid connection names mustn't get here.
+  if (!isConnectionNameValid(connectionName)) {
+    // TODO: add telemetry
+    throw new Error('Syntactically invalid local-connection name encountered', connectionName,
+                    swfUrl);
+  }
+  var [domain, name] = connectionName.split(':');
+  var parsedURL = NetUtil.newURI(swfUrl);
+  if (domain !== parsedURL.host) {
+    // TODO: add telemetry
+    log('Warning: invalid local-connection name qualification found: ' + connectionName);
+    return parsedURL.host + ':' + swfUrl;
+  }
+  return connectionName;
+}
+
+function _getLocalConnection(connectionName) {
+  // Treat invalid connection names as non-existent. This can only happen if player code
+  // misbehaves, though.
+  if (!isConnectionNameValid(connectionName)) {
+    // TODO: add telemetry
+    return null;
+  }
+  var connection = localConnectionsRegistry[connectionName];
+  if (connection && Components.utils.isDeadWrapper(connection.callback)) {
+    delete localConnectionsRegistry[connectionName];
+    return null;
+  }
+  return localConnectionsRegistry[connectionName];
+}
+
+function LocalConnectionService(content, environment) {
+  var traceLocalConnection = getBoolPref('shumway.localConnection.trace', false);
+  var api = {
+    createLocalConnection: function (connectionName, callback) {
+      connectionName = connectionName + '';
+      traceLocalConnection && content.console.log(`Creating local connection "${connectionName}" ` +
+                                                  `for SWF with URL ${environment.swfUrl}`);
+
+      if (!isConnectionNameValid(connectionName)) {
+        // TODO: add telemetry
+        traceLocalConnection && content.console.warn(`Invalid localConnection name `);
+        return -1; // LocalConnectionConnectResult.InvalidName
+      }
+      if (typeof callback !== 'function') {
+        // TODO: add telemetry
+        traceLocalConnection && content.console.warn(`Invalid callback for localConnection`);
+        return -3; // LocalConnectionConnectResult.InvalidCallback
+      }
+      connectionName = _getQualifiedConnectionName(connectionName, environment.swfUrl);
+      if (_getLocalConnection(connectionName)) {
+        traceLocalConnection && content.console.log(`localConnection ` +
+                                                     `name "${connectionName}" already taken`);
+        return -2; // LocalConnectionConnectResult.AlreadyTaken
+      }
+
+      var parsedURL = NetUtil.newURI(environment.swfUrl);
+
+      var connection = {
+        callback,
+        domain: parsedURL.host,
+        environment: environment,
+        secure: parsedURL.protocol === 'https:',
+        allowedSecureDomains: Object.create(null),
+        allowedInsecureDomains: Object.create(null)
+      };
+      localConnectionsRegistry[connectionName] = connection;
+      return 0; // LocalConnectionConnectResult.Success
+    },
+    hasLocalConnection: function (connectionName) {
+      connectionName = _getQualifiedConnectionName(connectionName + '', environment.swfUrl);
+
+      var result = !!_getLocalConnection(connectionName);
+      traceLocalConnection && content.console.log(`hasLocalConnection "${connectionName}"? ` +
+                                                  result);
+      return result;
+    },
+    closeLocalConnection: function (connectionName) {
+      connectionName = _getQualifiedConnectionName(connectionName + '', environment.swfUrl);
+      traceLocalConnection && content.console.log(`Closing local connection "${connectionName}" ` +
+                                                  `for SWF with URL ${environment.swfUrl}`);
+
+      var connection = _getLocalConnection(connectionName);
+      if (!connection) {
+        traceLocalConnection && content.console.log(`localConnection "${connectionName}" not ` +
+                                                    `connected`);
+        return -1; // LocalConnectionCloseResult.NotConnected
+      } else if (connection.environment !== environment) {
+        // Attempts to close connections from a SWF instance that didn't create them shouldn't
+        // happen. If they do, we treat them as if the connection didn't exist.
+        traceLocalConnection && content.console.warn(`Ignored attempt to close localConnection ` +
+                                                     `"${connectionName}" from SWF instance that ` +
+                                                     `didn't create it`);
+        return -1; // LocalConnectionCloseResult.NotConnected
+      }
+      delete localConnectionsRegistry[connectionName];
+      return 0; // LocalConnectionCloseResult.Success
+    },
+    sendLocalConnectionMessage: function (connectionName, methodName, argsBuffer, sender,
+                                          senderDomain, senderIsSecure) {
+      connectionName = connectionName + '';
+      methodName = methodName + '';
+      senderDomain = senderDomain + '';
+      senderIsSecure = !!senderIsSecure;
+      // TODO: sanitize argsBuffer argument. Ask bholley how to do so.
+      traceLocalConnection && content.console.log(`sending localConnection message ` +
+                                                  `"${methodName}" to "${connectionName}"`);
+
+      // Since we don't currently trust the sender information passed in here, we use the
+      // currently running SWF's URL instead.
+      var parsedURL = NetUtil.newURI(environment.swfUrl);
+      var parsedURLIsSecure = parsedURL.protocol === 'https:';
+      if (parsedURL.host !== senderDomain || parsedURLIsSecure !== senderIsSecure) {
+        traceLocalConnection && content.console.warn(`sending localConnection message ` +
+                                                     `"${methodName}" to "${connectionName}"`);
+      }
+      senderDomain = parsedURL.host;
+      senderIsSecure = parsedURLIsSecure;
+
+      var connection = _getLocalConnection(connectionName);
+      if (!connection) {
+        traceLocalConnection && content.console.log(`localConnection "${connectionName}" not ` +
+                                                    `connected`);
+        return;
+      }
+      try {
+        var allowed = false;
+        if (connection.secure) {
+          // If the receiver is secure, the sender has to be, too, or it has to be whitelisted
+          // with allowInsecureDomain.
+          if (senderIsSecure) {
+            if (senderDomain === connection.domain ||
+                senderDomain in connection.allowedSecureDomains ||
+                '*' in connection.allowedSecureDomains) {
+              allowed = true;
+            }
+          } else {
+            if (senderDomain in connection.allowedInsecureDomains ||
+                '*' in connection.allowedInsecureDomains) {
+              allowed = true;
+            }
+          }
+        } else {
+          // For non-secure connections, allowedSecureDomains is expected to contain all allowed
+          // domains, secure on non-secure, so we don't have to check both.
+          if (senderDomain === connection.domain ||
+              senderDomain in connection.allowedSecureDomains ||
+              '*' in connection.allowedSecureDomains) {
+            allowed = true;
+          }
+        }
+        if (!allowed) {
+          traceLocalConnection && content.console.warn(`LocalConnection message rejected: domain ` +
+                                                       `${senderDomain} not allowed.`);
+          return {
+            name: 'SecurityError',
+            $Bgmessage: "The current security context does not allow this operation.",
+            _errorID: 3315
+          };
+        }
+        var callback = connection.callback;
+        var clonedArgs = Components.utils.cloneInto(argsBuffer, callback);
+        callback(methodName, clonedArgs);
+      } catch (e) {
+        // TODO: add telemetry
+        content.console.warn('Unexpected error encountered while sending LocalConnection message.');
+      }
+    },
+    allowDomainsForLocalConnection: function (connectionName, domains, secure) {
+      connectionName = _getQualifiedConnectionName(connectionName + '', environment.swfUrl);
+      secure = !!secure;
+      var connection = _getLocalConnection(connectionName);
+      if (!connection) {
+        return;
+      }
+      try {
+        domains = Components.utils.cloneInto(domains, connection);
+      } catch (e) {
+        log('error in allowDomainsForLocalConnection: ' + e);
+        return;
+      }
+      traceLocalConnection && content.console.log(`allowing ${secure ? '' : 'in'}secure domains ` +
+                                                  `[${domains}] for localConnection ` +
+                                                  `"${connectionName}"`);
+      function validateDomain(domain) {
+        if (typeof domain !== 'string') {
+          return false;
+        }
+        if (domain === '*') {
+          return true;
+        }
+        try {
+          var uri = NetUtil.newURI('http://' + domain);
+          return uri.host === domain;
+        } catch (e) {
+          return false;
+        }
+      }
+      if (!Array.isArray(domains) || !domains.every(validateDomain)) {
+        traceLocalConnection && content.console.warn(`Invalid domains rejected`);
+        return;
+      }
+      var allowedDomains = secure ?
+                           connection.allowedSecureDomains :
+                           connection.allowedInsecureDomains;
+      domains.forEach(domain => allowedDomains[domain] = true);
+    }
+  };
+
+  // Don't return `this` even though this function is treated as a ctor. Makes cloning into the
+  // content compartment an internal operation the client code doesn't have to worry about.
+  return Components.utils.cloneInto(api, content, {cloneFunctions:true});
+}
+
+function getBoolPref(pref, def) {
+  try {
+    return Services.prefs.getBoolPref(pref);
+  } catch (ex) {
+    return def;
+  }
+}
--- a/browser/extensions/shumway/chrome/ShumwayCom.jsm
+++ b/browser/extensions/shumway/chrome/ShumwayCom.jsm
@@ -11,25 +11,27 @@
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 
 var EXPORTED_SYMBOLS = ['ShumwayCom'];
 
-Components.utils.import('resource://gre/modules/XPCOMUtils.jsm');
+Components.utils.import('resource://gre/modules/NetUtil.jsm');
+Components.utils.import('resource://gre/modules/Promise.jsm');
 Components.utils.import('resource://gre/modules/Services.jsm');
-Components.utils.import('resource://gre/modules/Promise.jsm');
+Components.utils.import('resource://gre/modules/XPCOMUtils.jsm');
 
 Components.utils.import('chrome://shumway/content/SpecialInflate.jsm');
 Components.utils.import('chrome://shumway/content/SpecialStorage.jsm');
 Components.utils.import('chrome://shumway/content/RtmpUtils.jsm');
 Components.utils.import('chrome://shumway/content/ExternalInterface.jsm');
 Components.utils.import('chrome://shumway/content/FileLoader.jsm');
+Components.utils.import('chrome://shumway/content/LocalConnection.jsm');
 
 XPCOMUtils.defineLazyModuleGetter(this, 'ShumwayTelemetry',
   'resource://shumway/ShumwayTelemetry.jsm');
 
 const MAX_USER_INPUT_TIMEOUT = 250; // ms
 
 function getBoolPref(pref, def) {
   try {
@@ -70,30 +72,34 @@ function sanitizeTelemetryArgs(args) {
         height: args.height | 0,
         bannerType: args.bannerType | 0,
         isAvm2: !!args.isAvm2
       };
       break;
     case 'feature':
       request.featureType = args.feature | 0;
       break;
+    case 'loadResource':
+      request.resultType = args.resultType | 0;
+      break;
     case 'error':
       request.errorType = args.error | 0;
       break;
   }
   return request;
 }
 
 function sanitizeLoadFileArgs(args) {
   return {
     url: String(args.url || ''),
     checkPolicyFile: !!args.checkPolicyFile,
     sessionId: +args.sessionId,
     limit: +args.limit || 0,
     mimeType: String(args.mimeType || ''),
+    method: (args.method + '') || 'GET',
     postData: args.postData || null
   };
 }
 
 function sanitizeExternalComArgs(args) {
   var request = {
     action: String(args.action)
   };
@@ -107,137 +113,238 @@ function sanitizeExternalComArgs(args) {
     case 'register':
     case 'unregister':
       request.functionName = String(args.functionName);
       break;
   }
   return request;
 }
 
+var cloneIntoFromContent = (function () {
+  // waiveXrays are used due to bug 1150771, checking if we are affected
+  // TODO remove workaround after Firefox 40 is released (2015-08-11)
+  let sandbox1 = new Components.utils.Sandbox(null);
+  let sandbox2 = new Components.utils.Sandbox(null);
+  let arg = Components.utils.evalInSandbox('({buf: new ArrayBuffer(2)})', sandbox1);
+  let clonedArg = Components.utils.cloneInto(arg, sandbox2);
+  if (!Components.utils.waiveXrays(clonedArg).buf) {
+    return function (obj, contentSandbox) {
+      return Components.utils.cloneInto(
+        Components.utils.waiveXrays(obj), contentSandbox);
+    };
+  }
+
+  return function (obj, contentSandbox) {
+    return Components.utils.cloneInto(obj, contentSandbox);
+  };
+})();
+
+var ShumwayEnvironment = {
+  DEBUG: 'debug',
+  DEVELOPMENT: 'dev',
+  RELEASE: 'release',
+  TEST: 'test'
+};
+
 var ShumwayCom = {
+  environment: getCharPref('shumway.environment', 'dev'),
+  
   createAdapter: function (content, callbacks, hooks) {
     // Exposing ShumwayCom object/adapter to the unprivileged content -- setting
     // up Xray wrappers.
     var wrapped = {
-      enableDebug: function enableDebug() {
+      environment: ShumwayCom.environment,
+    
+      enableDebug: function () {
         callbacks.enableDebug()
       },
 
-      setFullscreen: function setFullscreen(value) {
-        value = !!value;
-        callbacks.sendMessage('setFullscreen', value, false);
-      },
-
-      fallback: function fallback() {
+      fallback: function () {
         callbacks.sendMessage('fallback', null, false);
       },
 
-      getSettings: function getSettings() {
+      getSettings: function () {
         return Components.utils.cloneInto(
           callbacks.sendMessage('getSettings', null, true), content);
       },
 
-      getPluginParams: function getPluginParams() {
+      getPluginParams: function () {
         return Components.utils.cloneInto(
           callbacks.sendMessage('getPluginParams', null, true), content);
       },
 
-      reportIssue: function reportIssue() {
+      reportIssue: function () {
         callbacks.sendMessage('reportIssue', null, false);
       },
 
-      reportTelemetry: function reportTelemetry(args) {
+      reportTelemetry: function (args) {
         var request = sanitizeTelemetryArgs(args);
         callbacks.sendMessage('reportTelemetry', request, false);
       },
 
-      userInput: function userInput() {
-        callbacks.sendMessage('userInput', null, true);
+      setupGfxComBridge: function (gfxWindow) {
+        // Creates ShumwayCom adapter for the gfx iframe exposing only subset
+        // of the privileged function. Removing Xrays to setup the ShumwayCom
+        // property and for usage as a sandbox for cloneInto operations.
+        var gfxContent = gfxWindow.contentWindow.wrappedJSObject;
+        ShumwayCom.createGfxAdapter(gfxContent, callbacks, hooks);
+
+        setupUserInput(gfxWindow.contentWindow, callbacks);
       },
 
-      setupComBridge: function setupComBridge(playerWindow) {
-        // postSyncMessage helper function to relay messages from the secondary
-        // window to the primary one.
-        function postSyncMessage(msg) {
-          if (onSyncMessageCallback) {
-            // the msg came from other content window
-            // waiveXrays are used due to bug 1150771.
-            var reclonedMsg = Components.utils.cloneInto(Components.utils.waiveXrays(msg), content);
-            var result = onSyncMessageCallback(reclonedMsg);
-            // the result will be sent later to other content window
-            var waivedResult = Components.utils.waiveXrays(result);
-            return waivedResult;
-          }
-        }
-
-        // Creates secondary ShumwayCom adapter.
+      setupPlayerComBridge: function (playerWindow) {
+        // Creates ShumwayCom adapter for the player iframe exposing only subset
+        // of the privileged function. Removing Xrays to setup the ShumwayCom
+        // property and for usage as a sandbox for cloneInto operations.
         var playerContent = playerWindow.contentWindow.wrappedJSObject;
-        ShumwayCom.createPlayerAdapter(playerContent, postSyncMessage, callbacks, hooks);
-      },
-
-      setSyncMessageCallback: function (callback) {
-        if (callback !== null && typeof callback !== 'function') {
-          return;
-        }
-        onSyncMessageCallback = callback;
+        ShumwayCom.createPlayerAdapter(playerContent, callbacks, hooks);
       }
     };
 
-    var onSyncMessageCallback = null;
-
     var shumwayComAdapter = Components.utils.cloneInto(wrapped, content, {cloneFunctions:true});
     content.ShumwayCom = shumwayComAdapter;
   },
 
-  createPlayerAdapter: function (content, postSyncMessage, callbacks, hooks) {
+  createGfxAdapter: function (content, callbacks, hooks) {
     // Exposing ShumwayCom object/adapter to the unprivileged content -- setting
     // up Xray wrappers.
     var wrapped = {
-      externalCom: function externalCom(args) {
+      environment: ShumwayCom.environment,
+
+      setFullscreen: function (value) {
+        value = !!value;
+        callbacks.sendMessage('setFullscreen', value, false);
+      },
+
+      reportTelemetry: function (args) {
+        var request = sanitizeTelemetryArgs(args);
+        callbacks.sendMessage('reportTelemetry', request, false);
+      },
+
+      postAsyncMessage: function (msg) {
+        if (hooks.onPlayerAsyncMessageCallback) {
+          hooks.onPlayerAsyncMessageCallback(msg);
+        }
+      },
+
+      setSyncMessageCallback: function (callback) {
+        if (typeof callback !== 'function') {
+          log('error: attempt to set non-callable as callback in setSyncMessageCallback');
+          return;
+        }
+        hooks.onGfxSyncMessageCallback = function (msg, sandbox) {
+          var reclonedMsg = cloneIntoFromContent(msg, content);
+          var result = callback(reclonedMsg);
+          return cloneIntoFromContent(result, sandbox);
+        };
+      },
+
+      setAsyncMessageCallback: function (callback) {
+        if (typeof callback !== 'function') {
+          log('error: attempt to set non-callable as callback in setAsyncMessageCallback');
+          return;
+        }
+        hooks.onGfxAsyncMessageCallback = function (msg) {
+          var reclonedMsg = cloneIntoFromContent(msg, content);
+          callback(reclonedMsg);
+        };
+      }
+    };
+    
+    if (ShumwayCom.environment === ShumwayEnvironment.TEST) {
+      wrapped.processFrame = function () {
+        callbacks.sendMessage('processFrame');
+      };
+      
+      wrapped.processFSCommand = function (command, args) {
+        callbacks.sendMessage('processFSCommand', command, args);
+      };
+      
+      wrapped.setScreenShotCallback = function (callback) {
+        callbacks.sendMessage('setScreenShotCallback', callback);
+      };
+    }
+
+    var shumwayComAdapter = Components.utils.cloneInto(wrapped, content, {cloneFunctions:true});
+    content.ShumwayCom = shumwayComAdapter;
+  },
+
+  createPlayerAdapter: function (content, callbacks, hooks) {
+    // Exposing ShumwayCom object/adapter to the unprivileged content -- setting
+    // up Xray wrappers.
+    var wrapped = {
+      environment: ShumwayCom.environment,
+    
+      externalCom: function (args) {
         var request = sanitizeExternalComArgs(args);
         var result = String(callbacks.sendMessage('externalCom', request, true));
         return result;
       },
 
-      loadFile: function loadFile(args) {
+      loadFile: function (args) {
         var request = sanitizeLoadFileArgs(args);
         callbacks.sendMessage('loadFile', request, false);
       },
 
-      reportTelemetry: function reportTelemetry(args) {
+      abortLoad: function (sessionId) {
+        sessionId = sessionId|0;
+        callbacks.sendMessage('abortLoad', sessionId, false);
+      },
+
+      reportTelemetry: function (args) {
         var request = sanitizeTelemetryArgs(args);
         callbacks.sendMessage('reportTelemetry', request, false);
       },
 
-      setClipboard: function setClipboard(args) {
+      setClipboard: function (args) {
         if (typeof args !== 'string') {
           return; // ignore non-string argument
         }
         callbacks.sendMessage('setClipboard', args, false);
       },
 
-      navigateTo: function navigateTo(args) {
+      navigateTo: function (args) {
         var request = {
           url: String(args.url || ''),
           target: String(args.target || '')
         };
         callbacks.sendMessage('navigateTo', request, false);
       },
 
-      loadSystemResource: function loadSystemResource(id) {
+      loadSystemResource: function (id) {
         loadShumwaySystemResource(id).then(function (data) {
           if (onSystemResourceCallback) {
             onSystemResourceCallback(id, Components.utils.cloneInto(data, content));
           }
         });
       },
 
-      postSyncMessage: function (msg) {
-        var result = postSyncMessage(msg);
-        return Components.utils.cloneInto(result, content)
+      sendSyncMessage: function (msg) {
+        var result;
+        if (hooks.onGfxSyncMessageCallback) {
+          result = hooks.onGfxSyncMessageCallback(msg, content);
+        }
+        return result;
+      },
+
+      postAsyncMessage: function (msg) {
+        if (hooks.onGfxAsyncMessageCallback) {
+          hooks.onGfxAsyncMessageCallback(msg);
+        }
+      },
+
+      setAsyncMessageCallback: function (callback) {
+        if (typeof callback !== 'function') {
+          log('error: attempt to set non-callable as callback in setAsyncMessageCallback');
+          return;
+        }
+        hooks.onPlayerAsyncMessageCallback = function (msg) {
+          var reclonedMsg = cloneIntoFromContent(msg, content);
+          callback(reclonedMsg);
+        };
       },
 
       createSpecialStorage: function () {
         var environment = callbacks.getEnvironment();
         return SpecialStorageUtils.createWrappedSpecialStorage(content,
           environment.swfUrl, environment.privateBrowsing);
       },
 
@@ -262,16 +369,24 @@ var ShumwayCom = {
         }
         onExternalCallback = callback;
       },
       setSystemResourceCallback: function (callback) {
         if (callback !== null && typeof callback !== 'function') {
           return;
         }
         onSystemResourceCallback = callback;
+      },
+
+      getLocalConnectionService: function() {
+        if (!wrappedLocalConnectionService) {
+          wrappedLocalConnectionService = new LocalConnectionService(content,
+                                                                     callbacks.getEnvironment());
+        }
+        return wrappedLocalConnectionService;
       }
     };
 
     // Exposing createSpecialInflate function for DEFLATE stream decoding using
     // Gecko API.
     if (SpecialInflateUtils.isSpecialInflateEnabled) {
       wrapped.createSpecialInflate = function () {
         return SpecialInflateUtils.createWrappedSpecialInflate(content);
@@ -284,20 +399,28 @@ var ShumwayCom = {
       wrapped.createRtmpSocket = function (params) {
         return RtmpUtils.createSocket(content, params);
       };
       wrapped.createRtmpXHR = function () {
         return RtmpUtils.createXHR(content);
       };
     }
 
+    if (ShumwayCom.environment === ShumwayEnvironment.TEST) {
+      wrapped.print = function(msg) {
+        callbacks.sendMessage('print', msg);
+      }
+    }
+
     var onSystemResourceCallback = null;
     var onExternalCallback = null;
     var onLoadFileCallback = null;
 
+    var wrappedLocalConnectionService = null;
+
     hooks.onLoadFileCallback = function (arg) {
       if (onLoadFileCallback) {
         onLoadFileCallback(Components.utils.cloneInto(arg, content));
       }
     };
     hooks.onExternalCallback = function (call) {
       if (onExternalCallback) {
         return onExternalCallback(Components.utils.cloneInto(call, content));
@@ -341,38 +464,50 @@ function loadShumwaySystemResource(id) {
   xhr.onload = function () {
     deferred.resolve(xhr.response);
   };
   xhr.send(null);
 
   return deferred.promise;
 }
 
+function setupUserInput(contentWindow, callbacks) {
+  function notifyUserInput() {
+    callbacks.sendMessage('userInput', null, true);
+  }
+
+  // Ignoring the untrusted events by providing the 4th argument for addEventListener.
+  contentWindow.document.addEventListener('mousedown', notifyUserInput, true, false);
+  contentWindow.document.addEventListener('mouseup', notifyUserInput, true, false);
+  contentWindow.document.addEventListener('keydown', notifyUserInput, true, false);
+  contentWindow.document.addEventListener('keyup', notifyUserInput, true, false);
+}
+
 // All the privileged actions.
 function ShumwayChromeActions(startupInfo, window, document) {
   this.url = startupInfo.url;
   this.objectParams = startupInfo.objectParams;
   this.movieParams = startupInfo.movieParams;
   this.baseUrl = startupInfo.baseUrl;
   this.isOverlay = startupInfo.isOverlay;
   this.embedTag = startupInfo.embedTag;
   this.isPausedAtStart = startupInfo.isPausedAtStart;
+  this.initStartTime = startupInfo.initStartTime;
   this.window = window;
   this.document = document;
   this.allowScriptAccess = startupInfo.allowScriptAccess;
   this.lastUserInput = 0;
   this.telemetry = {
     startTime: Date.now(),
     features: [],
     errors: []
   };
 
-  this.fileLoader = new FileLoader(startupInfo.url, startupInfo.baseUrl, function (args) {
-    this.onLoadFileCallback(args);
-  }.bind(this));
+  this.fileLoader = new FileLoader(startupInfo.url, startupInfo.baseUrl, startupInfo.refererUrl,
+    function (args) { this.onLoadFileCallback(args); }.bind(this));
   this.onLoadFileCallback = null;
 
   this.externalInterface = null;
   this.onExternalCallback = null;
 }
 
 ShumwayChromeActions.prototype = {
   // The method is created for convenience of routing messages from the OOP
@@ -395,38 +530,42 @@ ShumwayChromeActions.prototype = {
       compilerSettings: {
         appCompiler: getBoolPref('shumway.appCompiler', true),
         sysCompiler: getBoolPref('shumway.sysCompiler', false),
         verifier: getBoolPref('shumway.verifier', true)
       },
       playerSettings: {
         turboMode: getBoolPref('shumway.turboMode', false),
         hud: getBoolPref('shumway.hud', false),
-        forceHidpi: getBoolPref('shumway.force_hidpi', false),
-        env: getCharPref('shumway.environment', 'dev')
+        forceHidpi: getBoolPref('shumway.force_hidpi', false)
       }
     }
   },
 
   getPluginParams: function getPluginParams() {
     return {
       url: this.url,
       baseUrl : this.baseUrl,
       movieParams: this.movieParams,
       objectParams: this.objectParams,
       isOverlay: this.isOverlay,
       isPausedAtStart: this.isPausedAtStart,
+      initStartTime: this.initStartTime,
       isDebuggerEnabled: getBoolPref('shumway.debug.enabled', false)
     };
   },
 
   loadFile: function loadFile(data) {
     this.fileLoader.load(data);
   },
 
+  abortLoad: function abortLoad(sessionId) {
+    this.fileLoader.abort(sessionId);
+  },
+
   navigateTo: function (data) {
     // Our restrictions are a little bit different from Flash's: let's enable
     // only http(s) and only when script execution is allowed.
     // See https://helpx.adobe.com/flash/kb/control-access-scripts-host-web.html
     var url = data.url || 'about:blank';
     var target = data.target || '_self';
     var isWhitelistedProtocol = /^(http|https):\/\//i.test(url);
     if (!isWhitelistedProtocol || !this.allowScriptAccess) {
@@ -446,30 +585,21 @@ ShumwayChromeActions.prototype = {
     var event = this.document.createEvent('CustomEvent');
     event.initCustomEvent('shumwayFallback', true, true, {
       automatic: automatic
     });
     this.window.dispatchEvent(event);
   },
 
   userInput: function() {
-    var win = this.window;
-    var winUtils = win.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
-                      .getInterface(Components.interfaces.nsIDOMWindowUtils);
-    if (winUtils.isHandlingUserInput) {
-      this.lastUserInput = Date.now();
-    }
+    // Recording time of last user input for isUserInputInProgress below.
+    this.lastUserInput = Date.now();
   },
 
   isUserInputInProgress: function () {
-    // TODO userInput does not work for OOP
-    if (!getBoolPref('shumway.userInputSecurity', true)) {
-      return true;
-    }
-
     // We don't trust our Shumway non-privileged code just yet to verify the
     // user input -- using userInput function above to track that.
     if ((Date.now() - this.lastUserInput) > MAX_USER_INPUT_TIMEOUT) {
       return false;
     }
     // TODO other security checks?
     return true;
   },
@@ -510,16 +640,23 @@ ShumwayChromeActions.prototype = {
         var featureType = request.featureType;
         var MIN_FEATURE_TYPE = 0, MAX_FEATURE_TYPE = 999;
         if (featureType >= MIN_FEATURE_TYPE && featureType <= MAX_FEATURE_TYPE &&
           !this.telemetry.features[featureType]) {
           this.telemetry.features[featureType] = true; // record only one feature per SWF
           ShumwayTelemetry.onFeature(featureType);
         }
         break;
+      case 'loadResource':
+        var resultType = request.resultType;
+        var MIN_RESULT_TYPE = 0, MAX_RESULT_TYPE = 10;
+        if (resultType >= MIN_RESULT_TYPE && resultType <= MAX_RESULT_TYPE) {
+          ShumwayTelemetry.onLoadResource(resultType);
+        }
+        break;
       case 'error':
         var errorType = request.errorType;
         var MIN_ERROR_TYPE = 0, MAX_ERROR_TYPE = 2;
         if (errorType >= MIN_ERROR_TYPE && errorType <= MAX_ERROR_TYPE &&
           !this.telemetry.errors[errorType]) {
           this.telemetry.errors[errorType] = true; // record only one report per SWF
           ShumwayTelemetry.onError(errorType);
         }
@@ -562,16 +699,45 @@ ShumwayChromeActions.prototype = {
       var parentWindow = this.window.parent; // host page -- parent of PlayPreview frame
       var embedTag = this.embedTag;
       this.externalInterface = new ExternalInterface(parentWindow, embedTag, function (call) {
         return this.onExternalCallback(call);
       }.bind(this));
     }
 
     return this.externalInterface.processAction(data);
+  },
+  
+  postMessage: function (type, data) {
+    var embedTag = this.embedTag;
+    var event = embedTag.ownerDocument.createEvent('CustomEvent');
+    var detail = Components.utils.cloneInto({ type: type, data: data }, embedTag.ownerDocument.wrappedJSObject);
+    event.initCustomEvent('message', false, false, detail);
+    embedTag.dispatchEvent(event);
+  },
+  
+  processFrame: function () {
+    this.postMessage('processFrame');
+  },
+
+  processFSCommand: function (command, data) {
+    this.postMessage('processFSCommand', { command: command, data: data });
+  },
+
+  print: function (msg) {
+    this.postMessage('print', msg);
+  },
+
+  setScreenShotCallback: function (callback) {
+    var embedTag = this.embedTag;
+    Components.utils.exportFunction(function () {
+      // `callback` can be wrapped in a CPOW and thus cause a slow synchronous cross-process operation.
+      var result = callback();
+      return Components.utils.cloneInto(result, embedTag.ownerDocument);
+    }, embedTag.wrappedJSObject, {defineAs: 'getCanvasData'});
   }
 };
 
 function getVersionInfo() {
   var deferred = Promise.defer();
   var versionInfo = {
     geckoVersion: 'unknown',
     geckoBuildID: 'unknown',
new file mode 100644
--- /dev/null
+++ b/browser/extensions/shumway/chrome/StartupInfo.jsm
@@ -0,0 +1,186 @@
+/*
+ * Copyright 2015 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var EXPORTED_SYMBOLS = ['getStartupInfo', 'parseQueryString', 'isContentWindowPrivate'];
+
+Components.utils.import('resource://gre/modules/XPCOMUtils.jsm');
+Components.utils.import('resource://gre/modules/Services.jsm');
+
+Components.utils.import('chrome://shumway/content/ShumwayCom.jsm');
+
+XPCOMUtils.defineLazyModuleGetter(this, 'PrivateBrowsingUtils',
+  'resource://gre/modules/PrivateBrowsingUtils.jsm');
+
+function flashUnescape(s) {
+  return decodeURIComponent(s.split('+').join(' '));
+}
+
+function parseQueryString(qs) {
+  if (!qs)
+    return {};
+
+  if (qs.charAt(0) == '?')
+    qs = qs.slice(1);
+
+  var values = qs.split('&');
+  var obj = {};
+  for (var i = 0; i < values.length; i++) {
+    var pair = values[i], j = pair.indexOf('=');
+    if (j < 0) {
+      continue; // skipping invalid values
+    }
+    var key = pair.substring(0, j), value = pair.substring(j + 1);
+    obj[flashUnescape(key)] = flashUnescape(value);
+  }
+
+  return obj;
+}
+
+function isContentWindowPrivate(win) {
+  if (!('isContentWindowPrivate' in PrivateBrowsingUtils)) {
+    return PrivateBrowsingUtils.isWindowPrivate(win);
+  }
+  return PrivateBrowsingUtils.isContentWindowPrivate(win);
+}
+
+function isStandardEmbedWrapper(embedElement) {
+  try {
+    if (embedElement.tagName !== 'EMBED') {
+      return false;
+    }
+    var swfUrl = embedElement.src;
+    var document = embedElement.ownerDocument;
+    var docUrl = document.location.href;
+    if (swfUrl !== docUrl) {
+      return false; // document URL shall match embed src
+    }
+    if (document.body.children.length !== 1 ||
+      document.body.firstChild !== embedElement) {
+      return false; // not the only child
+    }
+    if (document.defaultView.top !== document.defaultView) {
+      return false; // not a top window
+    }
+    // Looks like a standard wrapper
+    return true;
+  } catch (e) {
+    // Declare that is not a standard fullscreen plugin wrapper for any error
+    return false;
+  }
+}
+
+function isScriptAllowed(allowScriptAccessParameter, url, pageUrl) {
+  if (!allowScriptAccessParameter) {
+    allowScriptAccessParameter = 'sameDomain';
+  }
+  var allowScriptAccess = false;
+  switch (allowScriptAccessParameter.toLowerCase()) { // ignoring case here
+    case 'always':
+      allowScriptAccess = true;
+      break;
+    case 'never':
+      allowScriptAccess = false;
+      break;
+    default: // 'samedomain'
+      if (!pageUrl)
+        break;
+      try {
+        // checking if page is in same domain (? same protocol and port)
+        allowScriptAccess =
+          Services.io.newURI('/', null, Services.io.newURI(pageUrl, null, null)).spec ==
+          Services.io.newURI('/', null, Services.io.newURI(url, null, null)).spec;
+      } catch (ex) {}
+      break;
+  }
+  return allowScriptAccess;
+}
+
+function getStartupInfo(element) {
+  var initStartTime = Date.now();
+  var baseUrl;
+  var pageUrl;
+  var isOverlay = false;
+  var objectParams = {};
+
+  // Getting absolute URL from the EMBED tag
+  var url = element.srcURI && element.srcURI.spec;
+
+  pageUrl = element.ownerDocument.location.href; // proper page url?
+
+  var tagName = element.nodeName;
+  if (tagName == 'EMBED') {
+    for (var i = 0; i < element.attributes.length; ++i) {
+      var paramName = element.attributes[i].localName.toLowerCase();
+      objectParams[paramName] = element.attributes[i].value;
+    }
+  } else {
+    for (var i = 0; i < element.childNodes.length; ++i) {
+      var paramElement = element.childNodes[i];
+      if (paramElement.nodeType != 1 ||
+        paramElement.nodeName != 'PARAM') {
+        continue;
+      }
+      var paramName = paramElement.getAttribute('name').toLowerCase();
+      objectParams[paramName] = paramElement.getAttribute('value');
+    }
+  }
+
+  baseUrl = pageUrl;
+  if (objectParams.base) {
+    try {
+      // Verifying base URL, passed in object parameters. It shall be okay to
+      // ignore bad/corrupted base.
+      var parsedPageUrl = Services.io.newURI(pageUrl, null, null);
+      baseUrl = Services.io.newURI(objectParams.base, null, parsedPageUrl).spec;
+    } catch (e) { /* it's okay to ignore any exception */ }
+  }
+
+  var movieParams = {};
+  if (objectParams.flashvars) {
+    movieParams = parseQueryString(objectParams.flashvars);
+  }
+  var queryStringMatch = url && /\?([^#]+)/.exec(url);
+  if (queryStringMatch) {
+    var queryStringParams = parseQueryString(queryStringMatch[1]);
+    for (var i in queryStringParams) {
+      if (!(i in movieParams)) {
+        movieParams[i] = queryStringParams[i];
+      }
+    }
+  }
+
+  var allowScriptAccess = !!url &&
+    isScriptAllowed(objectParams.allowscriptaccess, url, pageUrl);
+  var isFullscreenSwf = isStandardEmbedWrapper(element);
+
+  var document = element.ownerDocument;
+  var window = document.defaultView;
+
+  var startupInfo = {};
+  startupInfo.window = window;
+  startupInfo.url = url;
+  startupInfo.privateBrowsing = isContentWindowPrivate(window);
+  startupInfo.objectParams = objectParams;
+  startupInfo.movieParams = movieParams;
+  startupInfo.baseUrl = baseUrl || url;
+  startupInfo.isOverlay = isOverlay;
+  startupInfo.refererUrl = !isFullscreenSwf ? baseUrl : null;
+  startupInfo.embedTag = element;
+  startupInfo.initStartTime = initStartTime;
+  startupInfo.allowScriptAccess = allowScriptAccess;
+  startupInfo.pageIndex = 0;
+  return startupInfo;
+}
new file mode 100644
--- /dev/null
+++ b/browser/extensions/shumway/chrome/content.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<!--
+Copyright 2015 Mozilla Foundation
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+
+  <style>
+    html, body {
+      margin: 0;
+      padding: 0;
+      width: 100%;
+      height: 100%;
+      overflow: hidden;
+      background-color: transparent;
+    }
+
+    iframe {
+      position:fixed !important;
+      left:0;top:0;bottom:0;right:0;
+      overflow: hidden;
+      line-height: 0;
+      border: 0px none;
+    }
+
+    body.remoteStopped {
+      background-color: red;
+    }
+    body.remoteDebug {
+      background-color: green;
+    }
+    body.remoteReload {
+      background-color: yellow;
+    }
+  </style>
+</head>
+
+<body>
+  <iframe id="viewer" src="resource://shumway/web/viewer.html" width="100%" height="100%"></iframe>
+  <script src="chrome://shumway/content/content.js"></script>
+</body>
+</html>
--- a/browser/extensions/shumway/chrome/content.js
+++ b/browser/extensions/shumway/chrome/content.js
@@ -1,68 +1,95 @@
 /*
- * Copyright 2014 Mozilla Foundation
+ * Copyright 2015 Mozilla Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 
 Components.utils.import('resource://gre/modules/Services.jsm');
+Components.utils.import('resource://gre/modules/Promise.jsm');
+
 Components.utils.import('chrome://shumway/content/ShumwayCom.jsm');
 
+var messageManager, viewerReady;
+// Checking if we loading content.js in the OOP/mozbrowser or jsplugins.
+// TODO remove mozbrowser logic when we switch to jsplugins only support
+if (typeof document === 'undefined') { // mozbrowser OOP frame script
+  messageManager = this;
+  viewerReady = Promise.resolve(content);
+  messageManager.sendAsyncMessage('Shumway:constructed', null);
+} else { // jsplugins instance
+  messageManager = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+                .getInterface(Components.interfaces.nsIDocShell)
+                .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+                .getInterface(Components.interfaces.nsIContentFrameMessageManager);
+
+  var viewer = document.getElementById('viewer');
+  viewerReady = new Promise(function (resolve) {
+    viewer.addEventListener('load', function () {
+      messageManager.sendAsyncMessage('Shumway:constructed', null);
+      resolve(viewer.contentWindow);
+    });
+  });
+}
+
+
 var externalInterfaceWrapper = {
   callback: function (call) {
     if (!shumwayComAdapterHooks.onExternalCallback) {
       return undefined;
     }
     return shumwayComAdapterHooks.onExternalCallback(
       Components.utils.cloneInto(JSON.parse(call), content));
   }
 };
 
 var shumwayComAdapterHooks = {};
 
 function sendMessage(action, data, sync) {
   var detail = {action: action, data: data, sync: sync};
   if (!sync) {
-    sendAsyncMessage('Shumway:message', detail);
+    messageManager.sendAsyncMessage('Shumway:message', detail);
     return;
   }
-  var result = String(sendSyncMessage('Shumway:message', detail));
+  var result = String(messageManager.sendSyncMessage('Shumway:message', detail));
   result = result == 'undefined' ? undefined : JSON.parse(result);
   return Components.utils.cloneInto(result, content);
 }
 
 function enableDebug() {
-  sendAsyncMessage('Shumway:enableDebug', null);
+  messageManager.sendAsyncMessage('Shumway:enableDebug', null);
 }
 
-addMessageListener('Shumway:init', function (message) {
+messageManager.addMessageListener('Shumway:init', function (message) {
   var environment = message.data;
 
-  sendAsyncMessage('Shumway:running', {}, {
+  messageManager.sendAsyncMessage('Shumway:running', {}, {
     externalInterface: externalInterfaceWrapper
   });
 
-  ShumwayCom.createAdapter(content.wrappedJSObject, {
-    sendMessage: sendMessage,
-    enableDebug: enableDebug,
-    getEnvironment: function () { return environment; }
-  }, shumwayComAdapterHooks);
+  viewerReady.then(function (viewerWindow) {
+    ShumwayCom.createAdapter(viewerWindow.wrappedJSObject, {
+      sendMessage: sendMessage,
+      enableDebug: enableDebug,
+      getEnvironment: function () { return environment; }
+    }, shumwayComAdapterHooks);
 
-  content.wrappedJSObject.runViewer();
+    viewerWindow.wrappedJSObject.runViewer();
+  });
 });
 
-addMessageListener('Shumway:loadFile', function (message) {
+messageManager.addMessageListener('Shumway:loadFile', function (message) {
   if (!shumwayComAdapterHooks.onLoadFileCallback) {
     return;
   }
   shumwayComAdapterHooks.onLoadFileCallback(Components.utils.cloneInto(message.data, content));
 });
new file mode 100644
--- /dev/null
+++ b/browser/extensions/shumway/chrome/plugin.js
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2015 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+Components.utils.import('resource://gre/modules/XPCOMUtils.jsm');
+Components.utils.import('resource://gre/modules/Services.jsm');
+Components.utils.import('resource://gre/modules/Promise.jsm');
+
+Components.utils.import('chrome://shumway/content/StartupInfo.jsm');
+Components.utils.import('chrome://shumway/content/ShumwayCom.jsm');
+
+XPCOMUtils.defineLazyModuleGetter(this, 'PrivateBrowsingUtils',
+  'resource://gre/modules/PrivateBrowsingUtils.jsm');
+
+function log(str) {
+  var msg = 'plugin.js: ' + str;
+  Services.console.logStringMessage(msg);
+  dump(msg + '\n');
+}
+
+function runViewer() {
+  function handlerOOP() {
+    var frameLoader = pluginElement.frameLoader;
+    var messageManager = frameLoader.messageManager;
+
+    var externalInterface;
+
+    messageManager.addMessageListener('Shumway:running', function (message) {
+      externalInterface = message.objects.externalInterface;
+    });
+
+    messageManager.addMessageListener('Shumway:message', function (message) {
+      var data = message.data;
+      var result = shumwayActions.invoke(data.action, data.data);
+      if (message.sync) {
+        return result === undefined ? 'undefined' : JSON.stringify(result);
+      }
+    });
+
+    messageManager.addMessageListener('Shumway:enableDebug', function (message) {
+      enableDebug();
+    });
+
+    shumwayActions.onExternalCallback = function (call) {
+      return externalInterface.callback(JSON.stringify(call));
+    };
+
+    shumwayActions.onLoadFileCallback = function (args) {
+      messageManager.sendAsyncMessage('Shumway:loadFile', args);
+    };
+
+    messageManager.addMessageListener('Shumway:constructed', function (message) {
+      messageManager.sendAsyncMessage('Shumway:init', getEnvironment());
+    });
+  }
+
+  function getEnvironment() {
+    return {
+      swfUrl: startupInfo.url,
+      privateBrowsing: startupInfo.privateBrowsing
+    };
+  }
+
+  function enableDebug() {
+    DebugUtils.enableDebug(startupInfo.url);
+    setTimeout(function () {
+      // TODO fix plugin instance reloading for jsplugins
+    }, 1000);
+  }
+
+  var startupInfo = getStartupInfo(pluginElement);
+  if (!startupInfo.url) {
+    // Special case when movie URL is not specified, e.g. swfobject
+    // checks only version. No need to instantiate the flash plugin.
+    if (startupInfo.embedTag) {
+      setupSimpleExternalInterface(startupInfo.embedTag);
+    }
+    return;
+  }
+
+  var document = pluginElement.ownerDocument;
+  var window = document.defaultView;
+  var shumwayActions = ShumwayCom.createActions(startupInfo, window, document);
+
+  handlerOOP();
+
+  // TODO fix remote debugging for jsplugins
+}
+
+function setupSimpleExternalInterface(embedTag) {
+  Components.utils.exportFunction(function (variable) {
+    switch (variable) {
+      case '$version':
+        return 'SHUMWAY 10,0,0';
+      default:
+        log('Unsupported GetVariable() call: ' + variable);
+        return undefined;
+    }
+  }, embedTag.wrappedJSObject, {defineAs: 'GetVariable'});
+}
+
+runViewer();
+
--- a/browser/extensions/shumway/content/ShumwayBootstrapUtils.jsm
+++ b/browser/extensions/shumway/content/ShumwayBootstrapUtils.jsm
@@ -1,10 +1,10 @@
 /*
- * Copyright 2014 Mozilla Foundation
+ * Copyright 2015 Mozilla Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
@@ -17,29 +17,27 @@
 'use strict';
 
 var EXPORTED_SYMBOLS = ['ShumwayBootstrapUtils'];
 
 const PREF_PREFIX = 'shumway.';
 const PREF_IGNORE_CTP = PREF_PREFIX + 'ignoreCTP';
 const PREF_WHITELIST = PREF_PREFIX + 'swf.whitelist';
 const SWF_CONTENT_TYPE = 'application/x-shockwave-flash';
+const PLUGIN_HANLDER_URI = 'chrome://shumway/content/content.html';
 
 let Cc = Components.classes;
 let Ci = Components.interfaces;
 let Cm = Components.manager;
 let Cu = Components.utils;
 
 Cu.import('resource://gre/modules/XPCOMUtils.jsm');
 Cu.import('resource://gre/modules/Services.jsm');
 
-Cu.import('resource://shumway/ShumwayStreamConverter.jsm');
-
 let Ph = Cc["@mozilla.org/plugin/host;1"].getService(Ci.nsIPluginHost);
-let registerOverlayPreview = 'registerPlayPreviewMimeType' in Ph;
 
 function getBoolPref(pref, def) {
   try {
     return Services.prefs.getBoolPref(pref);
   } catch (ex) {
     return def;
   }
 }
@@ -50,16 +48,17 @@ function getStringPref(pref, def) {
   } catch (ex) {
     return def;
   }
 }
 
 function log(str) {
   var msg = 'ShumwayBootstrapUtils.jsm: ' + str;
   Services.console.logStringMessage(msg);
+  dump(msg + '\n');
 }
 
 // Register/unregister a constructor as a factory.
 function Factory() {}
 Factory.prototype = {
   register: function register(targetConstructor) {
     var proto = targetConstructor.prototype;
     this._classID = proto.classID;
@@ -73,70 +72,103 @@ Factory.prototype = {
   },
 
   unregister: function unregister() {
     var registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);
     registrar.unregisterFactory(this._classID, this._factory);
   }
 };
 
-let converterFactory = new Factory();
-let overlayConverterFactory = new Factory();
-
 function allowedPlatformForMedia() {
   var oscpu = Cc["@mozilla.org/network/protocol;1?name=http"]
                 .getService(Ci.nsIHttpProtocolHandler).oscpu;
   if (oscpu.indexOf('Windows NT') === 0) {
     return oscpu.indexOf('Windows NT 5') < 0; // excluding Windows XP
   }
   if (oscpu.indexOf('Intel Mac OS X') === 0) {
     return true;
   }
   // Other platforms are not supported yet.
   return false;
 }
 
 var ShumwayBootstrapUtils = {
   isRegistered: false,
+  isJSPluginsSupported: false,
 
   register: function () {
     if (this.isRegistered) {
       return;
     }
 
     this.isRegistered = true;
 
     // Register the components.
-    converterFactory.register(ShumwayStreamConverter);
-    overlayConverterFactory.register(ShumwayStreamOverlayConverter);
+    this.isJSPluginsSupported = !!Ph.registerFakePlugin &&
+                                getBoolPref('shumway.jsplugins', false);
+
+    if (this.isJSPluginsSupported) {
+      let initPluginDict = {
+        handlerURI: PLUGIN_HANLDER_URI,
+        mimeEntries: [
+          {
+            type: SWF_CONTENT_TYPE,
+            description: 'Shockwave Flash',
+            extension: 'swf'
+          }
+        ],
+        niceName: 'Shumway plugin',
+        name: 'Shumway',
+        supersedeExisting: true, // TODO verify when jsplugins (bug 558184) is implemented
+        sandboxScript: 'chrome://shumway/content/plugin.js', // TODO verify when jsplugins (bug 558184) is implemented
+        version: '10.0.0.0'
+      };
+      Ph.registerFakePlugin(initPluginDict);
+    } else {
+      Cu.import('resource://shumway/ShumwayStreamConverter.jsm');
 
-    if (registerOverlayPreview) {
-      var ignoreCTP = getBoolPref(PREF_IGNORE_CTP, true);
-      var whitelist = getStringPref(PREF_WHITELIST);
-      // Some platforms cannot support video playback, and our whitelist targets
-      // only video players atm. We need to disable Shumway for those platforms.
-      if (whitelist && !Services.prefs.prefHasUserValue(PREF_WHITELIST) &&
-          !allowedPlatformForMedia()) {
-        log('Default SWF whitelist is used on an unsupported platform -- ' +
-            'using demo whitelist.');
-        whitelist = 'http://www.areweflashyet.com/*.swf';
+      let converterFactory = new Factory();
+      converterFactory.register(ShumwayStreamConverter);
+      this.converterFactory = converterFactory;
+      let overlayConverterFactory = new Factory();
+      overlayConverterFactory.register(ShumwayStreamOverlayConverter);
+      this.overlayConverterFactory = overlayConverterFactory;
+
+      let registerOverlayPreview = 'registerPlayPreviewMimeType' in Ph;
+      if (registerOverlayPreview) {
+        var ignoreCTP = getBoolPref(PREF_IGNORE_CTP, true);
+        var whitelist = getStringPref(PREF_WHITELIST);
+        // Some platforms cannot support video playback, and our whitelist targets
+        // only video players atm. We need to disable Shumway for those platforms.
+        if (whitelist && !Services.prefs.prefHasUserValue(PREF_WHITELIST) && !allowedPlatformForMedia()) {
+          log('Default SWF whitelist is used on an unsupported platform -- ' +
+          'using demo whitelist.');
+          whitelist = 'http://www.areweflashyet.com/*.swf';
+        }
+        Ph.registerPlayPreviewMimeType(SWF_CONTENT_TYPE, ignoreCTP,
+          undefined, whitelist);
       }
-      Ph.registerPlayPreviewMimeType(SWF_CONTENT_TYPE, ignoreCTP,
-                                     undefined, whitelist);
+      this.registerOverlayPreview = registerOverlayPreview;
     }
   },
 
   unregister: function () {
     if (!this.isRegistered) {
       return;
     }
 
     this.isRegistered = false;
 
     // Remove the contract/component.
-    converterFactory.unregister();
-    overlayConverterFactory.unregister();
+    if (this.isJSPluginsSupported) {
+      Ph.unregisterFakePlugin(PLUGIN_HANLDER_URI);
+    } else {
+      this.converterFactory.unregister();
+      this.converterFactory = null;
+      this.overlayConverterFactory.unregister();
+      this.overlayConverterFactory = null;
 
-    if (registerOverlayPreview) {
-      Ph.unregisterPlayPreviewMimeType(SWF_CONTENT_TYPE);
+      if (this.registerOverlayPreview) {
+        Ph.unregisterPlayPreviewMimeType(SWF_CONTENT_TYPE);
+      }
     }
   }
 };
--- a/browser/extensions/shumway/content/ShumwayStreamConverter.jsm
+++ b/browser/extensions/shumway/content/ShumwayStreamConverter.jsm
@@ -1,10 +1,10 @@
 /*
- * Copyright 2013 Mozilla Foundation
+ * Copyright 2015 Mozilla Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
@@ -34,16 +34,18 @@ Cu.import('resource://gre/modules/XPCOMU
 Cu.import('resource://gre/modules/Services.jsm');
 
 XPCOMUtils.defineLazyModuleGetter(this, 'PrivateBrowsingUtils',
   'resource://gre/modules/PrivateBrowsingUtils.jsm');
 
 XPCOMUtils.defineLazyModuleGetter(this, 'ShumwayTelemetry',
   'resource://shumway/ShumwayTelemetry.jsm');
 
+Components.utils.import('chrome://shumway/content/StartupInfo.jsm');
+
 function getBoolPref(pref, def) {
   try {
     return Services.prefs.getBoolPref(pref);
   } catch (ex) {
     return def;
   }
 }
 
@@ -55,41 +57,16 @@ function log(aMsg) {
 
 function getDOMWindow(aChannel) {
   var requestor = aChannel.notificationCallbacks ||
                   aChannel.loadGroup.notificationCallbacks;
   var win = requestor.getInterface(Components.interfaces.nsIDOMWindow);
   return win;
 }
 
-function parseQueryString(qs) {
-  if (!qs)
-    return {};
-
-  if (qs.charAt(0) == '?')
-    qs = qs.slice(1);
-
-  var values = qs.split('&');
-  var obj = {};
-  for (var i = 0; i < values.length; i++) {
-    var kv = values[i].split('=');
-    var key = kv[0], value = kv[1];
-    obj[decodeURIComponent(key)] = decodeURIComponent(value);
-  }
-
-  return obj;
-}
-
-function isContentWindowPrivate(win) {
-  if (!('isContentWindowPrivate' in PrivateBrowsingUtils)) {
-    return PrivateBrowsingUtils.isWindowPrivate(win);
-  }
-  return PrivateBrowsingUtils.isContentWindowPrivate(win);
-}
-
 function isShumwayEnabledFor(startupInfo) {
   // disabled for PrivateBrowsing windows
   if (isContentWindowPrivate(startupInfo.window) &&
       !getBoolPref('shumway.enableForPrivate', false)) {
     return false;
   }
   // disabled if embed tag specifies shumwaymode (for testing purpose)
   if (startupInfo.objectParams['shumwaymode'] === 'off') {
@@ -219,23 +196,20 @@ ShumwayStreamConverterBase.prototype = {
   convert: function(aFromStream, aFromType, aToType, aCtxt) {
     throw Cr.NS_ERROR_NOT_IMPLEMENTED;
   },
 
   getUrlHint: function(requestUrl) {
     return requestUrl.spec;
   },
 
-  getStartupInfo: function(window, urlHint) {
-    var url = urlHint;
-    var baseUrl;
-    var pageUrl;
+  getStartupInfo: function(window, url) {
+    var initStartTime = Date.now();
     var element = window.frameElement;
     var isOverlay = false;
-    var objectParams = {};
     if (element) {
       // PlayPreview overlay "belongs" to the embed/object tag and consists of
       // DIV and IFRAME. Starting from IFRAME and looking for first object tag.
       var tagName = element.nodeName, containerElement;
       while (tagName != 'EMBED' && tagName != 'OBJECT') {
         // plugin overlay skipping until the target plugin is found
         isOverlay = true;
         containerElement = element;
@@ -258,78 +232,50 @@ ShumwayStreamConverterBase.prototype = {
           if (element.children[i] === containerElement) {
             throw new Error('Plugin element is invalid');
           }
         }
       }
     }
 
     if (element) {
-      // Getting absolute URL from the EMBED tag
-      url = element.srcURI && element.srcURI.spec;
-
-      pageUrl = element.ownerDocument.location.href; // proper page url?
-
-      if (tagName == 'EMBED') {
-        for (var i = 0; i < element.attributes.length; ++i) {
-          var paramName = element.attributes[i].localName.toLowerCase();
-          objectParams[paramName] = element.attributes[i].value;
-        }
-      } else {
-        for (var i = 0; i < element.childNodes.length; ++i) {
-          var paramElement = element.childNodes[i];
-          if (paramElement.nodeType != 1 ||
-              paramElement.nodeName != 'PARAM') {
-            continue;
-          }
-          var paramName = paramElement.getAttribute('name').toLowerCase();
-          objectParams[paramName] = paramElement.getAttribute('value');
-        }
-      }
+      return getStartupInfo(element);
     }
 
-    baseUrl = pageUrl;
-    if (objectParams.base) {
-      try {
-        // Verifying base URL, passed in object parameters. It shall be okay to
-        // ignore bad/corrupted base.
-        var parsedPageUrl = Services.io.newURI(pageUrl);
-        baseUrl = Services.io.newURI(objectParams.base, null, parsedPageUrl).spec;
-      } catch (e) { /* it's okay to ignore any exception */ }
-    }
+    // Stream converter is used in top level window, just providing basic
+    // information about SWF.
 
+    var objectParams = {};
     var movieParams = {};
-    if (objectParams.flashvars) {
-      movieParams = parseQueryString(objectParams.flashvars);
-    }
     var queryStringMatch = url && /\?([^#]+)/.exec(url);
     if (queryStringMatch) {
       var queryStringParams = parseQueryString(queryStringMatch[1]);
       for (var i in queryStringParams) {
         if (!(i in movieParams)) {
           movieParams[i] = queryStringParams[i];
         }
       }
     }
 
-    var allowScriptAccess = !!url &&
-      isScriptAllowed(objectParams.allowscriptaccess, url, pageUrl);
-
+    // Using the same data structure as we return in StartupInfo.jsm and
+    // assigning constant values for fields that is not applicable for
+    // the stream converter when it is used in a top level window.
     var startupInfo = {};
     startupInfo.window = window;
     startupInfo.url = url;
     startupInfo.privateBrowsing = isContentWindowPrivate(window);
     startupInfo.objectParams = objectParams;
     startupInfo.movieParams = movieParams;
-    startupInfo.baseUrl = baseUrl || url;
-    startupInfo.isOverlay = isOverlay;
-    startupInfo.embedTag = element;
-    startupInfo.isPausedAtStart = /\bpaused=true$/.test(urlHint);
-    startupInfo.allowScriptAccess = allowScriptAccess;
-    startupInfo.pageIndex = 0;
+    startupInfo.baseUrl = url;
+    startupInfo.isOverlay = false;
+    startupInfo.refererUrl = null;
+    startupInfo.embedTag = null;
+    startupInfo.isPausedAtStart = /\bpaused=true$/.test(url);
+    startupInfo.initStartTime = initStartTime;
+    startupInfo.allowScriptAccess = false;
     return startupInfo;
   },
 
   // nsIStreamConverter::asyncConvertData
   asyncConvertData: function(aFromType, aToType, aListener, aCtxt) {
     // Store the listener passed to us
     this.listener = aListener;
   },
@@ -382,18 +328,17 @@ ShumwayStreamConverterBase.prototype = {
         listener.onDataAvailable(aRequest, context, inputStream, offset, count);
       },
       onStopRequest: function(request, context, statusCode) {
         // Cancel the request so the viewer can handle it.
         aRequest.resume();
         aRequest.cancel(Cr.NS_BINDING_ABORTED);
 
         var domWindow = getDOMWindow(channel);
-        let startupInfo = converter.getStartupInfo(domWindow,
-                                                   converter.getUrlHint(originalURI));
+        let startupInfo = converter.getStartupInfo(domWindow, converter.getUrlHint(originalURI));
 
         listener.onStopRequest(aRequest, context, statusCode);
 
         if (!startupInfo.url) {
           // Special case when movie URL is not specified, e.g. swfobject
           // checks only version. No need to instantiate the flash plugin.
           if (startupInfo.embedTag) {
             setupSimpleExternalInterface(startupInfo.embedTag);
@@ -441,42 +386,16 @@ function setupSimpleExternalInterface(em
         return 'SHUMWAY 10,0,0';
       default:
         log('Unsupported GetVariable() call: ' + variable);
         return undefined;
     }
   }, embedTag.wrappedJSObject, {defineAs: 'GetVariable'});
 }
 
-function isScriptAllowed(allowScriptAccessParameter, url, pageUrl) {
-  if (!allowScriptAccessParameter) {
-    allowScriptAccessParameter = 'sameDomain';
-  }
-  var allowScriptAccess = false;
-  switch (allowScriptAccessParameter.toLowerCase()) { // ignoring case here
-    case 'always':
-      allowScriptAccess = true;
-      break;
-    case 'never':
-      allowScriptAccess = false;
-      break;
-    default: // 'samedomain'
-      if (!pageUrl)
-        break;
-      try {
-        // checking if page is in same domain (? same protocol and port)
-        allowScriptAccess =
-          Services.io.newURI('/', null, Services.io.newURI(pageUrl, null, null)).spec ==
-          Services.io.newURI('/', null, Services.io.newURI(url, null, null)).spec;
-      } catch (ex) {}
-      break;
-  }
-  return allowScriptAccess;
-}
-
 // properties required for XPCOM registration:
 function copyProperties(obj, template) {
   for (var prop in template) {
     obj[prop] = template[prop];
   }
 }
 
 function ShumwayStreamConverter() {}
--- a/browser/extensions/shumway/content/ShumwayTelemetry.jsm
+++ b/browser/extensions/shumway/content/ShumwayTelemetry.jsm
@@ -59,13 +59,17 @@ this.ShumwayTelemetry = {
   onPageIndex: function (pageIndex) {
     var histogram = Services.telemetry.getHistogramById("SHUMWAY_SWF_INDEX_ON_PAGE");
     histogram.add(pageIndex);
   },
   onFeature: function (featureType) {
     var histogram = Services.telemetry.getHistogramById("SHUMWAY_FEATURE_USED");
     histogram.add(featureType);
   },
+  onLoadResource: function (resultType) {
+    var histogram = Services.telemetry.getHistogramById("SHUMWAY_LOAD_RESOURCE_RESULT");
+    histogram.add(resultType);
+  },
   onFallback: function (userAction) {
     var histogram = Services.telemetry.getHistogramById("SHUMWAY_FALLBACK");
     histogram.add(userAction);
   }
 };
index d41a2d4fccca1eed336a96abd2432dc40bb314e7..a54a058b3aa0f23a4a6b5e945efbd00cc66e11d9
GIT binary patch
literal 21973
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
index eb3040f1a2448ce1dd1dd47ca0537201433e131e..1bdf39e81dbccb67f5a7b6f11b301e917a9c6c30
GIT binary patch
literal 183837
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
--- a/browser/extensions/shumway/content/playerglobal/playerglobal.json
+++ b/browser/extensions/shumway/content/playerglobal/playerglobal.json
@@ -200,2546 +200,2546 @@
     "length": 278
   },
   {
     "name": "flash/display/Graphics",
     "defs": [
       "flash.display:Graphics"
     ],
     "offset": 11708,
-    "length": 954
+    "length": 956
   },
   {
     "name": "flash/display/GradientType",
     "defs": [
       "flash.display:GradientType"
     ],
-    "offset": 12662,
+    "offset": 12664,
     "length": 239
   },
   {
     "name": "flash/display/GraphicsBitmapFill",
     "defs": [
       "flash.display:GraphicsBitmapFill"
     ],
-    "offset": 12901,
+    "offset": 12903,
     "length": 346
   },
   {
     "name": "flash/display/GraphicsEndFill",
     "defs": [
       "flash.display:GraphicsEndFill"
     ],
-    "offset": 13247,
+    "offset": 13249,
     "length": 215
   },
   {
     "name": "flash/display/GraphicsGradientFill",
     "defs": [
       "flash.display:GraphicsGradientFill"
     ],
-    "offset": 13462,
+    "offset": 13464,
     "length": 697
   },
   {
     "name": "flash/display/GraphicsPath",
     "defs": [
       "flash.display:GraphicsPath"
     ],
-    "offset": 14159,
+    "offset": 14161,
     "length": 1258
   },
   {
     "name": "flash/display/GraphicsPathCommand",
     "defs": [
       "flash.display:GraphicsPathCommand"
     ],
-    "offset": 15417,
+    "offset": 15419,
     "length": 368
   },
   {
     "name": "flash/display/GraphicsPathWinding",
     "defs": [
       "flash.display:GraphicsPathWinding"
     ],
-    "offset": 15785,
+    "offset": 15787,
     "length": 259
   },
   {
     "name": "flash/display/GraphicsSolidFill",
     "defs": [
       "flash.display:GraphicsSolidFill"
     ],
-    "offset": 16044,
+    "offset": 16046,
     "length": 283
   },
   {
     "name": "flash/display/GraphicsStroke",
     "defs": [
       "flash.display:GraphicsStroke"
     ],
-    "offset": 16327,
+    "offset": 16329,
     "length": 1542
   },
   {
     "name": "flash/display/GraphicsTrianglePath",
     "defs": [
       "flash.display:GraphicsTrianglePath"
     ],
-    "offset": 17869,
+    "offset": 17871,
     "length": 680
   },
   {
     "name": "flash/display/IBitmapDrawable",
     "defs": [
       "flash.display:IBitmapDrawable"
     ],
-    "offset": 18549,
+    "offset": 18551,
     "length": 105
   },
   {
     "name": "flash/display/IDrawCommand",
     "defs": [
       "flash.display:IDrawCommand"
     ],
-    "offset": 18654,
+    "offset": 18656,
     "length": 102
   },
   {
     "name": "flash/display/IGraphicsData",
     "defs": [
       "flash.display:IGraphicsData"
     ],
-    "offset": 18756,
+    "offset": 18758,
     "length": 103
   },
   {
     "name": "flash/display/IGraphicsFill",
     "defs": [
       "flash.display:IGraphicsFill"
     ],
-    "offset": 18859,
+    "offset": 18861,
     "length": 103
   },
   {
     "name": "flash/display/IGraphicsPath",
     "defs": [
       "flash.display:IGraphicsPath"
     ],
-    "offset": 18962,
+    "offset": 18964,
     "length": 103
   },
   {
     "name": "flash/display/IGraphicsStroke",
     "defs": [
       "flash.display:IGraphicsStroke"
     ],
-    "offset": 19065,
+    "offset": 19067,
     "length": 105
   },
   {
     "name": "flash/display/InteractiveObject",
     "defs": [
       "flash.display:InteractiveObject"
     ],
-    "offset": 19170,
+    "offset": 19172,
     "length": 764
   },
   {
     "name": "flash/display/InterpolationMethod",
     "defs": [
       "flash.display:InterpolationMethod"
     ],
-    "offset": 19934,
+    "offset": 19936,
     "length": 254
   },
   {
     "name": "flash/display/JointStyle",
     "defs": [
       "flash.display:JointStyle"
     ],
-    "offset": 20188,
+    "offset": 20190,
     "length": 258
   },
   {
     "name": "flash/display/JPEGEncoderOptions",
     "defs": [
       "flash.display:JPEGEncoderOptions"
     ],
-    "offset": 20446,
+    "offset": 20448,
     "length": 216
   },
   {
     "name": "flash/display/JPEGXREncoderOptions",
     "defs": [
       "flash.display:JPEGXREncoderOptions"
     ],
-    "offset": 20662,
+    "offset": 20664,
     "length": 295
   },
   {
     "name": "flash/display/LineScaleMode",
     "defs": [
       "flash.display:LineScaleMode"
     ],
-    "offset": 20957,
+    "offset": 20959,
     "length": 307
   },
   {
     "name": "flash/display/Loader",
     "defs": [
       "flash.display:Loader"
     ],
-    "offset": 21264,
+    "offset": 21266,
     "length": 756
   },
   {
     "name": "flash/display/LoaderInfo",
     "defs": [
       "flash.display:LoaderInfo"
     ],
-    "offset": 22020,
+    "offset": 22022,
     "length": 992
   },
   {
     "name": "flash/display/MorphShape",
     "defs": [
       "flash.display:MorphShape"
     ],
-    "offset": 23012,
+    "offset": 23014,
     "length": 263
   },
   {
     "name": "flash/display/MovieClip",
     "defs": [
       "flash.display:MovieClip"
     ],
-    "offset": 23275,
+    "offset": 23277,
     "length": 845
   },
   {
     "name": "flash/display/NativeMenu",
     "defs": [
       "flash.display:NativeMenu"
     ],
-    "offset": 24120,
+    "offset": 24122,
     "length": 226
   },
   {
     "name": "flash/display/NativeMenuItem",
     "defs": [
       "flash.display:NativeMenuItem"
     ],
-    "offset": 24346,
+    "offset": 24348,
     "length": 285
   },
   {
     "name": "flash/display/PixelSnapping",
     "defs": [
       "flash.display:PixelSnapping"
     ],
-    "offset": 24631,
+    "offset": 24633,
     "length": 264
   },
   {
     "name": "flash/display/PNGEncoderOptions",
     "defs": [
       "flash.display:PNGEncoderOptions"
     ],
-    "offset": 24895,
+    "offset": 24897,
     "length": 224
   },
   {
     "name": "flash/display/Scene",
     "defs": [
       "flash.display:Scene"
     ],
-    "offset": 25119,
+    "offset": 25121,
     "length": 255
   },
   {
     "name": "flash/display/Shape",
     "defs": [
       "flash.display:Shape"
     ],
-    "offset": 25374,
+    "offset": 25376,
     "length": 266
   },
   {
     "name": "flash/display/SimpleButton",
     "defs": [
       "flash.display:SimpleButton"
     ],
-    "offset": 25640,
+    "offset": 25642,
     "length": 596
   },
   {
     "name": "flash/display/SpreadMethod",
     "defs": [
       "flash.display:SpreadMethod"
     ],
-    "offset": 26236,
+    "offset": 26238,
     "length": 264
   },
   {
     "name": "flash/display/Sprite",
     "defs": [
       "flash.display:Sprite"
     ],
-    "offset": 26500,
+    "offset": 26502,
     "length": 670
   },
   {
     "name": "flash/display/Stage",
     "defs": [
       "flash.display:Stage"
     ],
-    "offset": 27170,
+    "offset": 27172,
     "length": 2409
   },
   {
     "name": "flash/display/Stage3D",
     "defs": [
       "flash.display:Stage3D"
     ],
-    "offset": 29579,
+    "offset": 29581,
     "length": 443
   },
   {
     "name": "flash/display/StageAlign",
     "defs": [
       "flash.display:StageAlign"
     ],
-    "offset": 30022,
+    "offset": 30024,
     "length": 383
   },
   {
     "name": "flash/display/StageDisplayState",
     "defs": [
       "flash.display:StageDisplayState"
     ],
-    "offset": 30405,
+    "offset": 30407,
     "length": 319
   },
   {
     "name": "flash/display/StageQuality",
     "defs": [
       "flash.display:StageQuality"
     ],
-    "offset": 30724,
+    "offset": 30726,
     "length": 429
   },
   {
     "name": "flash/display/StageScaleMode",
     "defs": [
       "flash.display:StageScaleMode"
     ],
-    "offset": 31153,
+    "offset": 31155,
     "length": 317
   },
   {
     "name": "flash/display/SWFVersion",
     "defs": [
       "flash.display:SWFVersion"
     ],
-    "offset": 31470,
+    "offset": 31472,
     "length": 454
   },
   {
     "name": "flash/display/TriangleCulling",
     "defs": [
       "flash.display:TriangleCulling"
     ],
-    "offset": 31924,
+    "offset": 31926,
     "length": 278
   },
   {
     "name": "flash/external/ExternalInterface",
     "defs": [
       "flash.external:ExternalInterface"
     ],
-    "offset": 32202,
-    "length": 3261
+    "offset": 32204,
+    "length": 380
   },
   {
     "name": "flash/events/AccelerometerEvent",
     "defs": [
       "flash.events:AccelerometerEvent"
     ],
-    "offset": 35463,
+    "offset": 32584,
     "length": 817
   },
   {
     "name": "flash/events/ActivityEvent",
     "defs": [
       "flash.events:ActivityEvent"
     ],
-    "offset": 36280,
+    "offset": 33401,
     "length": 505
   },
   {
     "name": "flash/events/AsyncErrorEvent",
     "defs": [
       "flash.events:AsyncErrorEvent"
     ],
-    "offset": 36785,
-    "length": 522
+    "offset": 33906,
+    "length": 398
   },
   {
     "name": "flash/events/ContextMenuEvent",
     "defs": [
       "flash.events:ContextMenuEvent"
     ],
-    "offset": 37307,
+    "offset": 34304,
     "length": 829
   },
   {
     "name": "flash/events/DataEvent",
     "defs": [
       "flash.events:DataEvent"
     ],
-    "offset": 38136,
+    "offset": 35133,
     "length": 546
   },
   {
     "name": "flash/events/ErrorEvent",
     "defs": [
       "flash.events:ErrorEvent"
     ],
-    "offset": 38682,
+    "offset": 35679,
     "length": 388
   },
   {
     "name": "flash/events/Event",
     "defs": [
       "flash.events:Event"
     ],
-    "offset": 39070,
+    "offset": 36067,
     "length": 2036
   },
   {
     "name": "flash/events/EventDispatcher",
     "defs": [
       "flash.events:EventDispatcher"
     ],
-    "offset": 41106,
+    "offset": 38103,
     "length": 463
   },
   {
     "name": "flash/events/EventPhase",
     "defs": [
       "flash.events:EventPhase"
     ],
-    "offset": 41569,
+    "offset": 38566,
     "length": 262
   },
   {
     "name": "flash/events/FocusEvent",
     "defs": [
       "flash.events:FocusEvent"
     ],
-    "offset": 41831,
+    "offset": 38828,
     "length": 980
   },
   {
     "name": "flash/events/FullScreenEvent",
     "defs": [
       "flash.events:FullScreenEvent"
     ],
-    "offset": 42811,
+    "offset": 39808,
     "length": 643
   },
   {
     "name": "flash/events/GameInputEvent",
     "defs": [
       "flash.events:GameInputEvent"
     ],
-    "offset": 43454,
+    "offset": 40451,
     "length": 390
   },
   {
     "name": "flash/events/GeolocationEvent",
     "defs": [
       "flash.events:GeolocationEvent"
     ],
-    "offset": 43844,
+    "offset": 40841,
     "length": 1137
   },
   {
     "name": "flash/events/GestureEvent",
     "defs": [
       "flash.events:GestureEvent"
     ],
-    "offset": 44981,
+    "offset": 41978,
     "length": 669
   },
   {
     "name": "flash/events/GesturePhase",
     "defs": [
       "flash.events:GesturePhase"
     ],
-    "offset": 45650,
+    "offset": 42647,
     "length": 281
   },
   {
     "name": "flash/events/HTTPStatusEvent",
     "defs": [
       "flash.events:HTTPStatusEvent"
     ],
-    "offset": 45931,
-    "length": 534
+    "offset": 42928,
+    "length": 457
   },
   {
     "name": "flash/events/IEventDispatcher",
     "defs": [
       "flash.events:IEventDispatcher"
     ],
-    "offset": 46465,
+    "offset": 43385,
     "length": 353
   },
   {
     "name": "flash/events/IMEEvent",
     "defs": [
       "flash.events:IMEEvent"
     ],
-    "offset": 46818,
+    "offset": 43738,
     "length": 632
   },
   {
     "name": "flash/events/IOErrorEvent",
     "defs": [
       "flash.events:IOErrorEvent"
     ],
-    "offset": 47450,
+    "offset": 44370,
     "length": 495
   },
   {
     "name": "flash/events/KeyboardEvent",
     "defs": [
       "flash.events:KeyboardEvent"
     ],
-    "offset": 47945,
+    "offset": 44865,
     "length": 617
   },
   {
     "name": "flash/events/MouseEvent",
     "defs": [
       "flash.events:MouseEvent"
     ],
-    "offset": 48562,
+    "offset": 45482,
     "length": 1503
   },
   {
     "name": "flash/events/NetDataEvent",
     "defs": [
       "flash.events:NetDataEvent"
     ],
-    "offset": 50065,
+    "offset": 46985,
     "length": 565
   },
   {
     "name": "flash/events/NetFilterEvent",
     "defs": [
       "flash.events:NetFilterEvent"
     ],
-    "offset": 50630,
+    "offset": 47550,
     "length": 454
   },
   {
     "name": "flash/events/NetMonitorEvent",
     "defs": [
       "flash.events:NetMonitorEvent"
     ],
-    "offset": 51084,
+    "offset": 48004,
     "length": 516
   },
   {
     "name": "flash/events/NetStatusEvent",
     "defs": [
       "flash.events:NetStatusEvent"
     ],
-    "offset": 51600,
+    "offset": 48520,
     "length": 385
   },
   {
     "name": "flash/events/OutputProgressEvent",
     "defs": [
       "flash.events:OutputProgressEvent"
     ],
-    "offset": 51985,
+    "offset": 48905,
     "length": 638
   },
   {
     "name": "flash/events/PressAndTapGestureEvent",
     "defs": [
       "flash.events:PressAndTapGestureEvent"
     ],
-    "offset": 52623,
+    "offset": 49543,
     "length": 944
   },
   {
     "name": "flash/events/ProgressEvent",
     "defs": [
       "flash.events:ProgressEvent"
     ],
-    "offset": 53567,
+    "offset": 50487,
     "length": 460
   },
   {
     "name": "flash/events/SampleDataEvent",
     "defs": [
       "flash.events:SampleDataEvent"
     ],
-    "offset": 54027,
+    "offset": 50947,
     "length": 639
   },
   {
     "name": "flash/events/SecurityErrorEvent",
     "defs": [
       "flash.events:SecurityErrorEvent"
     ],
-    "offset": 54666,
+    "offset": 51586,
     "length": 511
   },
   {
     "name": "flash/events/SoftKeyboardEvent",
     "defs": [
       "flash.events:SoftKeyboardEvent"
     ],
-    "offset": 55177,
+    "offset": 52097,
     "length": 793
   },
   {
     "name": "flash/events/SoftKeyboardTrigger",
     "defs": [
       "flash.events:SoftKeyboardTrigger"
     ],
-    "offset": 55970,
+    "offset": 52890,
     "length": 287
   },
   {
     "name": "flash/events/StageVideoAvailabilityEvent",
     "defs": [
       "flash.events:StageVideoAvailabilityEvent"
     ],
-    "offset": 56257,
+    "offset": 53177,
     "length": 377
   },
   {
     "name": "flash/events/StageVideoEvent",
     "defs": [
       "flash.events:StageVideoEvent"
     ],
-    "offset": 56634,
+    "offset": 53554,
     "length": 535
   },
   {
     "name": "flash/events/StatusEvent",
     "defs": [
       "flash.events:StatusEvent"
     ],
-    "offset": 57169,
-    "length": 578
+    "offset": 54089,
+    "length": 366
   },
   {
     "name": "flash/events/SyncEvent",
     "defs": [
       "flash.events:SyncEvent"
     ],
-    "offset": 57747,
+    "offset": 54455,
     "length": 466
   },
   {
     "name": "flash/events/TextEvent",
     "defs": [
       "flash.events:TextEvent"
     ],
-    "offset": 58213,
+    "offset": 54921,
     "length": 381
   },
   {
     "name": "flash/events/ThrottleEvent",
     "defs": [
       "flash.events:ThrottleEvent"
     ],
-    "offset": 58594,
+    "offset": 55302,
     "length": 553
   },
   {
     "name": "flash/events/ThrottleType",
     "defs": [
       "flash.events:ThrottleType"
     ],
-    "offset": 59147,
+    "offset": 55855,
     "length": 268
   },
   {
     "name": "flash/events/TimerEvent",
     "defs": [
       "flash.events:TimerEvent"
     ],
-    "offset": 59415,
+    "offset": 56123,
     "length": 389
   },
   {
     "name": "flash/events/TouchEvent",
     "defs": [
       "flash.events:TouchEvent"
     ],
-    "offset": 59804,
+    "offset": 56512,
     "length": 1501
   },
   {
     "name": "flash/events/TransformGestureEvent",
     "defs": [
       "flash.events:TransformGestureEvent"
     ],
-    "offset": 61305,
+    "offset": 58013,
     "length": 1154
   },
   {
     "name": "flash/events/UncaughtErrorEvent",
     "defs": [
       "flash.events:UncaughtErrorEvent"
     ],
-    "offset": 62459,
+    "offset": 59167,
     "length": 525
   },
   {
     "name": "flash/events/UncaughtErrorEvents",
     "defs": [
       "flash.events:UncaughtErrorEvents"
     ],
-    "offset": 62984,
+    "offset": 59692,
     "length": 236
   },
   {
     "name": "flash/events/VideoEvent",
     "defs": [
       "flash.events:VideoEvent"
     ],
-    "offset": 63220,
+    "offset": 59928,
     "length": 461
   },
   {
     "name": "flash/geom/ColorTransform",
     "defs": [
       "flash.geom:ColorTransform"
     ],
-    "offset": 63681,
+    "offset": 60389,
     "length": 586
   },
   {
     "name": "flash/geom/Matrix",
     "defs": [
       "flash.geom:Matrix"
     ],
-    "offset": 64267,
+    "offset": 60975,
     "length": 814
   },
   {
     "name": "flash/geom/Matrix3D",
     "defs": [
       "flash.geom:Matrix3D"
     ],
-    "offset": 65081,
+    "offset": 61789,
     "length": 1092
   },
   {
     "name": "flash/geom/Orientation3D",
     "defs": [
       "flash.geom:Orientation3D"
     ],
-    "offset": 66173,
+    "offset": 62881,
     "length": 290
   },
   {
     "name": "flash/geom/PerspectiveProjection",
     "defs": [
       "flash.geom:PerspectiveProjection"
     ],
-    "offset": 66463,
+    "offset": 63171,
     "length": 389
   },
   {
     "name": "flash/geom/Point",
     "defs": [
       "flash.geom:Point"
     ],
-    "offset": 66852,
+    "offset": 63560,
     "length": 516
   },
   {
     "name": "flash/geom/Rectangle",
     "defs": [
       "flash.geom:Rectangle"
     ],
-    "offset": 67368,
+    "offset": 64076,
     "length": 889
   },
   {
     "name": "flash/geom/Transform",
     "defs": [
       "flash.geom:Transform"
     ],
-    "offset": 68257,
+    "offset": 64965,
     "length": 553
   },
   {
     "name": "flash/geom/Utils3D",
     "defs": [
       "flash.geom:Utils3D"
     ],
-    "offset": 68810,
+    "offset": 65518,
     "length": 342
   },
   {
     "name": "flash/geom/Vector3D",
     "defs": [
       "flash.geom:Vector3D"
     ],
-    "offset": 69152,
+    "offset": 65860,
     "length": 830
   },
   {
     "name": "flash/filters/BevelFilter",
     "defs": [
       "flash.filters:BevelFilter"
     ],
-    "offset": 69982,
+    "offset": 66690,
     "length": 685
   },
   {
     "name": "flash/filters/BitmapFilter",
     "defs": [
       "flash.filters:BitmapFilter"
     ],
-    "offset": 70667,
+    "offset": 67375,
     "length": 209
   },
   {
     "name": "flash/filters/BitmapFilterQuality",
     "defs": [
       "flash.filters:BitmapFilterQuality"
     ],
-    "offset": 70876,
+    "offset": 67584,
     "length": 256
   },
   {
     "name": "flash/filters/BitmapFilterType",
     "defs": [
       "flash.filters:BitmapFilterType"
     ],
-    "offset": 71132,
+    "offset": 67840,
     "length": 268
   },
   {
     "name": "flash/filters/BlurFilter",
     "defs": [
       "flash.filters:BlurFilter"
     ],
-    "offset": 71400,
+    "offset": 68108,
     "length": 342
   },
   {
     "name": "flash/filters/ColorMatrixFilter",
     "defs": [
       "flash.filters:ColorMatrixFilter"
     ],
-    "offset": 71742,
+    "offset": 68450,
     "length": 294
   },
   {
     "name": "flash/filters/ConvolutionFilter",
     "defs": [
       "flash.filters:ConvolutionFilter"
     ],
-    "offset": 72036,
+    "offset": 68744,
     "length": 570
   },
   {
     "name": "flash/filters/DisplacementMapFilter",
     "defs": [
       "flash.filters:DisplacementMapFilter"
     ],
-    "offset": 72606,
+    "offset": 69314,
     "length": 632
   },
   {
     "name": "flash/filters/DisplacementMapFilterMode",
     "defs": [
       "flash.filters:DisplacementMapFilterMode"
     ],
-    "offset": 73238,
+    "offset": 69946,
     "length": 315
   },
   {
     "name": "flash/filters/DropShadowFilter",
     "defs": [
       "flash.filters:DropShadowFilter"
     ],
-    "offset": 73553,
+    "offset": 70261,
     "length": 627
   },
   {
     "name": "flash/filters/GlowFilter",
     "defs": [
       "flash.filters:GlowFilter"
     ],
-    "offset": 74180,
+    "offset": 70888,
     "length": 517
   },
   {
     "name": "flash/filters/GradientBevelFilter",
     "defs": [
       "flash.filters:GradientBevelFilter"
     ],
-    "offset": 74697,
+    "offset": 71405,
     "length": 649
   },
   {
     "name": "flash/filters/GradientGlowFilter",
     "defs": [
       "flash.filters:GradientGlowFilter"
     ],
-    "offset": 75346,
+    "offset": 72054,
     "length": 646
   },
   {
     "name": "flash/globalization/Collator",
     "defs": [
       "flash.globalization:Collator"
     ],
-    "offset": 75992,
+    "offset": 72700,
     "length": 692
   },
   {
     "name": "flash/globalization/CollatorMode",
     "defs": [
       "flash.globalization:CollatorMode"
     ],
-    "offset": 76684,
+    "offset": 73392,
     "length": 257
   },
   {
     "name": "flash/globalization/CurrencyFormatter",
     "defs": [
       "flash.globalization:CurrencyFormatter"
     ],
-    "offset": 76941,
+    "offset": 73649,
     "length": 1104
   },
   {
     "name": "flash/globalization/CurrencyParseResult",
     "defs": [
       "flash.globalization:CurrencyParseResult"
     ],
-    "offset": 78045,
+    "offset": 74753,
     "length": 350
   },
   {
     "name": "flash/globalization/DateTimeFormatter",
     "defs": [
       "flash.globalization:DateTimeFormatter"
     ],
-    "offset": 78395,
+    "offset": 75103,
     "length": 830
   },
   {
     "name": "flash/globalization/DateTimeNameContext",
     "defs": [
       "flash.globalization:DateTimeNameContext"
     ],
-    "offset": 79225,
+    "offset": 75933,
     "length": 273
   },
   {
     "name": "flash/globalization/DateTimeNameStyle",
     "defs": [
       "flash.globalization:DateTimeNameStyle"
     ],
-    "offset": 79498,
+    "offset": 76206,
     "length": 330
   },
   {
     "name": "flash/globalization/DateTimeStyle",
     "defs": [
       "flash.globalization:DateTimeStyle"
     ],
-    "offset": 79828,
+    "offset": 76536,
     "length": 330
   },
   {
     "name": "flash/globalization/LastOperationStatus",
     "defs": [
       "flash.globalization:LastOperationStatus"
     ],
-    "offset": 80158,
+    "offset": 76866,
     "length": 1104
   },
   {
     "name": "flash/globalization/LocaleID",
     "defs": [
       "flash.globalization:LocaleID"
     ],
-    "offset": 81262,
+    "offset": 77970,
     "length": 560
   },
   {
     "name": "flash/globalization/NationalDigitsType",
     "defs": [
       "flash.globalization:NationalDigitsType"
     ],
-    "offset": 81822,
+    "offset": 78530,
     "length": 1055
   },
   {
     "name": "flash/globalization/NumberFormatter",
     "defs": [
       "flash.globalization:NumberFormatter"
     ],
-    "offset": 82877,
+    "offset": 79585,
     "length": 946
   },
   {
     "name": "flash/globalization/NumberParseResult",
     "defs": [
       "flash.globalization:NumberParseResult"
     ],
-    "offset": 83823,
+    "offset": 80531,
     "length": 367
   },
   {
     "name": "flash/globalization/StringTools",
     "defs": [
       "flash.globalization:StringTools"
     ],
-    "offset": 84190,
+    "offset": 80898,
     "length": 460
   },
   {
     "name": "flash/media/AudioDecoder",
     "defs": [
       "flash.media:AudioDecoder"
     ],
-    "offset": 84650,
+    "offset": 81358,
     "length": 448
   },
   {
     "name": "flash/media/Camera",
     "defs": [
       "flash.media:Camera"
     ],
-    "offset": 85098,
-    "length": 1029
+    "offset": 81806,
+    "length": 1009
   },
   {
     "name": "flash/media/H264Level",
     "defs": [
       "flash.media:H264Level"
     ],
-    "offset": 86127,
+    "offset": 82815,
     "length": 613
   },
   {
     "name": "flash/media/H264Profile",
     "defs": [
       "flash.media:H264Profile"
     ],
-    "offset": 86740,
+    "offset": 83428,
     "length": 233
   },
   {
     "name": "flash/media/H264VideoStreamSettings",
     "defs": [
       "flash.media:H264VideoStreamSettings"
     ],
-    "offset": 86973,
+    "offset": 83661,
     "length": 1137
   },
   {
     "name": "flash/media/ID3Info",
     "defs": [
       "flash.media:ID3Info"
     ],
-    "offset": 88110,
+    "offset": 84798,
     "length": 300
   },
   {
     "name": "flash/media/Microphone",
     "defs": [
       "flash.media:Microphone"
     ],
-    "offset": 88410,
+    "offset": 85098,
     "length": 986
   },
   {
     "name": "flash/media/MicrophoneEnhancedMode",
     "defs": [
       "flash.media:MicrophoneEnhancedMode"
     ],
-    "offset": 89396,
+    "offset": 86084,
     "length": 367
   },
   {
     "name": "flash/media/MicrophoneEnhancedOptions",
     "defs": [
       "flash.media:MicrophoneEnhancedOptions"
     ],
-    "offset": 89763,
+    "offset": 86451,
     "length": 604
   },
   {
     "name": "flash/media/Sound",
     "defs": [
       "flash.media:Sound"
     ],
-    "offset": 90367,
+    "offset": 87055,
     "length": 726
   },
   {
     "name": "flash/media/SoundChannel",
     "defs": [
       "flash.media:SoundChannel"
     ],
-    "offset": 91093,
+    "offset": 87781,
     "length": 390
   },
   {
     "name": "flash/media/SoundCodec",
     "defs": [
       "flash.media:SoundCodec"
     ],
-    "offset": 91483,
+    "offset": 88171,
     "length": 287
   },
   {
     "name": "flash/media/SoundLoaderContext",
     "defs": [
       "flash.media:SoundLoaderContext"
     ],
-    "offset": 91770,
+    "offset": 88458,
     "length": 261
   },
   {
     "name": "flash/media/SoundMixer",
     "defs": [
       "flash.media:SoundMixer"
     ],
-    "offset": 92031,
+    "offset": 88719,
     "length": 513
   },
   {
     "name": "flash/media/SoundTransform",
     "defs": [
       "flash.media:SoundTransform"
     ],
-    "offset": 92544,
+    "offset": 89232,
     "length": 422
   },
   {
     "name": "flash/media/StageVideo",
     "defs": [
       "flash.media:StageVideo"
     ],
-    "offset": 92966,
+    "offset": 89654,
     "length": 570
   },
   {
     "name": "flash/media/StageVideoAvailability",
     "defs": [
       "flash.media:StageVideoAvailability"
     ],
-    "offset": 93536,
+    "offset": 90224,
     "length": 271
   },
   {
     "name": "flash/media/Video",
     "defs": [
       "flash.media:Video"
     ],
-    "offset": 93807,
+    "offset": 90495,
     "length": 494
   },
   {
     "name": "flash/media/VideoCodec",
     "defs": [
       "flash.media:VideoCodec"
     ],
-    "offset": 94301,
+    "offset": 90989,
     "length": 256
   },
   {
     "name": "flash/media/VideoStatus",
     "defs": [
       "flash.media:VideoStatus"
     ],
-    "offset": 94557,
+    "offset": 91245,
     "length": 286
   },
   {
     "name": "flash/media/VideoStreamSettings",
     "defs": [
       "flash.media:VideoStreamSettings"
     ],
-    "offset": 94843,
+    "offset": 91531,
     "length": 651
   },
   {
     "name": "flash/profiler/Telemetry",
     "defs": [
       "flash.profiler:Telemetry"
     ],
-    "offset": 95494,
+    "offset": 92182,
     "length": 422
   },
   {
     "name": "flash/printing/PrintJob",
     "defs": [
       "flash.printing:PrintJob"
     ],
-    "offset": 95916,
+    "offset": 92604,
     "length": 711
   },
   {
     "name": "flash/printing/PrintJobOptions",
     "defs": [
       "flash.printing:PrintJobOptions"
     ],
-    "offset": 96627,
+    "offset": 93315,
     "length": 216
   },
   {
     "name": "flash/printing/PrintJobOrientation",
     "defs": [
       "flash.printing:PrintJobOrientation"
     ],
-    "offset": 96843,
+    "offset": 93531,
     "length": 265
   },
   {
     "name": "flash/security/CertificateStatus",
     "defs": [
       "flash.security:CertificateStatus"
     ],
-    "offset": 97108,
+    "offset": 93796,
     "length": 533
   },
   {
     "name": "flash/security/X500DistinguishedName",
     "defs": [
       "flash.security:X500DistinguishedName"
     ],
-    "offset": 97641,
+    "offset": 94329,
     "length": 427
   },
   {
     "name": "flash/security/X509Certificate",
     "defs": [
       "flash.security:X509Certificate"
     ],
-    "offset": 98068,
+    "offset": 94756,
     "length": 635
   },
   {
     "name": "flash/sampler/ClassFactory",
     "defs": [
       "flash.sampler:ClassFactory"
     ],
-    "offset": 98703,
+    "offset": 95391,
     "length": 285
   },
   {
     "name": "flash/sampler/DeleteObjectSample",
     "defs": [
       "flash.sampler:DeleteObjectSample"
     ],
-    "offset": 98988,
+    "offset": 95676,
     "length": 233
   },
   {
     "name": "flash/sampler/NewObjectSample",
     "defs": [
       "flash.sampler:NewObjectSample"
     ],
-    "offset": 99221,
+    "offset": 95909,
     "length": 308
   },
   {
     "name": "flash/sampler/Sample",
     "defs": [
       "flash.sampler:Sample"
     ],
-    "offset": 99529,
+    "offset": 96217,
     "length": 205
   },
   {
     "name": "flash/sampler/StackFrame",
     "defs": [
       "flash.sampler:StackFrame"
     ],
-    "offset": 99734,
+    "offset": 96422,
     "length": 310
   },
   {
     "name": "flash/system/ApplicationDomain",
     "defs": [
       "flash.system:ApplicationDomain"
     ],
-    "offset": 100044,
+    "offset": 96732,
     "length": 498
   },
   {
     "name": "flash/system/ApplicationInstaller",
     "defs": [
       "flash.system:ApplicationInstaller"
     ],
-    "offset": 100542,
+    "offset": 97230,
     "length": 426
   },
   {
     "name": "flash/system/AuthorizedFeatures",
     "defs": [
       "flash.system:AuthorizedFeatures"
     ],
-    "offset": 100968,
+    "offset": 97656,
     "length": 456
   },
   {
     "name": "flash/system/AuthorizedFeaturesLoader",
     "defs": [
       "flash.system:AuthorizedFeaturesLoader"
     ],
-    "offset": 101424,
+    "offset": 98112,
     "length": 398
   },
   {
     "name": "flash/system/Capabilities",
     "defs": [
       "flash.system:Capabilities"
     ],
-    "offset": 101822,
+    "offset": 98510,
     "length": 1133
   },
   {
     "name": "flash/system/DomainMemoryWithStage3D",
     "defs": [
       "flash.system:DomainMemoryWithStage3D"
     ],
-    "offset": 102955,
+    "offset": 99643,
     "length": 191
   },
   {
     "name": "flash/system/FSCommand",
     "defs": [
       "flash.system:FSCommand",
       "flash.system:fscommand"
     ],
-    "offset": 103146,
-    "length": 285
+    "offset": 99834,
+    "length": 95
   },
   {
     "name": "flash/system/ImageDecodingPolicy",
     "defs": [
       "flash.system:ImageDecodingPolicy"
     ],
-    "offset": 103431,
+    "offset": 99929,
     "length": 257
   },
   {
     "name": "flash/system/IME",
     "defs": [
       "flash.system:IME"
     ],
-    "offset": 103688,
+    "offset": 100186,
     "length": 469
   },
   {
     "name": "flash/system/IMEConversionMode",
     "defs": [
       "flash.system:IMEConversionMode"
     ],
-    "offset": 104157,
+    "offset": 100655,
     "length": 432
   },
   {
     "name": "flash/system/JPEGLoaderContext",
     "defs": [
       "flash.system:JPEGLoaderContext"
     ],
-    "offset": 104589,
+    "offset": 101087,
     "length": 309
   },
   {
     "name": "flash/system/LoaderContext",
     "defs": [
       "flash.system:LoaderContext"
     ],
-    "offset": 104898,
+    "offset": 101396,
     "length": 480
   },
   {
     "name": "flash/system/MessageChannel",
     "defs": [
       "flash.system:MessageChannel"
     ],
-    "offset": 105378,
+    "offset": 101876,
     "length": 584
   },
   {
     "name": "flash/system/MessageChannelState",
     "defs": [
       "flash.system:MessageChannelState"
     ],
-    "offset": 105962,
+    "offset": 102460,
     "length": 278
   },
   {
     "name": "flash/system/Security",
     "defs": [
       "flash.system:Security"
     ],
-    "offset": 106240,
+    "offset": 102738,
     "length": 773
   },
   {
     "name": "flash/system/SecurityDomain",
     "defs": [
       "flash.system:SecurityDomain"
     ],
-    "offset": 107013,
+    "offset": 103511,
     "length": 221
   },
   {
     "name": "flash/system/SecurityPanel",
     "defs": [
       "flash.system:SecurityPanel"
     ],
-    "offset": 107234,
+    "offset": 103732,
     "length": 430
   },
   {
     "name": "flash/system/System",
     "defs": [
       "flash.system:System"
     ],
-    "offset": 107664,
+    "offset": 104162,
     "length": 602
   },
   {
     "name": "flash/system/SystemUpdater",
     "defs": [
       "flash.system:SystemUpdater"
     ],
-    "offset": 108266,
+    "offset": 104764,
     "length": 322
   },
   {
     "name": "flash/system/SystemUpdaterType",
     "defs": [
       "flash.system:SystemUpdaterType"
     ],
-    "offset": 108588,
+    "offset": 105086,
     "length": 241
   },
   {
     "name": "flash/system/TouchscreenType",
     "defs": [
       "flash.system:TouchscreenType"
     ],
-    "offset": 108829,
+    "offset": 105327,
     "length": 268
   },
   {
     "name": "flash/trace/Trace",
     "defs": [
       "flash.trace:Trace"
     ],
-    "offset": 109097,
+    "offset": 105595,
     "length": 488
   },
   {
     "name": "flash/ui/ContextMenu",
     "defs": [
       "flash.ui:ContextMenu"
     ],
-    "offset": 109585,
+    "offset": 106083,
     "length": 636
   },
   {
     "name": "flash/ui/ContextMenuBuiltInItems",
     "defs": [
       "flash.ui:ContextMenuBuiltInItems"
     ],
-    "offset": 110221,
+    "offset": 106719,
     "length": 467
   },
   {
     "name": "flash/ui/ContextMenuClipboardItems",
     "defs": [
       "flash.ui:ContextMenuClipboardItems"
     ],
-    "offset": 110688,
+    "offset": 107186,
     "length": 380
   },
   {
     "name": "flash/ui/ContextMenuItem",
     "defs": [
       "flash.ui:ContextMenuItem"
     ],
-    "offset": 111068,
+    "offset": 107566,
     "length": 458
   },
   {
     "name": "flash/ui/GameInput",
     "defs": [
       "flash.ui:GameInput"
     ],
-    "offset": 111526,
+    "offset": 108024,
     "length": 333
   },
   {
     "name": "flash/ui/GameInputControl",
     "defs": [
       "flash.ui:GameInputControl"
     ],
-    "offset": 111859,
+    "offset": 108357,
     "length": 458
   },
   {
     "name": "flash/ui/GameInputControlType",
     "defs": [
       "flash.ui:GameInputControlType"
     ],
-    "offset": 112317,
+    "offset": 108815,
     "length": 389
   },
   {
     "name": "flash/ui/GameInputDevice",
     "defs": [
       "flash.ui:GameInputDevice"
     ],
-    "offset": 112706,
+    "offset": 109204,
     "length": 623
   },
   {
     "name": "flash/ui/GameInputFinger",
     "defs": [
       "flash.ui:GameInputFinger"
     ],
-    "offset": 113329,
+    "offset": 109827,
     "length": 291
   },
   {
     "name": "flash/ui/GameInputHand",
     "defs": [
       "flash.ui:GameInputHand"
     ],
-    "offset": 113620,
+    "offset": 110118,
     "length": 256
   },
   {
     "name": "flash/ui/Keyboard",
     "defs": [
       "flash.ui:Keyboard"
     ],
-    "offset": 113876,
+    "offset": 110374,
     "length": 9336
   },
   {
     "name": "flash/ui/KeyboardType",
     "defs": [
       "flash.ui:KeyboardType"
     ],
-    "offset": 123212,
+    "offset": 119710,
     "length": 266
   },
   {
     "name": "flash/ui/KeyLocation",
     "defs": [
       "flash.ui:KeyLocation"
     ],
-    "offset": 123478,
+    "offset": 119976,
     "length": 273
   },
   {
     "name": "flash/ui/Mouse",
     "defs": [
       "flash.ui:Mouse"
     ],
-    "offset": 123751,
+    "offset": 120249,
     "length": 383
   },
   {
     "name": "flash/ui/MouseCursor",
     "defs": [
       "flash.ui:MouseCursor"
     ],
-    "offset": 124134,
+    "offset": 120632,
     "length": 302
   },
   {
     "name": "flash/ui/MouseCursorData",
     "defs": [
       "flash.ui:MouseCursorData"
     ],
-    "offset": 124436,
+    "offset": 120934,
     "length": 352
   },
   {
     "name": "flash/ui/Multitouch",
     "defs": [
       "flash.ui:Multitouch"
     ],
-    "offset": 124788,
+    "offset": 121286,
     "length": 435
   },
   {
     "name": "flash/ui/MultitouchInputMode",
     "defs": [
       "flash.ui:MultitouchInputMode"
     ],
-    "offset": 125223,
+    "offset": 121721,
     "length": 279
   },
   {
     "name": "flash/sensors/Accelerometer",
     "defs": [
       "flash.sensors:Accelerometer"
     ],
-    "offset": 125502,
+    "offset": 122000,
     "length": 357
   },
   {
     "name": "flash/sensors/Geolocation",
     "defs": [
       "flash.sensors:Geolocation"
     ],
-    "offset": 125859,
+    "offset": 122357,
     "length": 351
   },
   {
     "name": "flash/display3D/Context3D",
     "defs": [
       "flash.display3D:Context3D"
     ],
-    "offset": 126210,
+    "offset": 122708,
     "length": 2088
   },
   {
     "name": "flash/display3D/Context3DBlendFactor",
     "defs": [
       "flash.display3D:Context3DBlendFactor"
     ],
-    "offset": 128298,
+    "offset": 124796,
     "length": 681
   },
   {
     "name": "flash/display3D/Context3DClearMask",
     "defs": [
       "flash.display3D:Context3DClearMask"
     ],
-    "offset": 128979,
+    "offset": 125477,
     "length": 292
   },
   {
     "name": "flash/display3D/Context3DProfile",
     "defs": [
       "flash.display3D:Context3DProfile"
     ],
-    "offset": 129271,
+    "offset": 125769,
     "length": 282
   },
   {
     "name": "flash/display3D/Context3DProgramType",
     "defs": [
       "flash.display3D:Context3DProgramType"
     ],
-    "offset": 129553,
+    "offset": 126051,
     "length": 263
   },
   {
     "name": "flash/display3D/Context3DRenderMode",
     "defs": [
       "flash.display3D:Context3DRenderMode"
     ],
-    "offset": 129816,
+    "offset": 126314,
     "length": 257
   },
   {
     "name": "flash/display3D/Context3DCompareMode",
     "defs": [
       "flash.display3D:Context3DCompareMode"
     ],
-    "offset": 130073,
+    "offset": 126571,
     "length": 452
   },
   {
     "name": "flash/display3D/Context3DStencilAction",
     "defs": [
       "flash.display3D:Context3DStencilAction"
     ],
-    "offset": 130525,
+    "offset": 127023,
     "length": 499
   },
   {
     "name": "flash/display3D/Context3DTextureFormat",
     "defs": [
       "flash.display3D:Context3DTextureFormat"
     ],
-    "offset": 131024,
+    "offset": 127522,
     "length": 315
   },
   {
     "name": "flash/display3D/Context3DTriangleFace",
     "defs": [
       "flash.display3D:Context3DTriangleFace"
     ],
-    "offset": 131339,
+    "offset": 127837,
     "length": 323
   },
   {
     "name": "flash/display3D/Context3DVertexBufferFormat",
     "defs": [
       "flash.display3D:Context3DVertexBufferFormat"
     ],
-    "offset": 131662,
+    "offset": 128160,
     "length": 365
   },
   {
     "name": "flash/display3D/IndexBuffer3D",
     "defs": [
       "flash.display3D:IndexBuffer3D"
     ],
-    "offset": 132027,
+    "offset": 128525,
     "length": 364
   },
   {
     "name": "flash/display3D/Program3D",
     "defs": [
       "flash.display3D:Program3D"
     ],
-    "offset": 132391,
+    "offset": 128889,
     "length": 275
   },
   {
     "name": "flash/display3D/VertexBuffer3D",
     "defs": [
       "flash.display3D:VertexBuffer3D"
     ],
-    "offset": 132666,
+    "offset": 129164,
     "length": 367
   },
   {
     "name": "flash/display3D/textures/CubeTexture",
     "defs": [
       "flash.display3D.textures:CubeTexture"
     ],
-    "offset": 133033,
+    "offset": 129531,
     "length": 501
   },
   {
     "name": "flash/display3D/textures/Texture",
     "defs": [
       "flash.display3D.textures:Texture"
     ],
-    "offset": 133534,
+    "offset": 130032,
     "length": 487
   },
   {
     "name": "flash/display3D/textures/TextureBase",
     "defs": [
       "flash.display3D.textures:TextureBase"
     ],
-    "offset": 134021,
+    "offset": 130519,
     "length": 292
   },
   {
     "name": "flash/net/DynamicPropertyOutput",
     "defs": [
       "flash.net:DynamicPropertyOutput"
     ],
-    "offset": 134313,
+    "offset": 130811,
     "length": 308
   },
   {
     "name": "flash/net/FileFilter",
     "defs": [
       "flash.net:FileFilter"
     ],
-    "offset": 134621,
+    "offset": 131119,
     "length": 318
   },
   {
     "name": "flash/net/FileReference",
     "defs": [
       "flash.net:FileReference"
     ],
-    "offset": 134939,
+    "offset": 131437,
     "length": 666
   },
   {
     "name": "flash/net/FileReferenceList",
     "defs": [
       "flash.net:FileReferenceList"
     ],
-    "offset": 135605,
+    "offset": 132103,
     "length": 315
   },
   {
     "name": "flash/net/GroupSpecifier",
     "defs": [
       "flash.net:GroupSpecifier"
     ],
-    "offset": 135920,
+    "offset": 132418,
     "length": 1492
   },
   {
     "name": "flash/net/IDynamicPropertyOutput",
     "defs": [
       "flash.net:IDynamicPropertyOutput"
     ],
-    "offset": 137412,
+    "offset": 133910,
     "length": 197
   },
   {
     "name": "flash/net/IDynamicPropertyWriter",
     "defs": [
       "flash.net:IDynamicPropertyWriter"
     ],
-    "offset": 137609,
+    "offset": 134107,
     "length": 225
   },
   {
     "name": "flash/net/LocalConnection",
     "defs": [
       "flash.net:LocalConnection"
     ],
-    "offset": 137834,
-    "length": 495
+    "offset": 134332,
+    "length": 469
   },
   {
     "name": "flash/net/NetConnection",
     "defs": [
       "flash.net:NetConnection"
     ],
-    "offset": 138329,
-    "length": 906
+    "offset": 134801,
+    "length": 759
   },
   {
     "name": "flash/net/NetGroup",
     "defs": [
       "flash.net:NetGroup"
     ],
-    "offset": 139235,
+    "offset": 135560,
     "length": 1299
   },
   {
     "name": "flash/net/NetGroupInfo",
     "defs": [
       "flash.net:NetGroupInfo"
     ],
-    "offset": 140534,
+    "offset": 136859,
     "length": 768
   },
   {
     "name": "flash/net/NetGroupReceiveMode",
     "defs": [
       "flash.net:NetGroupReceiveMode"
     ],
-    "offset": 141302,
+    "offset": 137627,
     "length": 245
   },
   {
     "name": "flash/net/NetGroupReplicationStrategy",
     "defs": [
       "flash.net:NetGroupReplicationStrategy"
     ],
-    "offset": 141547,
+    "offset": 137872,
     "length": 283
   },
   {
     "name": "flash/net/NetGroupSendMode",
     "defs": [
       "flash.net:NetGroupSendMode"
     ],
-    "offset": 141830,
+    "offset": 138155,
     "length": 273
   },
   {
     "name": "flash/net/NetGroupSendResult",
     "defs": [
       "flash.net:NetGroupSendResult"
     ],
-    "offset": 142103,
+    "offset": 138428,
     "length": 270
   },
   {
     "name": "flash/net/NetMonitor",
     "defs": [
       "flash.net:NetMonitor"
     ],
-    "offset": 142373,
+    "offset": 138698,
     "length": 279
   },
   {
     "name": "flash/net/NetStream",
     "defs": [
       "flash.net:NetStream"
     ],
-    "offset": 142652,
+    "offset": 138977,
     "length": 3025
   },
   {
     "name": "flash/net/NetStreamAppendBytesAction",
     "defs": [
       "flash.net:NetStreamAppendBytesAction"
     ],
-    "offset": 145677,
+    "offset": 142002,
     "length": 315
   },
   {
     "name": "flash/net/NetStreamMulticastInfo",
     "defs": [
       "flash.net:NetStreamMulticastInfo"
     ],
-    "offset": 145992,
+    "offset": 142317,
     "length": 2712
   },
   {
     "name": "flash/net/NetStreamInfo",
     "defs": [
       "flash.net:NetStreamInfo"
     ],
-    "offset": 148704,
+    "offset": 145029,
     "length": 1958
   },
   {
     "name": "flash/net/NetStreamPlayOptions",
     "defs": [
       "flash.net:NetStreamPlayOptions"
     ],
-    "offset": 150662,
+    "offset": 146987,
     "length": 355
   },
   {
     "name": "flash/net/NetStreamPlayTransitions",
     "defs": [
       "flash.net:NetStreamPlayTransitions"
     ],
-    "offset": 151017,
+    "offset": 147342,
     "length": 406
   },
   {
     "name": "flash/net/ObjectEncoding",
     "defs": [
       "flash.net:ObjectEncoding"
     ],
-    "offset": 151423,
+    "offset": 147748,
     "length": 345
   },
   {
     "name": "flash/net/Responder",
     "defs": [
       "flash.net:Responder"
     ],
-    "offset": 151768,
+    "offset": 148093,
     "length": 239
   },
   {
     "name": "flash/net/SecureSocket",
     "defs": [
       "flash.net:SecureSocket"
     ],
-    "offset": 152007,
+    "offset": 148332,
     "length": 566
   },
   {
     "name": "flash/net/SharedObject",
     "defs": [
       "flash.net:SharedObject"
     ],
-    "offset": 152573,
-    "length": 1108
+    "offset": 148898,
+    "length": 699
   },
   {
     "name": "flash/net/SharedObjectFlushStatus",
     "defs": [
       "flash.net:SharedObjectFlushStatus"
     ],
-    "offset": 153681,
+    "offset": 149597,
     "length": 257
   },
   {
     "name": "flash/net/URLLoader",
     "defs": [
       "flash.net:URLLoader"
     ],
-    "offset": 153938,
+    "offset": 149854,
     "length": 435
   },
   {
     "name": "flash/net/Socket",
     "defs": [
       "flash.net:Socket"
     ],
-    "offset": 154373,
+    "offset": 150289,
     "length": 1282
   },
   {
     "name": "flash/net/URLLoaderDataFormat",
     "defs": [
       "flash.net:URLLoaderDataFormat"
     ],
-    "offset": 155655,
+    "offset": 151571,
     "length": 276
   },
   {
     "name": "flash/net/URLRequest",
     "defs": [
       "flash.net:URLRequest"
     ],
-    "offset": 155931,
+    "offset": 151847,
     "length": 379
   },
   {
     "name": "flash/net/URLRequestHeader",
     "defs": [
       "flash.net:URLRequestHeader"
     ],
-    "offset": 156310,
+    "offset": 152226,
     "length": 223
   },
   {
     "name": "flash/net/URLStream",
     "defs": [
       "flash.net:URLStream"
     ],
-    "offset": 156533,
-    "length": 908
+    "offset": 152449,
+    "length": 894
   },
   {
     "name": "flash/net/URLRequestMethod",
     "defs": [
       "flash.net:URLRequestMethod"
     ],
-    "offset": 157441,
+    "offset": 153343,
     "length": 304
   },
   {
     "name": "flash/net/URLVariables",
     "defs": [
       "flash.net:URLVariables"
     ],
-    "offset": 157745,
+    "offset": 153647,
     "length": 245
   },
   {
     "name": "flash/net/XMLSocket",
     "defs": [
       "flash.net:XMLSocket"
     ],
-    "offset": 157990,
+    "offset": 153892,
     "length": 480
   },
   {
     "name": "flash/text/AntiAliasType",
     "defs": [
       "flash.text:AntiAliasType"
     ],
-    "offset": 158470,
+    "offset": 154372,
     "length": 239
   },
   {
     "name": "flash/text/CSMSettings",
     "defs": [
       "flash.text:CSMSettings"
     ],
-    "offset": 158709,
+    "offset": 154611,
     "length": 248
   },
   {
     "name": "flash/text/Font",
     "defs": [
       "flash.text:Font"
     ],
-    "offset": 158957,
+    "offset": 154859,
     "length": 361
   },
   {
     "name": "flash/text/FontStyle",
     "defs": [
       "flash.text:FontStyle"
     ],
-    "offset": 159318,
+    "offset": 155220,
     "length": 292
   },
   {
     "name": "flash/text/FontType",
     "defs": [
       "flash.text:FontType"
     ],
-    "offset": 159610,
+    "offset": 155512,
     "length": 269
   },
   {
     "name": "flash/text/GridFitType",
     "defs": [
       "flash.text:GridFitType"
     ],
-    "offset": 159879,
+    "offset": 155781,
     "length": 258
   },
   {
     "name": "flash/text/StaticText",
     "defs": [
       "flash.text:StaticText"
     ],
-    "offset": 160137,
+    "offset": 156039,
     "length": 299
   },
   {
     "name": "flash/text/StyleSheet",
     "defs": [
       "flash.text:StyleSheet"
     ],
-    "offset": 160436,
+    "offset": 156338,
     "length": 386
   },
   {
     "name": "flash/text/TextColorType",
     "defs": [
       "flash.text:TextColorType"
     ],
-    "offset": 160822,
+    "offset": 156724,
     "length": 241
   },
   {
     "name": "flash/text/TextDisplayMode",
     "defs": [
       "flash.text:TextDisplayMode"
     ],
-    "offset": 161063,
+    "offset": 156965,
     "length": 258
   },
   {
     "name": "flash/text/TextField",
     "defs": [
       "flash.text:TextField"
     ],
-    "offset": 161321,
+    "offset": 157223,
     "length": 2296
   },
   {
     "name": "flash/text/TextFieldAutoSize",
     "defs": [
       "flash.text:TextFieldAutoSize"
     ],
-    "offset": 163617,
+    "offset": 159519,
     "length": 291
   },
   {
     "name": "flash/text/TextFieldType",
     "defs": [
       "flash.text:TextFieldType"
     ],
-    "offset": 163908,
+    "offset": 159810,
     "length": 235
   },
   {
     "name": "flash/text/TextFormat",
     "defs": [
       "flash.text:TextFormat"
     ],
-    "offset": 164143,
+    "offset": 160045,
     "length": 778
   },
   {
     "name": "flash/text/TextFormatAlign",
     "defs": [
       "flash.text:TextFormatAlign"
     ],
-    "offset": 164921,
+    "offset": 160823,
     "length": 343
   },
   {
     "name": "flash/text/TextFormatDisplay",
     "defs": [
       "flash.text:TextFormatDisplay"
     ],
-    "offset": 165264,
+    "offset": 161166,
     "length": 241
   },
   {
     "name": "flash/text/TextInteractionMode",
     "defs": [
       "flash.text:TextInteractionMode"
     ],
-    "offset": 165505,
+    "offset": 161407,
     "length": 253
   },
   {
     "name": "flash/text/TextLineMetrics",
     "defs": [
       "flash.text:TextLineMetrics"
     ],
-    "offset": 165758,
+    "offset": 161660,
     "length": 300
   },
   {
     "name": "flash/text/TextRenderer",
     "defs": [
       "flash.text:TextRenderer"
     ],
-    "offset": 166058,
+    "offset": 161960,
     "length": 373
   },
   {
     "name": "flash/text/TextRun",
     "defs": [
       "flash.text:TextRun"
     ],
-    "offset": 166431,
+    "offset": 162333,
     "length": 294
   },
   {
     "name": "flash/text/TextSnapshot",
     "defs": [
       "flash.text:TextSnapshot"
     ],
-    "offset": 166725,
+    "offset": 162627,
     "length": 513
   },
   {
     "name": "flash/text/engine/BreakOpportunity",
     "defs": [
       "flash.text.engine:BreakOpportunity"
     ],
-    "offset": 167238,
+    "offset": 163140,
     "length": 293
   },
   {
     "name": "flash/text/engine/CFFHinting",
     "defs": [
       "flash.text.engine:CFFHinting"
     ],
-    "offset": 167531,
+    "offset": 163433,
     "length": 256
   },
   {
     "name": "flash/text/engine/ContentElement",
     "defs": [
       "flash.text.engine:ContentElement"
     ],
-    "offset": 167787,
+    "offset": 163689,
     "length": 624
   },
   {
     "name": "flash/text/engine/DigitCase",
     "defs": [
       "flash.text.engine:DigitCase"
     ],
-    "offset": 168411,
+    "offset": 164313,
     "length": 277
   },
   {
     "name": "flash/text/engine/DigitWidth",
     "defs": [
       "flash.text.engine:DigitWidth"
     ],
-    "offset": 168688,
+    "offset": 164590,
     "length": 288
   },
   {
     "name": "flash/text/engine/EastAsianJustifier",
     "defs": [
       "flash.text.engine:EastAsianJustifier"
     ],
-    "offset": 168976,
+    "offset": 164878,
     "length": 495
   },
   {
     "name": "flash/text/engine/ElementFormat",
     "defs": [
       "flash.text.engine:ElementFormat"
     ],
-    "offset": 169471,
+    "offset": 165373,
     "length": 1204
   },
   {
     "name": "flash/text/engine/FontDescription",
     "defs": [
       "flash.text.engine:FontDescription"
     ],
-    "offset": 170675,
+    "offset": 166577,
     "length": 672
   },
   {
     "name": "flash/text/engine/FontLookup",
     "defs": [
       "flash.text.engine:FontLookup"
     ],
-    "offset": 171347,
+    "offset": 167249,
     "length": 254
   },
   {
     "name": "flash/text/engine/FontMetrics",
     "defs": [
       "flash.text.engine:FontMetrics"
     ],
-    "offset": 171601,
+    "offset": 167503,
     "length": 512
   },
   {
     "name": "flash/text/engine/FontPosture",
     "defs": [
       "flash.text.engine:FontPosture"
     ],
-    "offset": 172113,
+    "offset": 168015,
     "length": 245
   },
   {
     "name": "flash/text/engine/FontWeight",
     "defs": [
       "flash.text.engine:FontWeight"
     ],
-    "offset": 172358,
+    "offset": 168260,
     "length": 239
   },
   {
     "name": "flash/text/engine/GraphicElement",
     "defs": [
       "flash.text.engine:GraphicElement"
     ],
-    "offset": 172597,
+    "offset": 168499,
     "length": 497
   },
   {
     "name": "flash/text/engine/GroupElement",
     "defs": [
       "flash.text.engine:GroupElement"
     ],
-    "offset": 173094,
+    "offset": 168996,
     "length": 714
   },
   {
     "name": "flash/text/engine/JustificationStyle",
     "defs": [
       "flash.text.engine:JustificationStyle"
     ],
-    "offset": 173808,
+    "offset": 169710,
     "length": 356
   },
   {
     "name": "flash/text/engine/Kerning",
     "defs": [
       "flash.text.engine:Kerning"
     ],
-    "offset": 174164,
+    "offset": 170066,
     "length": 248
   },
   {
     "name": "flash/text/engine/LigatureLevel",
     "defs": [
       "flash.text.engine:LigatureLevel"
     ],
-    "offset": 174412,
+    "offset": 170314,
     "length": 338
   },
   {
     "name": "flash/text/engine/LineJustification",
     "defs": [
       "flash.text.engine:LineJustification"
     ],
-    "offset": 174750,
+    "offset": 170652,
     "length": 388
   },
   {
     "name": "flash/text/engine/RenderingMode",
     "defs": [
       "flash.text.engine:RenderingMode"
     ],
-    "offset": 175138,
+    "offset": 171040,
     "length": 243
   },
   {
     "name": "flash/text/engine/SpaceJustifier",
     "defs": [
       "flash.text.engine:SpaceJustifier"
     ],
-    "offset": 175381,
+    "offset": 171283,
     "length": 527
   },
   {
     "name": "flash/text/engine/TabAlignment",
     "defs": [
       "flash.text.engine:TabAlignment"
     ],
-    "offset": 175908,
+    "offset": 171810,
     "length": 299
   },
   {
     "name": "flash/text/engine/TabStop",
     "defs": [
       "flash.text.engine:TabStop"
     ],
-    "offset": 176207,
+    "offset": 172109,
     "length": 357
   },
   {
     "name": "flash/text/engine/TextBaseline",
     "defs": [
       "flash.text.engine:TextBaseline"
     ],
-    "offset": 176564,
+    "offset": 172466,
     "length": 483
   },
   {
     "name": "flash/text/engine/TextBlock",
     "defs": [
       "flash.text.engine:TextBlock"
     ],
-    "offset": 177047,
+    "offset": 172949,
     "length": 2184
   },
   {
     "name": "flash/text/engine/TextElement",
     "defs": [
       "flash.text.engine:TextElement"
     ],
-    "offset": 179231,
+    "offset": 175133,
     "length": 383
   },
   {
     "name": "flash/text/engine/TextJustifier",
     "defs": [
       "flash.text.engine:TextJustifier"
     ],
-    "offset": 179614,
+    "offset": 175516,
     "length": 774
   },
   {
     "name": "flash/text/engine/TextLine",
     "defs": [
       "flash.text.engine:TextLine"
     ],
-    "offset": 180388,
+    "offset": 176290,
     "length": 2027
   },
   {
     "name": "flash/text/engine/TextLineCreationResult",
     "defs": [
       "flash.text.engine:TextLineCreationResult"
     ],
-    "offset": 182415,
+    "offset": 178317,
     "length": 360
   },
   {
     "name": "flash/text/engine/TextLineMirrorRegion",
     "defs": [
       "flash.text.engine:TextLineMirrorRegion"
     ],
-    "offset": 182775,
+    "offset": 178677,
     "length": 451
   },
   {
     "name": "flash/text/engine/TextLineValidity",
     "defs": [
       "flash.text.engine:TextLineValidity"
     ],
-    "offset": 183226,
+    "offset": 179128,
     "length": 332
   },
   {
     "name": "flash/text/engine/TextRotation",
     "defs": [
       "flash.text.engine:TextRotation"
     ],
-    "offset": 183558,
+    "offset": 179460,
     "length": 352
   },
   {
     "name": "flash/text/engine/TypographicCase",
     "defs": [
       "flash.text.engine:TypographicCase"
     ],
-    "offset": 183910,
+    "offset": 179812,
     "length": 436
   },
   {
     "name": "flash/text/ime/CompositionAttributeRange",
     "defs": [
       "flash.text.ime:CompositionAttributeRange"
     ],
-    "offset": 184346,
+    "offset": 180248,
     "length": 315
   },
   {
     "name": "flash/text/ime/IIMEClient",
     "defs": [
       "flash.text.ime:IIMEClient"
     ],
-    "offset": 184661,
+    "offset": 180563,
     "length": 525
   },
   {
     "name": "flash/net/FlashNetScript",
     "defs": [
       "flash.net:navigateToURL",
       "flash.net:sendToURL",
       "flash.net:registerClassAlias",
       "flash.net:getClassByAlias"
     ],
-    "offset": 185186,
+    "offset": 181088,
     "length": 343
   },
   {
     "name": "flash/utils/FlashUtilScript",
     "defs": [
       "flash.utils:describeType",
       "flash.utils:getAliasName",
       "flash.utils:getQualifiedClassName",
       "flash.utils:getDefinitionByName",
       "flash.utils:getQualifiedSuperclassName",
       "flash.utils:getTimer",
       "flash.utils:escapeMultiByte",
       "flash.utils:unescapeMultiByte"
     ],
-    "offset": 185529,
+    "offset": 181431,
     "length": 545
   },
   {
     "name": "flash/utils/Endian",
     "defs": [
       "flash.utils:Endian"
     ],
-    "offset": 186074,
+    "offset": 181976,
     "length": 243
   },
   {
     "name": "flash/utils/IExternalizable",
     "defs": [
       "flash.utils:IExternalizable"
     ],
-    "offset": 186317,
+    "offset": 182219,
     "length": 223
   },
   {
     "name": "flash/utils/Timer",
     "defs": [
       "flash.utils:Timer"
     ],
-    "offset": 186540,
+    "offset": 182442,
     "length": 400
   },
   {
     "name": "flash/utils/SetIntervalTimer",
     "defs": [
       "flash.utils:SetIntervalTimer",
       "flash.utils:setInterval",
       "flash.utils:setTimeout",
       "flash.utils:clearInterval",
       "flash.utils:clearTimeout"
     ],
-    "offset": 186940,
+    "offset": 182842,
     "length": 995
   }
 ]
\ No newline at end of file
--- a/browser/extensions/shumway/content/shumway.gfx.js
+++ b/browser/extensions/shumway/content/shumway.gfx.js
@@ -11,74 +11,74 @@
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
 */
 console.time("Load Shared Dependencies");
 var Shumway, Shumway$$inline_0 = Shumway || (Shumway = {});
-Shumway$$inline_0.version = "0.10.346";
-Shumway$$inline_0.build = "84cafb5";
+Shumway$$inline_0.version = "0.11.422";
+Shumway$$inline_0.build = "137ba70";
 var jsGlobal = function() {
   return this || (0,eval)("this//# sourceURL=jsGlobal-getter");
 }(), inBrowser = "undefined" !== typeof window && "document" in window && "plugins" in window.document, inFirefox = "undefined" !== typeof navigator && 0 <= navigator.userAgent.indexOf("Firefox");
-function dumpLine(k) {
-}
 jsGlobal.performance || (jsGlobal.performance = {});
-jsGlobal.performance.now || (jsGlobal.performance.now = "undefined" !== typeof dateNow ? dateNow : Date.now);
-function lazyInitializer(k, r, g) {
-  Object.defineProperty(k, r, {get:function() {
-    var b = g();
-    Object.defineProperty(k, r, {value:b, configurable:!0, enumerable:!0});
-    return b;
+jsGlobal.performance.now || (jsGlobal.performance.now = function() {
+  return Date.now();
+});
+function lazyInitializer(k, p, u) {
+  Object.defineProperty(k, p, {get:function() {
+    var a = u();
+    Object.defineProperty(k, p, {value:a, configurable:!0, enumerable:!0});
+    return a;
   }, configurable:!0, enumerable:!0});
 }
 var START_TIME = performance.now();
 (function(k) {
-  function r(e) {
+  function p(e) {
     return (e | 0) === e;
   }
-  function g(e) {
+  function u(e) {
     return "object" === typeof e || "function" === typeof e;
   }
-  function b(e) {
+  function a(e) {
     return String(Number(e)) === e;
   }
-  function v(e) {
-    var f = 0;
+  function w(e) {
+    var g = 0;
     if ("number" === typeof e) {
-      return f = e | 0, e === f && 0 <= f ? !0 : e >>> 0 === e;
+      return g = e | 0, e === g && 0 <= g ? !0 : e >>> 0 === e;
     }
     if ("string" !== typeof e) {
       return !1;
     }
-    var c = e.length;
-    if (0 === c) {
+    var d = e.length;
+    if (0 === d) {
       return !1;
     }
     if ("0" === e) {
       return !0;
     }
-    if (c > k.UINT32_CHAR_BUFFER_LENGTH) {
+    if (d > k.UINT32_CHAR_BUFFER_LENGTH) {
       return !1;
     }
-    var d = 0, f = e.charCodeAt(d++) - 48;
-    if (1 > f || 9 < f) {
+    var c = 0, g = e.charCodeAt(c++) - 48;
+    if (1 > g || 9 < g) {
       return !1;
     }
-    for (var q = 0, u = 0;d < c;) {
-      u = e.charCodeAt(d++) - 48;
-      if (0 > u || 9 < u) {
+    for (var f = 0, y = 0;c < d;) {
+      y = e.charCodeAt(c++) - 48;
+      if (0 > y || 9 < y) {
         return !1;
       }
-      q = f;
-      f = 10 * f + u;
-    }
-    return q < k.UINT32_MAX_DIV_10 || q === k.UINT32_MAX_DIV_10 && u <= k.UINT32_MAX_MOD_10 ? !0 : !1;
+      f = g;
+      g = 10 * g + y;
+    }
+    return f < k.UINT32_MAX_DIV_10 || f === k.UINT32_MAX_DIV_10 && y <= k.UINT32_MAX_MOD_10 ? !0 : !1;
   }
   (function(e) {
     e[e._0 = 48] = "_0";
     e[e._1 = 49] = "_1";
     e[e._2 = 50] = "_2";
     e[e._3 = 51] = "_3";
     e[e._4 = 52] = "_4";
     e[e._5 = 53] = "_5";
@@ -95,1463 +95,1563 @@ var START_TIME = performance.now();
     return "string" === typeof e;
   };
   k.isFunction = function(e) {
     return "function" === typeof e;
   };
   k.isNumber = function(e) {
     return "number" === typeof e;
   };
-  k.isInteger = r;
+  k.isInteger = p;
   k.isArray = function(e) {
     return e instanceof Array;
   };
   k.isNumberOrString = function(e) {
     return "number" === typeof e || "string" === typeof e;
   };
-  k.isObject = g;
+  k.isObject = u;
   k.toNumber = function(e) {
     return +e;
   };
-  k.isNumericString = b;
+  k.isNumericString = a;
   k.isNumeric = function(e) {
     if ("number" === typeof e) {
       return !0;
     }
     if ("string" === typeof e) {
-      var f = e.charCodeAt(0);
-      return 65 <= f && 90 >= f || 97 <= f && 122 >= f || 36 === f || 95 === f ? !1 : v(e) || b(e);
+      var g = e.charCodeAt(0);
+      return 65 <= g && 90 >= g || 97 <= g && 122 >= g || 36 === g || 95 === g ? !1 : w(e) || a(e);
     }
     return !1;
   };
-  k.isIndex = v;
+  k.isIndex = w;
   k.isNullOrUndefined = function(e) {
     return void 0 == e;
   };
-  var n;
+  k.argumentsToString = function(e) {
+    for (var g = [], d = 0;d < e.length;d++) {
+      var c = e[d];
+      try {
+        var f;
+        f = "object" === typeof c && c ? "toString" in c ? c.toString() : Object.prototype.toString.call(c) : c + "";
+        g.push(f);
+      } catch (y) {
+        g.push("<unprintable value>");
+      }
+    }
+    return g.join(", ");
+  };
+  var m;
   (function(e) {
     e.error = function(c) {
       console.error(c);
       throw Error(c);
     };
-    e.assert = function(c, d) {
-      void 0 === d && (d = "assertion failed");
+    e.assert = function(c, f) {
+      void 0 === f && (f = "assertion failed");
       "" === c && (c = !0);
       if (!c) {
         if ("undefined" !== typeof console && "assert" in console) {
-          throw console.assert(!1, d), Error(d);
-        }
-        e.error(d.toString());
+          throw console.assert(!1, f), Error(f);
+        }
+        e.error(f.toString());
       }
     };
     e.assertUnreachable = function(c) {
-      throw Error("Reached unreachable location " + Error().stack.split("\n")[1] + c);
-    };
-    e.assertNotImplemented = function(c, d) {
-      c || e.error("notImplemented: " + d);
-    };
-    e.warning = function(c, d, q) {
+      var f = Error().stack.split("\n")[1];
+      throw Error("Reached unreachable location " + f + c);
+    };
+    e.assertNotImplemented = function(c, f) {
+      c || e.error("notImplemented: " + f);
+    };
+    var g = Object.create(null);
+    e.warning = function(c, f, d) {
+    };
+    e.warnCounts = function() {
+      var c = [], f;
+      for (f in g) {
+        c.push({key:f, count:g[f]});
+      }
+      c.sort(function(f, c) {
+        return c.count - f.count;
+      });
+      return c.reduce(function(f, c) {
+        return f + ("\n" + c.count + "\t" + c.key);
+      }, "");
     };
     e.notUsed = function(c) {
     };
     e.notImplemented = function(c) {
     };
     e.dummyConstructor = function(c) {
     };
     e.abstractMethod = function(c) {
     };
-    var f = {};
+    var d = {};
     e.somewhatImplemented = function(c) {
-      f[c] || (f[c] = !0);
+      d[c] || (d[c] = !0, e.warning("somewhatImplemented: " + c));
     };
     e.unexpected = function(c) {
       e.assert(!1, "Unexpected: " + c);
     };
     e.unexpectedCase = function(c) {
       e.assert(!1, "Unexpected Case: " + c);
     };
-  })(n = k.Debug || (k.Debug = {}));
+  })(m = k.Debug || (k.Debug = {}));
   k.getTicks = function() {
     return performance.now();
   };
   (function(e) {
-    function f(d, c) {
-      for (var u = 0, f = d.length;u < f;u++) {
-        if (d[u] === c) {
-          return u;
-        }
-      }
-      d.push(c);
-      return d.length - 1;
-    }
-    e.popManyInto = function(d, c, u) {
-      for (var f = c - 1;0 <= f;f--) {
-        u[f] = d.pop();
-      }
-      u.length = c;
-    };
-    e.popMany = function(d, c) {
-      var u = d.length - c, f = d.slice(u, this.length);
-      d.length = u;
-      return f;
-    };
-    e.popManyIntoVoid = function(d, c) {
-      d.length -= c;
-    };
-    e.pushMany = function(d, c) {
-      for (var u = 0;u < c.length;u++) {
-        d.push(c[u]);
-      }
-    };
-    e.top = function(d) {
-      return d.length && d[d.length - 1];
-    };
-    e.last = function(d) {
-      return d.length && d[d.length - 1];
-    };
-    e.peek = function(d) {
-      return d[d.length - 1];
-    };
-    e.indexOf = function(d, c) {
-      for (var u = 0, f = d.length;u < f;u++) {
-        if (d[u] === c) {
-          return u;
+    function g(c, f) {
+      for (var d = 0, x = c.length;d < x;d++) {
+        if (c[d] === f) {
+          return d;
+        }
+      }
+      c.push(f);
+      return c.length - 1;
+    }
+    e.popManyInto = function(c, f, d) {
+      for (var x = f - 1;0 <= x;x--) {
+        d[x] = c.pop();
+      }
+      d.length = f;
+    };
+    e.popMany = function(c, f) {
+      var d = c.length - f, x = c.slice(d, this.length);
+      c.length = d;
+      return x;
+    };
+    e.popManyIntoVoid = function(c, f) {
+      c.length -= f;
+    };
+    e.pushMany = function(c, f) {
+      for (var d = 0;d < f.length;d++) {
+        c.push(f[d]);
+      }
+    };
+    e.top = function(c) {
+      return c.length && c[c.length - 1];
+    };
+    e.last = function(c) {
+      return c.length && c[c.length - 1];
+    };
+    e.peek = function(c) {
+      return c[c.length - 1];
+    };
+    e.indexOf = function(c, f) {
+      for (var d = 0, x = c.length;d < x;d++) {
+        if (c[d] === f) {
+          return d;
         }
       }
       return -1;
     };
-    e.equals = function(d, c) {
-      if (d.length !== c.length) {
+    e.equals = function(c, f) {
+      if (c.length !== f.length) {
         return !1;
       }
-      for (var u = 0;u < d.length;u++) {
-        if (d[u] !== c[u]) {
+      for (var d = 0;d < c.length;d++) {
+        if (c[d] !== f[d]) {
           return !1;
         }
       }
       return !0;
     };
-    e.pushUnique = f;
-    e.unique = function(d) {
-      for (var c = [], u = 0;u < d.length;u++) {
-        f(c, d[u]);
+    e.pushUnique = g;
+    e.unique = function(c) {
+      for (var f = [], d = 0;d < c.length;d++) {
+        g(f, c[d]);
+      }
+      return f;
+    };
+    e.copyFrom = function(c, f) {
+      c.length = 0;
+      e.pushMany(c, f);
+    };
+    e.ensureTypedArrayCapacity = function(c, f) {
+      if (c.length < f) {
+        var d = c;
+        c = new c.constructor(k.IntegerUtilities.nearestPowerOfTwo(f));
+        c.set(d, 0);
       }
       return c;
     };
-    e.copyFrom = function(d, c) {
-      d.length = 0;
-      e.pushMany(d, c);
-    };
-    e.ensureTypedArrayCapacity = function(d, c) {
-      if (d.length < c) {
-        var u = d;
-        d = new d.constructor(k.IntegerUtilities.nearestPowerOfTwo(c));
-        d.set(u, 0);
-      }
-      return d;
-    };
-    e.memCopy = function(d, c, u, f, e) {
-      void 0 === u && (u = 0);
-      void 0 === f && (f = 0);
-      void 0 === e && (e = 0);
-      0 < f || 0 < e && e < c.length ? (0 >= e && (e = c.length - f), d.set(c.subarray(f, f + e), u)) : d.set(c, u);
-    };
-    var c = function() {
-      function d(d) {
-        void 0 === d && (d = 16);
+    e.memCopy = function(c, f, d, x, g) {
+      void 0 === d && (d = 0);
+      void 0 === x && (x = 0);
+      void 0 === g && (g = 0);
+      0 < x || 0 < g && g < f.length ? (0 >= g && (g = f.length - x), c.set(f.subarray(x, x + g), d)) : c.set(f, d);
+    };
+    var d = function() {
+      function c(f) {
+        void 0 === f && (f = 16);
         this._f32 = this._i32 = this._u16 = this._u8 = null;
         this._offset = 0;
-        this.ensureCapacity(d);
-      }
-      d.prototype.reset = function() {
+        this.ensureCapacity(f);
+      }
+      c.prototype.reset = function() {
         this._offset = 0;
       };
-      Object.defineProperty(d.prototype, "offset", {get:function() {
+      Object.defineProperty(c.prototype, "offset", {get:function() {
         return this._offset;
       }, enumerable:!0, configurable:!0});
-      d.prototype.getIndex = function(d) {
-        return this._offset / d;
-      };
-      d.prototype.ensureAdditionalCapacity = function() {
-        this.ensureCapacity(this._offset + 68);
-      };
-      d.prototype.ensureCapacity = function(d) {
+      c.prototype.getIndex = function(f) {
+        return this._offset / f;
+      };
+      c.prototype.ensureAdditionalCapacity = function(f) {
+        this.ensureCapacity(this._offset + f);
+      };
+      c.prototype.ensureCapacity = function(f) {
         if (!this._u8) {
-          this._u8 = new Uint8Array(d);
+          this._u8 = new Uint8Array(f);
         } else {
-          if (this._u8.length > d) {
+          if (this._u8.length > f) {
             return;
           }
         }
         var c = 2 * this._u8.length;
-        c < d && (c = d);
-        d = new Uint8Array(c);
-        d.set(this._u8, 0);
-        this._u8 = d;
-        this._u16 = new Uint16Array(d.buffer);
-        this._i32 = new Int32Array(d.buffer);
-        this._f32 = new Float32Array(d.buffer);
-      };
-      d.prototype.writeInt = function(d) {
+        c < f && (c = f);
+        f = new Uint8Array(c);
+        f.set(this._u8, 0);
+        this._u8 = f;
+        this._u16 = new Uint16Array(f.buffer);
+        this._i32 = new Int32Array(f.buffer);
+        this._f32 = new Float32Array(f.buffer);
+      };
+      c.prototype.writeInt = function(f) {
         this.ensureCapacity(this._offset + 4);
-        this.writeIntUnsafe(d);
-      };
-      d.prototype.writeIntAt = function(d, c) {
+        this.writeIntUnsafe(f);
+      };
+      c.prototype.writeIntAt = function(f, c) {
         this.ensureCapacity(c + 4);
-        this._i32[c >> 2] = d;
-      };
-      d.prototype.writeIntUnsafe = function(d) {
-        this._i32[this._offset >> 2] = d;
+        this._i32[c >> 2] = f;
+      };
+      c.prototype.writeIntUnsafe = function(f) {
+        this._i32[this._offset >> 2] = f;
         this._offset += 4;
       };
-      d.prototype.writeFloat = function(d) {
+      c.prototype.writeFloat = function(f) {
         this.ensureCapacity(this._offset + 4);
-        this.writeFloatUnsafe(d);
-      };
-      d.prototype.writeFloatUnsafe = function(d) {
-        this._f32[this._offset >> 2] = d;
+        this.writeFloatUnsafe(f);
+      };
+      c.prototype.writeFloatUnsafe = function(f) {
+        this._f32[this._offset >> 2] = f;
         this._offset += 4;
       };
-      d.prototype.write4Floats = function(d, c, f, e) {
+      c.prototype.write4Floats = function(f, c, d, g) {
         this.ensureCapacity(this._offset + 16);
-        this.write4FloatsUnsafe(d, c, f, e);
-      };
-      d.prototype.write4FloatsUnsafe = function(d, c, f, e) {
-        var a = this._offset >> 2;
-        this._f32[a + 0] = d;
-        this._f32[a + 1] = c;
-        this._f32[a + 2] = f;
-        this._f32[a + 3] = e;
+        this.write4FloatsUnsafe(f, c, d, g);
+      };
+      c.prototype.write4FloatsUnsafe = function(f, c, d, g) {
+        var e = this._offset >> 2;
+        this._f32[e + 0] = f;
+        this._f32[e + 1] = c;
+        this._f32[e + 2] = d;
+        this._f32[e + 3] = g;
         this._offset += 16;
       };
-      d.prototype.write6Floats = function(d, c, f, e, a, h) {
+      c.prototype.write6Floats = function(f, c, d, g, e, b) {
         this.ensureCapacity(this._offset + 24);
-        this.write6FloatsUnsafe(d, c, f, e, a, h);
-      };
-      d.prototype.write6FloatsUnsafe = function(d, c, f, e, a, h) {
-        var p = this._offset >> 2;
-        this._f32[p + 0] = d;
-        this._f32[p + 1] = c;
-        this._f32[p + 2] = f;
-        this._f32[p + 3] = e;
-        this._f32[p + 4] = a;
-        this._f32[p + 5] = h;
+        this.write6FloatsUnsafe(f, c, d, g, e, b);
+      };
+      c.prototype.write6FloatsUnsafe = function(f, c, d, g, e, b) {
+        var a = this._offset >> 2;
+        this._f32[a + 0] = f;
+        this._f32[a + 1] = c;
+        this._f32[a + 2] = d;
+        this._f32[a + 3] = g;
+        this._f32[a + 4] = e;
+        this._f32[a + 5] = b;
         this._offset += 24;
       };
-      d.prototype.subF32View = function() {
+      c.prototype.subF32View = function() {
         return this._f32.subarray(0, this._offset >> 2);
       };
-      d.prototype.subI32View = function() {
+      c.prototype.subI32View = function() {
         return this._i32.subarray(0, this._offset >> 2);
       };
-      d.prototype.subU16View = function() {
+      c.prototype.subU16View = function() {
         return this._u16.subarray(0, this._offset >> 1);
       };
-      d.prototype.subU8View = function() {
+      c.prototype.subU8View = function() {
         return this._u8.subarray(0, this._offset);
       };
-      d.prototype.hashWords = function(d, c, f) {
+      c.prototype.hashWords = function(f, c, d) {
         c = this._i32;
-        for (var e = 0;e < f;e++) {
-          d = (31 * d | 0) + c[e] | 0;
-        }
-        return d;
-      };
-      d.prototype.reserve = function(d) {
-        d = d + 3 & -4;
-        this.ensureCapacity(this._offset + d);
-        this._offset += d;
-      };
-      return d;
+        for (var g = 0;g < d;g++) {
+          f = (31 * f | 0) + c[g] | 0;
+        }
+        return f;
+      };
+      c.prototype.reserve = function(f) {
+        f = f + 3 & -4;
+        this.ensureCapacity(this._offset + f);
+        this._offset += f;
+      };
+      return c;
     }();
-    e.ArrayWriter = c;
+    e.ArrayWriter = d;
   })(k.ArrayUtilities || (k.ArrayUtilities = {}));
-  var a = function() {
-    function e(f) {
-      this._u8 = new Uint8Array(f);
-      this._u16 = new Uint16Array(f);
-      this._i32 = new Int32Array(f);
-      this._f32 = new Float32Array(f);
+  var b = function() {
+    function e(g) {
+      this._u8 = new Uint8Array(g);
+      this._u16 = new Uint16Array(g);
+      this._i32 = new Int32Array(g);
+      this._f32 = new Float32Array(g);
       this._offset = 0;
     }
     Object.defineProperty(e.prototype, "offset", {get:function() {
       return this._offset;
     }, enumerable:!0, configurable:!0});
     e.prototype.isEmpty = function() {
       return this._offset === this._u8.length;
     };
     e.prototype.readInt = function() {
-      var f = this._i32[this._offset >> 2];
+      var g = this._i32[this._offset >> 2];
       this._offset += 4;
-      return f;
+      return g;
     };
     e.prototype.readFloat = function() {
-      var f = this._f32[this._offset >> 2];
+      var g = this._f32[this._offset >> 2];
       this._offset += 4;
-      return f;
+      return g;
     };
     return e;
   }();
-  k.ArrayReader = a;
+  k.ArrayReader = b;
   (function(e) {
-    function f(d, c) {
-      return Object.prototype.hasOwnProperty.call(d, c);
-    }
-    function c(d, c) {
-      for (var u in c) {
-        f(c, u) && (d[u] = c[u]);
-      }
-    }
-    e.boxValue = function(d) {
-      return void 0 == d || g(d) ? d : Object(d);
-    };
-    e.toKeyValueArray = function(d) {
-      var c = Object.prototype.hasOwnProperty, f = [], e;
-      for (e in d) {
-        c.call(d, e) && f.push([e, d[e]]);
-      }
-      return f;
-    };
-    e.isPrototypeWriteable = function(d) {
-      return Object.getOwnPropertyDescriptor(d, "prototype").writable;
-    };
-    e.hasOwnProperty = f;
-    e.propertyIsEnumerable = function(d, c) {
-      return Object.prototype.propertyIsEnumerable.call(d, c);
-    };
-    e.getOwnPropertyDescriptor = function(d, c) {
-      return Object.getOwnPropertyDescriptor(d, c);
-    };
-    e.hasOwnGetter = function(d, c) {
-      var f = Object.getOwnPropertyDescriptor(d, c);
-      return !(!f || !f.get);
-    };
-    e.getOwnGetter = function(d, c) {
-      var f = Object.getOwnPropertyDescriptor(d, c);
-      return f ? f.get : null;
-    };
-    e.hasOwnSetter = function(d, c) {
-      var f = Object.getOwnPropertyDescriptor(d, c);
-      return !(!f || !f.set);
+    function g(c, f) {
+      return Object.prototype.hasOwnProperty.call(c, f);
+    }
+    function d(c, f) {
+      for (var d in f) {
+        g(f, d) && (c[d] = f[d]);
+      }
+    }
+    e.boxValue = function(c) {
+      return void 0 == c || u(c) ? c : Object(c);
+    };
+    e.toKeyValueArray = function(c) {
+      var f = Object.prototype.hasOwnProperty, d = [], g;
+      for (g in c) {
+        f.call(c, g) && d.push([g, c[g]]);
+      }
+      return d;
+    };
+    e.isPrototypeWriteable = function(c) {
+      return Object.getOwnPropertyDescriptor(c, "prototype").writable;
+    };
+    e.hasOwnProperty = g;
+    e.propertyIsEnumerable = function(c, f) {
+      return Object.prototype.propertyIsEnumerable.call(c, f);
+    };
+    e.getPropertyDescriptor = function(c, f) {
+      do {
+        var d = Object.getOwnPropertyDescriptor(c, f);
+        if (d) {
+          return d;
+        }
+        c = Object.getPrototypeOf(c);
+      } while (c);
+      return null;
+    };
+    e.hasOwnGetter = function(c, f) {
+      var d = Object.getOwnPropertyDescriptor(c, f);
+      return !(!d || !d.get);
+    };
+    e.getOwnGetter = function(c, f) {
+      var d = Object.getOwnPropertyDescriptor(c, f);
+      return d ? d.get : null;
+    };
+    e.hasOwnSetter = function(c, f) {
+      var d = Object.getOwnPropertyDescriptor(c, f);
+      return !(!d || !d.set);
     };
     e.createMap = function() {
       return Object.create(null);
     };
     e.createArrayMap = function() {
       return [];
     };
-    e.defineReadOnlyProperty = function(d, c, f) {
-      Object.defineProperty(d, c, {value:f, writable:!1, configurable:!0, enumerable:!1});
-    };
-    e.getOwnPropertyDescriptors = function(d) {
-      for (var c = e.createMap(), f = Object.getOwnPropertyNames(d), a = 0;a < f.length;a++) {
-        c[f[a]] = Object.getOwnPropertyDescriptor(d, f[a]);
-      }
-      return c;
-    };
-    e.cloneObject = function(d) {
-      var q = Object.create(Object.getPrototypeOf(d));
-      c(q, d);
-      return q;
-    };
-    e.copyProperties = function(d, c) {
-      for (var f in c) {
-        d[f] = c[f];
-      }
-    };
-    e.copyOwnProperties = c;
-    e.copyOwnPropertyDescriptors = function(d, c, u) {
-      void 0 === u && (u = !0);
-      for (var e in c) {
-        if (f(c, e)) {
-          var a = Object.getOwnPropertyDescriptor(c, e);
-          if (u || !f(d, e)) {
-            try {
-              Object.defineProperty(d, e, a);
-            } catch (h) {
-            }
-          }
-        }
-      }
-    };
-    e.getLatestGetterOrSetterPropertyDescriptor = function(d, c) {
-      for (var f = {};d;) {
-        var e = Object.getOwnPropertyDescriptor(d, c);
-        e && (f.get = f.get || e.get, f.set = f.set || e.set);
-        if (f.get && f.set) {
-          break;
-        }
-        d = Object.getPrototypeOf(d);
+    e.defineReadOnlyProperty = function(c, f, d) {
+      Object.defineProperty(c, f, {value:d, writable:!1, configurable:!0, enumerable:!1});
+    };
+    e.getOwnPropertyDescriptors = function(c) {
+      for (var f = e.createMap(), d = Object.getOwnPropertyNames(c), g = 0;g < d.length;g++) {
+        f[d[g]] = Object.getOwnPropertyDescriptor(c, d[g]);
       }
       return f;
     };
-    e.defineNonEnumerableGetterOrSetter = function(d, c, f, a) {
-      var h = e.getLatestGetterOrSetterPropertyDescriptor(d, c);
-      h.configurable = !0;
-      h.enumerable = !1;
-      a ? h.get = f : h.set = f;
-      Object.defineProperty(d, c, h);
-    };
-    e.defineNonEnumerableGetter = function(d, c, f) {
-      Object.defineProperty(d, c, {get:f, configurable:!0, enumerable:!1});
-    };
-    e.defineNonEnumerableSetter = function(d, c, f) {
-      Object.defineProperty(d, c, {set:f, configurable:!0, enumerable:!1});
-    };
-    e.defineNonEnumerableProperty = function(d, c, f) {
-      Object.defineProperty(d, c, {value:f, writable:!0, configurable:!0, enumerable:!1});
-    };
-    e.defineNonEnumerableForwardingProperty = function(d, c, f) {
-      Object.defineProperty(d, c, {get:h.makeForwardingGetter(f), set:h.makeForwardingSetter(f), writable:!0, configurable:!0, enumerable:!1});
-    };
-    e.defineNewNonEnumerableProperty = function(d, c, f) {
-      e.defineNonEnumerableProperty(d, c, f);
-    };
-    e.createPublicAliases = function(d, c) {
-      for (var f = {value:null, writable:!0, configurable:!0, enumerable:!1}, e = 0;e < c.length;e++) {
-        var a = c[e];
-        f.value = d[a];
-        Object.defineProperty(d, "$Bg" + a, f);
+    e.cloneObject = function(c) {
+      var f = Object.create(Object.getPrototypeOf(c));
+      d(f, c);
+      return f;
+    };
+    e.copyProperties = function(c, f) {
+      for (var d in f) {
+        c[d] = f[d];
+      }
+    };
+    e.copyOwnProperties = d;
+    e.copyOwnPropertyDescriptors = function(c, f, d, e, b) {
+      void 0 === d && (d = null);
+      void 0 === e && (e = !0);
+      void 0 === b && (b = !1);
+      for (var a in f) {
+        if (g(f, a) && (!d || d(a))) {
+          var l = Object.getOwnPropertyDescriptor(f, a);
+          if (e || !g(c, a)) {
+            try {
+              b && !1 === l.writable && (l.writable = !0), Object.defineProperty(c, a, l);
+            } catch (h) {
+              m.assert("Can't define: " + a);
+            }
+          }
+        }
+      }
+    };
+    e.copyPropertiesByList = function(c, f, d) {
+      for (var g = 0;g < d.length;g++) {
+        var e = d[g];
+        c[e] = f[e];
+      }
+    };
+    e.getLatestGetterOrSetterPropertyDescriptor = function(c, f) {
+      for (var d = {};c;) {
+        var g = Object.getOwnPropertyDescriptor(c, f);
+        g && (d.get = d.get || g.get, d.set = d.set || g.set);
+        if (d.get && d.set) {
+          break;
+        }
+        c = Object.getPrototypeOf(c);
+      }
+      return d;
+    };
+    e.defineNonEnumerableGetterOrSetter = function(c, f, d, g) {
+      var b = e.getLatestGetterOrSetterPropertyDescriptor(c, f);
+      b.configurable = !0;
+      b.enumerable = !1;
+      g ? b.get = d : b.set = d;
+      Object.defineProperty(c, f, b);
+    };
+    e.defineNonEnumerableGetter = function(c, f, d) {
+      Object.defineProperty(c, f, {get:d, configurable:!0, enumerable:!1});
+    };
+    e.defineNonEnumerableSetter = function(c, f, d) {
+      Object.defineProperty(c, f, {set:d, configurable:!0, enumerable:!1});
+    };
+    e.defineNonEnumerableProperty = function(c, f, d) {
+      Object.defineProperty(c, f, {value:d, writable:!0, configurable:!0, enumerable:!1});
+    };
+    e.defineNonEnumerableForwardingProperty = function(c, f, d) {
+      Object.defineProperty(c, f, {get:l.makeForwardingGetter(d), set:l.makeForwardingSetter(d), writable:!0, configurable:!0, enumerable:!1});
+    };
+    e.defineNewNonEnumerableProperty = function(c, f, d) {
+      e.defineNonEnumerableProperty(c, f, d);
+    };
+    e.createPublicAliases = function(c, f) {
+      for (var d = {value:null, writable:!0, configurable:!0, enumerable:!1}, g = 0;g < f.length;g++) {
+        var e = f[g];
+        d.value = c[e];
+        Object.defineProperty(c, "$Bg" + e, d);
       }
     };
   })(k.ObjectUtilities || (k.ObjectUtilities = {}));
-  var h;
+  var l;
   (function(e) {
-    e.makeForwardingGetter = function(f) {
-      return new Function('return this["' + f + '"]//# sourceURL=fwd-get-' + f + ".as");
-    };
-    e.makeForwardingSetter = function(f) {
-      return new Function("value", 'this["' + f + '"] = value;//# sourceURL=fwd-set-' + f + ".as");
-    };
-    e.bindSafely = function(f, c) {
-      function d() {
-        return f.apply(c, arguments);
-      }
-      d.boundTo = c;
-      return d;
-    };
-  })(h = k.FunctionUtilities || (k.FunctionUtilities = {}));
+    e.makeForwardingGetter = function(g) {
+      return new Function('return this["' + g + '"]//# sourceURL=fwd-get-' + g + ".as");
+    };
+    e.makeForwardingSetter = function(g) {
+      return new Function("value", 'this["' + g + '"] = value;//# sourceURL=fwd-set-' + g + ".as");
+    };
+    e.bindSafely = function(g, d) {
+      function c() {
+        return g.apply(d, arguments);
+      }
+      c.boundTo = d;
+      return c;
+    };
+  })(l = k.FunctionUtilities || (k.FunctionUtilities = {}));
   (function(e) {
-    function f(d) {
-      return "string" === typeof d ? '"' + d + '"' : "number" === typeof d || "boolean" === typeof d ? String(d) : d instanceof Array ? "[] " + d.length : typeof d;
-    }
-    function c(d, c, f) {
-      q[0] = d;
-      q[1] = c;
-      q[2] = f;
-      return q.join("");
-    }
-    function d(d, c, q, f) {
-      u[0] = d;
-      u[1] = c;
-      u[2] = q;
-      u[3] = f;
-      return u.join("");
-    }
-    e.repeatString = function(d, c) {
-      for (var q = "", f = 0;f < c;f++) {
-        q += d;
-      }
-      return q;
-    };
-    e.memorySizeToString = function(d) {
-      d |= 0;
-      return 1024 > d ? d + " B" : 1048576 > d ? (d / 1024).toFixed(2) + "KB" : (d / 1048576).toFixed(2) + "MB";
-    };
-    e.toSafeString = f;
-    e.toSafeArrayString = function(d) {
-      for (var c = [], q = 0;q < d.length;q++) {
-        c.push(f(d[q]));
+    function g(f) {
+      return "string" === typeof f ? '"' + f + '"' : "number" === typeof f || "boolean" === typeof f ? String(f) : f instanceof Array ? "[] " + f.length : typeof f;
+    }
+    function d(c, d, g) {
+      f[0] = c;
+      f[1] = d;
+      f[2] = g;
+      return f.join("");
+    }
+    function c(f, c, d, g) {
+      y[0] = f;
+      y[1] = c;
+      y[2] = d;
+      y[3] = g;
+      return y.join("");
+    }
+    e.repeatString = function(f, c) {
+      for (var d = "", g = 0;g < c;g++) {
+        d += f;
+      }
+      return d;
+    };
+    e.memorySizeToString = function(f) {
+      f |= 0;
+      return 1024 > f ? f + " B" : 1048576 > f ? (f / 1024).toFixed(2) + "KB" : (f / 1048576).toFixed(2) + "MB";
+    };
+    e.toSafeString = g;
+    e.toSafeArrayString = function(f) {
+      for (var c = [], d = 0;d < f.length;d++) {
+        c.push(g(f[d]));
       }
       return c.join(", ");
     };
-    e.utf8decode = function(d) {
-      for (var c = new Uint8Array(4 * d.length), q = 0, f = 0, e = d.length;f < e;f++) {
-        var u = d.charCodeAt(f);
-        if (127 >= u) {
-          c[q++] = u;
+    e.utf8decode = function(f) {
+      for (var c = new Uint8Array(4 * f.length), d = 0, g = 0, e = f.length;g < e;g++) {
+        var x = f.charCodeAt(g);
+        if (127 >= x) {
+          c[d++] = x;
         } else {
-          if (55296 <= u && 56319 >= u) {
-            var a = d.charCodeAt(f + 1);
-            56320 <= a && 57343 >= a && (u = ((u & 1023) << 10) + (a & 1023) + 65536, ++f);
-          }
-          0 !== (u & 4292870144) ? (c[q++] = 248 | u >>> 24 & 3, c[q++] = 128 | u >>> 18 & 63, c[q++] = 128 | u >>> 12 & 63, c[q++] = 128 | u >>> 6 & 63) : 0 !== (u & 4294901760) ? (c[q++] = 240 | u >>> 18 & 7, c[q++] = 128 | u >>> 12 & 63, c[q++] = 128 | u >>> 6 & 63) : 0 !== (u & 4294965248) ? (c[q++] = 224 | u >>> 12 & 15, c[q++] = 128 | u >>> 6 & 63) : c[q++] = 192 | u >>> 6 & 31;
-          c[q++] = 128 | u & 63;
-        }
-      }
-      return c.subarray(0, q);
-    };
-    e.utf8encode = function(d) {
-      for (var c = 0, q = "";c < d.length;) {
-        var f = d[c++] & 255;
-        if (127 >= f) {
-          q += String.fromCharCode(f);
+          if (55296 <= x && 56319 >= x) {
+            var y = f.charCodeAt(g + 1);
+            56320 <= y && 57343 >= y && (x = ((x & 1023) << 10) + (y & 1023) + 65536, ++g);
+          }
+          0 !== (x & 4292870144) ? (c[d++] = 248 | x >>> 24 & 3, c[d++] = 128 | x >>> 18 & 63, c[d++] = 128 | x >>> 12 & 63, c[d++] = 128 | x >>> 6 & 63) : 0 !== (x & 4294901760) ? (c[d++] = 240 | x >>> 18 & 7, c[d++] = 128 | x >>> 12 & 63, c[d++] = 128 | x >>> 6 & 63) : 0 !== (x & 4294965248) ? (c[d++] = 224 | x >>> 12 & 15, c[d++] = 128 | x >>> 6 & 63) : c[d++] = 192 | x >>> 6 & 31;
+          c[d++] = 128 | x & 63;
+        }
+      }
+      return c.subarray(0, d);
+    };
+    e.utf8encode = function(f) {
+      for (var c = 0, d = "";c < f.length;) {
+        var g = f[c++] & 255;
+        if (127 >= g) {
+          d += String.fromCharCode(g);
         } else {
-          var u = 192, e = 5;
+          var e = 192, x = 5;
           do {
-            if ((f & (u >> 1 | 128)) === u) {
-              break;
-            }
-            u = u >> 1 | 128;
-            --e;
-          } while (0 <= e);
-          if (0 >= e) {
-            q += String.fromCharCode(f);
+            if ((g & (e >> 1 | 128)) === e) {
+              break;
+            }
+            e = e >> 1 | 128;
+            --x;
+          } while (0 <= x);
+          if (0 >= x) {
+            d += String.fromCharCode(g);
           } else {
-            for (var f = f & (1 << e) - 1, u = !1, a = 5;a >= e;--a) {
-              var h = d[c++];
-              if (128 != (h & 192)) {
-                u = !0;
+            for (var g = g & (1 << x) - 1, e = !1, y = 5;y >= x;--y) {
+              var b = f[c++];
+              if (128 != (b & 192)) {
+                e = !0;
                 break;
               }
-              f = f << 6 | h & 63;
-            }
-            if (u) {
-              for (e = c - (7 - a);e < c;++e) {
-                q += String.fromCharCode(d[e] & 255);
+              g = g << 6 | b & 63;
+            }
+            if (e) {
+              for (x = c - (7 - y);x < c;++x) {
+                d += String.fromCharCode(f[x] & 255);
               }
             } else {
-              q = 65536 <= f ? q + String.fromCharCode(f - 65536 >> 10 & 1023 | 55296, f & 1023 | 56320) : q + String.fromCharCode(f);
-            }
-          }
-        }
-      }
-      return q;
-    };
-    e.base64ArrayBuffer = function(q) {
-      var f = "";
-      q = new Uint8Array(q);
-      for (var u = q.byteLength, e = u % 3, u = u - e, a, h, I, H, p = 0;p < u;p += 3) {
-        H = q[p] << 16 | q[p + 1] << 8 | q[p + 2], a = (H & 16515072) >> 18, h = (H & 258048) >> 12, I = (H & 4032) >> 6, H &= 63, f += d("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[a], "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[h], "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[I], "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[H]);
-      }
-      1 == e ? (H = q[u], f += c("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(H & 252) >> 2], "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(H & 3) << 4], "==")) : 2 == e && (H = q[u] << 8 | q[u + 1], f += d("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(H & 64512) >> 10], "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(H & 1008) >> 4], "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(H & 15) << 
+              d = 65536 <= g ? d + String.fromCharCode(g - 65536 >> 10 & 1023 | 55296, g & 1023 | 56320) : d + String.fromCharCode(g);
+            }
+          }
+        }
+      }
+      return d;
+    };
+    e.base64ArrayBuffer = function(f) {
+      var g = "";
+      f = new Uint8Array(f);
+      for (var e = f.byteLength, x = e % 3, e = e - x, y, b, a, I, l = 0;l < e;l += 3) {
+        I = f[l] << 16 | f[l + 1] << 8 | f[l + 2], y = (I & 16515072) >> 18, b = (I & 258048) >> 12, a = (I & 4032) >> 6, I &= 63, g += c("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[y], "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[b], "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[a], "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[I]);
+      }
+      1 == x ? (I = f[e], g += d("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(I & 252) >> 2], "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(I & 3) << 4], "==")) : 2 == x && (I = f[e] << 8 | f[e + 1], g += c("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(I & 64512) >> 10], "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(I & 1008) >> 4], "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(I & 15) << 
       2], "="));
+      return g;
+    };
+    e.escapeString = function(f) {
+      void 0 !== f && (f = f.replace(/[^\w$]/gi, "$"), /^\d/.test(f) && (f = "$" + f));
       return f;
     };
-    e.escapeString = function(d) {
-      void 0 !== d && (d = d.replace(/[^\w$]/gi, "$"), /^\d/.test(d) && (d = "$" + d));
-      return d;
-    };
-    e.fromCharCodeArray = function(d) {
-      for (var c = "", q = 0;q < d.length;q += 16384) {
-        var f = Math.min(d.length - q, 16384), c = c + String.fromCharCode.apply(null, d.subarray(q, q + f))
+    e.fromCharCodeArray = function(f) {
+      for (var c = "", d = 0;d < f.length;d += 16384) {
+        var g = Math.min(f.length - d, 16384), c = c + String.fromCharCode.apply(null, f.subarray(d, d + g))
       }
       return c;
     };
-    e.variableLengthEncodeInt32 = function(d) {
-      for (var c = 32 - Math.clz32(d), q = Math.ceil(c / 6), c = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$_"[q], q = q - 1;0 <= q;q--) {
-        c += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$_"[d >> 6 * q & 63];
+    e.variableLengthEncodeInt32 = function(f) {
+      for (var c = 32 - Math.clz32(f), d = Math.ceil(c / 6), c = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$_"[d], d = d - 1;0 <= d;d--) {
+        c += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$_"[f >> 6 * d & 63];
       }
       return c;
     };
-    e.toEncoding = function(d) {
-      return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$_"[d];
-    };
-    e.fromEncoding = function(d) {
-      if (65 <= d && 90 >= d) {
-        return d - 65;
-      }
-      if (97 <= d && 122 >= d) {
-        return d - 71;
-      }
-      if (48 <= d && 57 >= d) {
-        return d + 4;
-      }
-      if (36 === d) {
+    e.toEncoding = function(f) {
+      return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$_"[f];
+    };
+    e.fromEncoding = function(f) {
+      if (65 <= f && 90 >= f) {
+        return f - 65;
+      }
+      if (97 <= f && 122 >= f) {
+        return f - 71;
+      }
+      if (48 <= f && 57 >= f) {
+        return f + 4;
+      }
+      if (36 === f) {
         return 62;
       }
-      if (95 === d) {
+      if (95 === f) {
         return 63;
       }
     };
-    e.variableLengthDecodeInt32 = function(d) {
-      for (var c = e.fromEncoding(d.charCodeAt(0)), q = 0, f = 0;f < c;f++) {
-        var u = 6 * (c - f - 1), q = q | e.fromEncoding(d.charCodeAt(1 + f)) << u
-      }
-      return q;
-    };
-    e.trimMiddle = function(d, c) {
-      if (d.length <= c) {
-        return d;
-      }
-      var q = c >> 1, f = c - q - 1;
-      return d.substr(0, q) + "\u2026" + d.substr(d.length - f, f);
-    };
-    e.multiple = function(d, c) {
-      for (var q = "", f = 0;f < c;f++) {
-        q += d;
-      }
-      return q;
-    };
-    e.indexOfAny = function(d, c, q) {
-      for (var f = d.length, u = 0;u < c.length;u++) {
-        var e = d.indexOf(c[u], q);
-        0 <= e && (f = Math.min(f, e));
-      }
-      return f === d.length ? -1 : f;
-    };
-    var q = Array(3), u = Array(4), a = Array(5), h = Array(6), p = Array(7), m = Array(8), b = Array(9);
-    e.concat3 = c;
-    e.concat4 = d;
-    e.concat5 = function(d, c, q, f, u) {
-      a[0] = d;
+    e.variableLengthDecodeInt32 = function(f) {
+      for (var c = e.fromEncoding(f.charCodeAt(0)), d = 0, g = 0;g < c;g++) {
+        var x = 6 * (c - g - 1), d = d | e.fromEncoding(f.charCodeAt(1 + g)) << x
+      }
+      return d;
+    };
+    e.trimMiddle = function(f, c) {
+      if (f.length <= c) {
+        return f;
+      }
+      var d = c >> 1, g = c - d - 1;
+      return f.substr(0, d) + "\u2026" + f.substr(f.length - g, g);
+    };
+    e.multiple = function(f, c) {
+      for (var d = "", g = 0;g < c;g++) {
+        d += f;
+      }
+      return d;
+    };
+    e.indexOfAny = function(f, c, d) {
+      for (var g = f.length, e = 0;e < c.length;e++) {
+        var x = f.indexOf(c[e], d);
+        0 <= x && (g = Math.min(g, x));
+      }
+      return g === f.length ? -1 : g;
+    };
+    var f = Array(3), y = Array(4), x = Array(5), b = Array(6), a = Array(7), l = Array(8), h = Array(9);
+    e.concat3 = d;
+    e.concat4 = c;
+    e.concat5 = function(f, c, d, g, e) {
+      x[0] = f;
+      x[1] = c;
+      x[2] = d;
+      x[3] = g;
+      x[4] = e;
+      return x.join("");
+    };
+    e.concat6 = function(f, c, d, g, e, x) {
+      b[0] = f;
+      b[1] = c;
+      b[2] = d;
+      b[3] = g;
+      b[4] = e;
+      b[5] = x;
+      return b.join("");
+    };
+    e.concat7 = function(f, c, d, g, e, x, y) {
+      a[0] = f;
       a[1] = c;
-      a[2] = q;
-      a[3] = f;
-      a[4] = u;
+      a[2] = d;
+      a[3] = g;
+      a[4] = e;
+      a[5] = x;
+      a[6] = y;
       return a.join("");
     };
-    e.concat6 = function(d, c, q, f, u, e) {
-      h[0] = d;
+    e.concat8 = function(f, c, d, g, e, x, y, b) {
+      l[0] = f;
+      l[1] = c;
+      l[2] = d;
+      l[3] = g;
+      l[4] = e;
+      l[5] = x;
+      l[6] = y;
+      l[7] = b;
+      return l.join("");
+    };
+    e.concat9 = function(f, c, d, g, e, x, y, b, a) {
+      h[0] = f;
       h[1] = c;
-      h[2] = q;
-      h[3] = f;
-      h[4] = u;
-      h[5] = e;
+      h[2] = d;
+      h[3] = g;
+      h[4] = e;
+      h[5] = x;
+      h[6] = y;
+      h[7] = b;
+      h[8] = a;
       return h.join("");
     };
-    e.concat7 = function(d, c, q, f, u, e, a) {
-      p[0] = d;
-      p[1] = c;
-      p[2] = q;
-      p[3] = f;
-      p[4] = u;
-      p[5] = e;
-      p[6] = a;
-      return p.join("");
-    };
-    e.concat8 = function(d, c, q, f, u, e, a, h) {
-      m[0] = d;
-      m[1] = c;
-      m[2] = q;
-      m[3] = f;
-      m[4] = u;
-      m[5] = e;
-      m[6] = a;
-      m[7] = h;
-      return m.join("");
-    };
-    e.concat9 = function(d, c, q, f, u, e, a, h, I) {
-      b[0] = d;
-      b[1] = c;
-      b[2] = q;
-      b[3] = f;
-      b[4] = u;
-      b[5] = e;
-      b[6] = a;
-      b[7] = h;
-      b[8] = I;
-      return b.join("");
-    };
   })(k.StringUtilities || (k.StringUtilities = {}));
   (function(e) {
-    var f = new Uint8Array([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]), c = new Int32Array([-680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, 
+    var g = new Uint8Array([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]), d = new Int32Array([-680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, 
     643717713, -373897302, -701558691, 38016083, -660478335, -405537848, 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, 
     -145523070, -1120210379, 718787259, -343485551]);
-    e.hashBytesTo32BitsMD5 = function(d, q, u) {
-      var e = 1732584193, a = -271733879, h = -1732584194, p = 271733878, m = u + 72 & -64, b = new Uint8Array(m), l;
-      for (l = 0;l < u;++l) {
-        b[l] = d[q++];
-      }
-      b[l++] = 128;
-      for (d = m - 8;l < d;) {
-        b[l++] = 0;
-      }
-      b[l++] = u << 3 & 255;
-      b[l++] = u >> 5 & 255;
-      b[l++] = u >> 13 & 255;
-      b[l++] = u >> 21 & 255;
-      b[l++] = u >>> 29 & 255;
-      b[l++] = 0;
-      b[l++] = 0;
-      b[l++] = 0;
-      d = new Int32Array(16);
-      for (l = 0;l < m;) {
-        for (u = 0;16 > u;++u, l += 4) {
-          d[u] = b[l] | b[l + 1] << 8 | b[l + 2] << 16 | b[l + 3] << 24;
-        }
-        var n = e;
-        q = a;
-        var t = h, w = p, x, g;
-        for (u = 0;64 > u;++u) {
-          16 > u ? (x = q & t | ~q & w, g = u) : 32 > u ? (x = w & q | ~w & t, g = 5 * u + 1 & 15) : 48 > u ? (x = q ^ t ^ w, g = 3 * u + 5 & 15) : (x = t ^ (q | ~w), g = 7 * u & 15);
-          var k = w, n = n + x + c[u] + d[g] | 0;
-          x = f[u];
-          w = t;
-          t = q;
-          q = q + (n << x | n >>> 32 - x) | 0;
-          n = k;
-        }
-        e = e + n | 0;
-        a = a + q | 0;
-        h = h + t | 0;
-        p = p + w | 0;
-      }
-      return e;
-    };
-    e.hashBytesTo32BitsAdler = function(d, c, f) {
-      var e = 1, a = 0;
-      for (f = c + f;c < f;++c) {
-        e = (e + (d[c] & 255)) % 65521, a = (a + e) % 65521;
-      }
-      return a << 16 | e;
+    e.hashBytesTo32BitsMD5 = function(c, f, e) {
+      var x = 1732584193, b = -271733879, a = -1732584194, l = 271733878, h = e + 72 & -64, v = new Uint8Array(h), r;
+      for (r = 0;r < e;++r) {
+        v[r] = c[f++];
+      }
+      v[r++] = 128;
+      for (c = h - 8;r < c;) {
+        v[r++] = 0;
+      }
+      v[r++] = e << 3 & 255;
+      v[r++] = e >> 5 & 255;
+      v[r++] = e >> 13 & 255;
+      v[r++] = e >> 21 & 255;
+      v[r++] = e >>> 29 & 255;
+      v[r++] = 0;
+      v[r++] = 0;
+      v[r++] = 0;
+      c = new Int32Array(16);
+      for (r = 0;r < h;) {
+        for (e = 0;16 > e;++e, r += 4) {
+          c[e] = v[r] | v[r + 1] << 8 | v[r + 2] << 16 | v[r + 3] << 24;
+        }
+        var n = x;
+        f = b;
+        var t = a, m = l, q, k;
+        for (e = 0;64 > e;++e) {
+          16 > e ? (q = f & t | ~f & m, k = e) : 32 > e ? (q = m & f | ~m & t, k = 5 * e + 1 & 15) : 48 > e ? (q = f ^ t ^ m, k = 3 * e + 5 & 15) : (q = t ^ (f | ~m), k = 7 * e & 15);
+          var w = m, n = n + q + d[e] + c[k] | 0;
+          q = g[e];
+          m = t;
+          t = f;
+          f = f + (n << q | n >>> 32 - q) | 0;
+          n = w;
+        }
+        x = x + n | 0;
+        b = b + f | 0;
+        a = a + t | 0;
+        l = l + m | 0;
+      }
+      return x;
+    };
+    e.hashBytesTo32BitsAdler = function(c, f, d) {
+      var g = 1, e = 0;
+      for (d = f + d;f < d;++f) {
+        g = (g + (c[f] & 255)) % 65521, e = (e + g) % 65521;
+      }
+      return e << 16 | g;
+    };
+    e.mixHash = function(c, f) {
+      return (31 * c | 0) + f | 0;
     };
   })(k.HashUtilities || (k.HashUtilities = {}));
-  var p = function() {
+  var r = function() {
     function e() {
     }
-    e.seed = function(f) {
-      e._state[0] = f;
-      e._state[1] = f;
+    e.seed = function(g) {
+      e._state[0] = g;
+      e._state[1] = g;
+    };
+    e.reset = function() {
+      e._state[0] = 57005;
+      e._state[1] = 48879;
     };
     e.next = function() {
-      var f = this._state, c = Math.imul(18273, f[0] & 65535) + (f[0] >>> 16) | 0;
-      f[0] = c;
-      var d = Math.imul(36969, f[1] & 65535) + (f[1] >>> 16) | 0;
-      f[1] = d;
-      f = (c << 16) + (d & 65535) | 0;
-      return 2.3283064365386963E-10 * (0 > f ? f + 4294967296 : f);
+      var g = this._state, d = Math.imul(18273, g[0] & 65535) + (g[0] >>> 16) | 0;
+      g[0] = d;
+      var c = Math.imul(36969, g[1] & 65535) + (g[1] >>> 16) | 0;
+      g[1] = c;
+      g = (d << 16) + (c & 65535) | 0;
+      return 2.3283064365386963E-10 * (0 > g ? g + 4294967296 : g);
     };
     e._state = new Uint32Array([57005, 48879]);
     return e;
   }();
-  k.Random = p;
+  k.Random = r;
   Math.random = function() {
-    return p.next();
+    return r.next();
+  };
+  k.installTimeWarper = function() {
+    var e = Date, g = 1428107694580;
+    jsGlobal.Date = function(d, c, f, y, x, b, a) {
+      switch(arguments.length) {
+        case 0:
+          return new e(g);
+        case 1:
+          return new e(d);
+        case 2:
+          return new e(d, c);
+        case 3:
+          return new e(d, c, f);
+        case 4:
+          return new e(d, c, f, y);
+        case 5:
+          return new e(d, c, f, y, x);
+        case 6:
+          return new e(d, c, f, y, x, b);
+        default:
+          return new e(d, c, f, y, x, b, a);
+      }
+    };
+    jsGlobal.Date.now = function() {
+      return g += 10;
+    };
+    jsGlobal.Date.UTC = function() {
+      return e.UTC.apply(e, arguments);
+    };
   };
   (function() {
     function e() {
-      this.id = "$weakmap" + f++;
+      this.id = "$weakmap" + g++;
     }
     if ("function" !== typeof jsGlobal.WeakMap) {
-      var f = 0;
-      e.prototype = {has:function(c) {
-        return c.hasOwnProperty(this.id);
-      }, get:function(c, d) {
-        return c.hasOwnProperty(this.id) ? c[this.id] : d;
-      }, set:function(c, d) {
-        Object.defineProperty(c, this.id, {value:d, enumerable:!1, configurable:!0});
-      }, delete:function(c) {
-        delete c[this.id];
+      var g = 0;
+      e.prototype = {has:function(d) {
+        return d.hasOwnProperty(this.id);
+      }, get:function(d, c) {
+        return d.hasOwnProperty(this.id) ? d[this.id] : c;
+      }, set:function(d, c) {
+        Object.defineProperty(d, this.id, {value:c, enumerable:!1, configurable:!0});
+      }, delete:function(d) {
+        delete d[this.id];
       }};
       jsGlobal.WeakMap = e;
     }
   })();
-  a = function() {
+  b = function() {
     function e() {
-      "undefined" !== typeof ShumwayCom && ShumwayCom.getWeakMapKeys ? this._map = new WeakMap : this._list = [];
+      "undefined" !== typeof ShumwayCom && ShumwayCom.getWeakMapKeys ? (this._map = new WeakMap, this._id = 0, this._newAdditions = []) : this._list = [];
     }
     e.prototype.clear = function() {
       this._map ? this._map.clear() : this._list.length = 0;
     };
-    e.prototype.push = function(f) {
-      this._map ? this._map.set(f, null) : this._list.push(f);
-    };
-    e.prototype.remove = function(f) {
-      this._map ? this._map.delete(f) : this._list[this._list.indexOf(f)] = null;
-    };
-    e.prototype.forEach = function(f) {
+    e.prototype.push = function(g) {
+      this._map ? (this._map.set(g, this._id++), this._newAdditions.forEach(function(d) {
+        d.push(g);
+      })) : this._list.push(g);
+    };
+    e.prototype.remove = function(g) {
+      this._map ? this._map.delete(g) : this._list[this._list.indexOf(g)] = null;
+    };
+    e.prototype.forEach = function(g) {
       if (this._map) {
-        ShumwayCom.getWeakMapKeys(this._map).forEach(function(d) {
-          0 !== d._referenceCount && f(d);
+        var d = [];
+        this._newAdditions.push(d);
+        var c = this._map, f = ShumwayCom.getWeakMapKeys(c);
+        f.sort(function(f, d) {
+          return c.get(f) - c.get(d);
         });
+        f.forEach(function(f) {
+          0 !== f._referenceCount && g(f);
+        });
+        d.forEach(function(f) {
+          0 !== f._referenceCount && g(f);
+        });
+        this._newAdditions.splice(this._newAdditions.indexOf(d), 1);
       } else {
-        for (var c = this._list, d = 0, q = 0;q < c.length;q++) {
-          var u = c[q];
-          u && (0 === u._referenceCount ? (c[q] = null, d++) : f(u));
-        }
-        if (16 < d && d > c.length >> 2) {
-          d = [];
-          for (q = 0;q < c.length;q++) {
-            (u = c[q]) && 0 < u._referenceCount && d.push(u);
-          }
-          this._list = d;
+        for (var d = this._list, e = 0, f = 0;f < d.length;f++) {
+          var x = d[f];
+          x && (0 === x._referenceCount ? (d[f] = null, e++) : g(x));
+        }
+        if (16 < e && e > d.length >> 2) {
+          e = [];
+          for (f = 0;f < d.length;f++) {
+            (x = d[f]) && 0 < x._referenceCount && e.push(x);
+          }
+          this._list = e;
         }
       }
     };
     Object.defineProperty(e.prototype, "length", {get:function() {
       return this._map ? -1 : this._list.length;
     }, enumerable:!0, configurable:!0});
     return e;
   }();
-  k.WeakList = a;
-  var l;
+  k.WeakList = b;
+  var h;
   (function(e) {
-    e.pow2 = function(f) {
-      return f === (f | 0) ? 0 > f ? 1 / (1 << -f) : 1 << f : Math.pow(2, f);
-    };
-    e.clamp = function(f, c, d) {
-      return Math.max(c, Math.min(d, f));
-    };
-    e.roundHalfEven = function(f) {
-      if (.5 === Math.abs(f % 1)) {
-        var c = Math.floor(f);
-        return 0 === c % 2 ? c : Math.ceil(f);
-      }
-      return Math.round(f);
-    };
-    e.altTieBreakRound = function(f, c) {
-      return .5 !== Math.abs(f % 1) || c ? Math.round(f) : f | 0;
-    };
-    e.epsilonEquals = function(f, c) {
-      return 1E-7 > Math.abs(f - c);
-    };
-  })(l = k.NumberUtilities || (k.NumberUtilities = {}));
+    e.pow2 = function(g) {
+      return g === (g | 0) ? 0 > g ? 1 / (1 << -g) : 1 << g : Math.pow(2, g);
+    };
+    e.clamp = function(g, d, c) {
+      return Math.max(d, Math.min(c, g));
+    };
+    e.roundHalfEven = function(g) {
+      if (.5 === Math.abs(g % 1)) {
+        var d = Math.floor(g);
+        return 0 === d % 2 ? d : Math.ceil(g);
+      }
+      return Math.round(g);
+    };
+    e.altTieBreakRound = function(g, d) {
+      return .5 !== Math.abs(g % 1) || d ? Math.round(g) : g | 0;
+    };
+    e.epsilonEquals = function(g, d) {
+      return 1E-7 > Math.abs(g - d);
+    };
+  })(h = k.NumberUtilities || (k.NumberUtilities = {}));
   (function(e) {
     e[e.MaxU16 = 65535] = "MaxU16";
     e[e.MaxI16 = 32767] = "MaxI16";
     e[e.MinI16 = -32768] = "MinI16";
   })(k.Numbers || (k.Numbers = {}));
-  var w;
+  var t;
   (function(e) {
-    function f(d) {
-      return 256 * d << 16 >> 16;
+    function g(f) {
+      return 256 * f << 16 >> 16;
+    }
+    function d(f) {
+      return f / 256;
     }
     var c = new ArrayBuffer(8);
     e.i8 = new Int8Array(c);
     e.u8 = new Uint8Array(c);
     e.i32 = new Int32Array(c);
     e.f32 = new Float32Array(c);
     e.f64 = new Float64Array(c);
     e.nativeLittleEndian = 1 === (new Int8Array((new Int32Array([1])).buffer))[0];
-    e.floatToInt32 = function(d) {
-      e.f32[0] = d;
+    e.floatToInt32 = function(f) {
+      e.f32[0] = f;
       return e.i32[0];
     };
-    e.int32ToFloat = function(d) {
-      e.i32[0] = d;
+    e.int32ToFloat = function(f) {
+      e.i32[0] = f;
       return e.f32[0];
     };
-    e.swap16 = function(d) {
-      return (d & 255) << 8 | d >> 8 & 255;
-    };
-    e.swap32 = function(d) {
-      return (d & 255) << 24 | (d & 65280) << 8 | d >> 8 & 65280 | d >> 24 & 255;
-    };
-    e.toS8U8 = f;
-    e.fromS8U8 = function(d) {
-      return d / 256;
-    };
-    e.clampS8U8 = function(d) {
-      return f(d) / 256;
-    };
-    e.toS16 = function(d) {
-      return d << 16 >> 16;
-    };
-    e.bitCount = function(d) {
-      d -= d >> 1 & 1431655765;
-      d = (d & 858993459) + (d >> 2 & 858993459);
-      return 16843009 * (d + (d >> 4) & 252645135) >> 24;
-    };
-    e.ones = function(d) {
-      d -= d >> 1 & 1431655765;
-      d = (d & 858993459) + (d >> 2 & 858993459);
-      return 16843009 * (d + (d >> 4) & 252645135) >> 24;
-    };
-    e.trailingZeros = function(d) {
-      return e.ones((d & -d) - 1);
-    };
-    e.getFlags = function(d, c) {
-      var f = "";
-      for (d = 0;d < c.length;d++) {
-        d & 1 << d && (f += c[d] + " ");
-      }
-      return 0 === f.length ? "" : f.trim();
-    };
-    e.isPowerOfTwo = function(d) {
-      return d && 0 === (d & d - 1);
-    };
-    e.roundToMultipleOfFour = function(d) {
-      return d + 3 & -4;
-    };
-    e.nearestPowerOfTwo = function(d) {
-      d--;
-      d |= d >> 1;
-      d |= d >> 2;
-      d |= d >> 4;
-      d |= d >> 8;
-      d |= d >> 16;
-      d++;
-      return d;
-    };
-    e.roundToMultipleOfPowerOfTwo = function(d, c) {
-      var f = (1 << c) - 1;
-      return d + f & ~f;
-    };
-    Math.imul || (Math.imul = function(d, c) {
-      var f = d & 65535, e = c & 65535;
-      return f * e + ((d >>> 16 & 65535) * e + f * (c >>> 16 & 65535) << 16 >>> 0) | 0;
+    e.swap16 = function(f) {
+      return (f & 255) << 8 | f >> 8 & 255;
+    };
+    e.swap32 = function(f) {
+      return (f & 255) << 24 | (f & 65280) << 8 | f >> 8 & 65280 | f >> 24 & 255;
+    };
+    e.toS8U8 = g;
+    e.fromS8U8 = d;
+    e.clampS8U8 = function(f) {
+      return d(g(f));
+    };
+    e.toS16 = function(f) {
+      return f << 16 >> 16;
+    };
+    e.bitCount = function(f) {
+      f -= f >> 1 & 1431655765;
+      f = (f & 858993459) + (f >> 2 & 858993459);
+      return 16843009 * (f + (f >> 4) & 252645135) >> 24;
+    };
+    e.ones = function(f) {
+      f -= f >> 1 & 1431655765;
+      f = (f & 858993459) + (f >> 2 & 858993459);
+      return 16843009 * (f + (f >> 4) & 252645135) >> 24;
+    };
+    e.trailingZeros = function(f) {
+      return e.ones((f & -f) - 1);
+    };
+    e.getFlags = function(f, c) {
+      var d = "";
+      for (f = 0;f < c.length;f++) {
+        f & 1 << f && (d += c[f] + " ");
+      }
+      return 0 === d.length ? "" : d.trim();
+    };
+    e.isPowerOfTwo = function(f) {
+      return f && 0 === (f & f - 1);
+    };
+    e.roundToMultipleOfFour = function(f) {
+      return f + 3 & -4;
+    };
+    e.nearestPowerOfTwo = function(f) {
+      f--;
+      f |= f >> 1;
+      f |= f >> 2;
+      f |= f >> 4;
+      f |= f >> 8;
+      f |= f >> 16;
+      f++;
+      return f;
+    };
+    e.roundToMultipleOfPowerOfTwo = function(f, c) {
+      var d = (1 << c) - 1;
+      return f + d & ~d;
+    };
+    e.toHEX = function(f) {
+      return "0x" + ("00000000" + (0 > f ? 4294967295 + f + 1 : f).toString(16)).substr(-8);
+    };
+    Math.imul || (Math.imul = function(f, c) {
+      var d = f & 65535, g = c & 65535;
+      return d * g + ((f >>> 16 & 65535) * g + d * (c >>> 16 & 65535) << 16 >>> 0) | 0;
     });
-    Math.clz32 || (Math.clz32 = function(d) {
-      d |= d >> 1;
-      d |= d >> 2;
-      d |= d >> 4;
-      d |= d >> 8;
-      return 32 - e.ones(d | d >> 16);
+    Math.clz32 || (Math.clz32 = function(f) {
+      f |= f >> 1;
+      f |= f >> 2;
+      f |= f >> 4;
+      f |= f >> 8;
+      return 32 - e.ones(f | f >> 16);
     });
-  })(w = k.IntegerUtilities || (k.IntegerUtilities = {}));
+  })(t = k.IntegerUtilities || (k.IntegerUtilities = {}));
   (function(e) {
-    function f(c, d, q, f, e, a) {
-      return (q - c) * (a - d) - (f - d) * (e - c);
-    }
-    e.pointInPolygon = function(c, d, q) {
-      for (var f = 0, e = q.length - 2, a = 0;a < e;a += 2) {
-        var h = q[a + 0], p = q[a + 1], m = q[a + 2], b = q[a + 3];
-        (p <= d && b > d || p > d && b <= d) && c < h + (d - p) / (b - p) * (m - h) && f++;
-      }
-      return 1 === (f & 1);
-    };
-    e.signedArea = f;
-    e.counterClockwise = function(c, d, q, e, a, h) {
-      return 0 < f(c, d, q, e, a, h);
-    };
-    e.clockwise = function(c, d, q, e, a, h) {
-      return 0 > f(c, d, q, e, a, h);
-    };
-    e.pointInPolygonInt32 = function(c, d, q) {
+    function g(d, c, f, g, e, b) {
+      return (f - d) * (b - c) - (g - c) * (e - d);
+    }
+    e.pointInPolygon = function(d, c, f) {
+      for (var g = 0, e = f.length - 2, b = 0;b < e;b += 2) {
+        var a = f[b + 0], l = f[b + 1], h = f[b + 2], v = f[b + 3];
+        (l <= c && v > c || l > c && v <= c) && d < a + (c - l) / (v - l) * (h - a) && g++;
+      }
+      return 1 === (g & 1);
+    };
+    e.signedArea = g;
+    e.counterClockwise = function(d, c, f, e, x, b) {
+      return 0 < g(d, c, f, e, x, b);
+    };
+    e.clockwise = function(d, c, f, e, x, b) {
+      return 0 > g(d, c, f, e, x, b);
+    };
+    e.pointInPolygonInt32 = function(d, c, f) {
+      d |= 0;
       c |= 0;
-      d |= 0;
-      for (var f = 0, e = q.length - 2, a = 0;a < e;a += 2) {
-        var h = q[a + 0], p = q[a + 1], m = q[a + 2], b = q[a + 3];
-        (p <= d && b > d || p > d && b <= d) && c < h + (d - p) / (b - p) * (m - h) && f++;
-      }
-      return 1 === (f & 1);
+      for (var g = 0, e = f.length - 2, b = 0;b < e;b += 2) {
+        var a = f[b + 0], l = f[b + 1], h = f[b + 2], v = f[b + 3];
+        (l <= c && v > c || l > c && v <= c) && d < a + (c - l) / (v - l) * (h - a) && g++;
+      }
+      return 1 === (g & 1);
     };
   })(k.GeometricUtilities || (k.GeometricUtilities = {}));
   (function(e) {
     e[e.Error = 1] = "Error";
     e[e.Warn = 2] = "Warn";
     e[e.Debug = 4] = "Debug";
     e[e.Log = 8] = "Log";
     e[e.Info = 16] = "Info";
     e[e.All = 31] = "All";
   })(k.LogLevel || (k.LogLevel = {}));
-  a = function() {
-    function e(f, c) {
-      void 0 === f && (f = !1);
+  b = function() {
+    function e(g, d) {
+      void 0 === g && (g = !1);
       this._tab = "  ";
       this._padding = "";
-      this._suppressOutput = f;
-      this._out = c || e._consoleOut;
-      this._outNoNewline = c || e._consoleOutNoNewline;
-    }
-    e.prototype.write = function(f, c) {
-      void 0 === f && (f = "");
-      void 0 === c && (c = !1);
-      this._suppressOutput || this._outNoNewline((c ? this._padding : "") + f);
-    };
-    e.prototype.writeLn = function(f) {
-      void 0 === f && (f = "");
-      this._suppressOutput || this._out(this._padding + f);
-    };
-    e.prototype.writeObject = function(f, c) {
-      void 0 === f && (f = "");
-      this._suppressOutput || this._out(this._padding + f, c);
-    };
-    e.prototype.writeTimeLn = function(f) {
-      void 0 === f && (f = "");
-      this._suppressOutput || this._out(this._padding + performance.now().toFixed(2) + " " + f);
-    };
-    e.prototype.writeComment = function(f) {
-      f = f.split("\n");
-      if (1 === f.length) {
-        this.writeLn("// " + f[0]);
+      this._suppressOutput = g;
+      this._out = d || e._consoleOut;
+      this._outNoNewline = d || e._consoleOutNoNewline;
+    }
+    Object.defineProperty(e.prototype, "suppressOutput", {get:function() {
+      return this._suppressOutput;
+    }, set:function(g) {
+      this._suppressOutput = g;
+    }, enumerable:!0, configurable:!0});
+    e.prototype.write = function(g, d) {
+      void 0 === g && (g = "");
+      void 0 === d && (d = !1);
+      this._suppressOutput || this._outNoNewline((d ? this._padding : "") + g);
+    };
+    e.prototype.writeLn = function(g) {
+      void 0 === g && (g = "");
+      this._suppressOutput || this._out(this._padding + g);
+    };
+    e.prototype.writeObject = function(g, d) {
+      void 0 === g && (g = "");
+      this._suppressOutput || this._out(this._padding + g, d);
+    };
+    e.prototype.writeTimeLn = function(g) {
+      void 0 === g && (g = "");
+      this._suppressOutput || this._out(this._padding + performance.now().toFixed(2) + " " + g);
+    };
+    e.prototype.writeComment = function(g) {
+      g = (g || "").split("\n");
+      if (1 === g.length) {
+        this.writeLn("// " + g[0]);
       } else {
         this.writeLn("/**");
-        for (var c = 0;c < f.length;c++) {
-          this.writeLn(" * " + f[c]);
+        for (var d = 0;d < g.length;d++) {
+          this.writeLn(" * " + g[d]);
         }
         this.writeLn(" */");
       }
     };
-    e.prototype.writeLns = function(f) {
-      f = f.split("\n");
-      for (var c = 0;c < f.length;c++) {
-        this.writeLn(f[c]);
-      }
-    };
-    e.prototype.errorLn = function(f) {
-      e.logLevel & 1 && this.boldRedLn(f);
-    };
-    e.prototype.warnLn = function(f) {
-      e.logLevel & 2 && this.yellowLn(f);
-    };
-    e.prototype.debugLn = function(f) {
-      e.logLevel & 4 && this.purpleLn(f);
-    };
-    e.prototype.logLn = function(f) {
-      e.logLevel & 8 && this.writeLn(f);
-    };
-    e.prototype.infoLn = function(f) {
-      e.logLevel & 16 && this.writeLn(f);
-    };
-    e.prototype.yellowLn = function(f) {
-      this.colorLn(e.YELLOW, f);
-    };
-    e.prototype.greenLn = function(f) {
-      this.colorLn(e.GREEN, f);
-    };
-    e.prototype.boldRedLn = function(f) {
-      this.colorLn(e.BOLD_RED, f);
-    };
-    e.prototype.redLn = function(f) {
-      this.colorLn(e.RED, f);
-    };
-    e.prototype.purpleLn = function(f) {
-      this.colorLn(e.PURPLE, f);
-    };
-    e.prototype.colorLn = function(f, c) {
-      this._suppressOutput || (inBrowser ? this._out(this._padding + c) : this._out(this._padding + f + c + e.ENDC));
-    };
-    e.prototype.redLns = function(f) {
-      this.colorLns(e.RED, f);
-    };
-    e.prototype.colorLns = function(f, c) {
-      for (var d = c.split("\n"), q = 0;q < d.length;q++) {
-        this.colorLn(f, d[q]);
-      }
-    };
-    e.prototype.enter = function(f) {
-      this._suppressOutput || this._out(this._padding + f);
+    e.prototype.writeLns = function(g) {
+      g = (g || "").split("\n");
+      for (var d = 0;d < g.length;d++) {
+        this.writeLn(g[d]);
+      }
+    };
+    e.prototype.errorLn = function(g) {
+      e.logLevel & 1 && this.boldRedLn(g);
+    };
+    e.prototype.warnLn = function(g) {
+      e.logLevel & 2 && this.yellowLn(g);
+    };
+    e.prototype.debugLn = function(g) {
+      e.logLevel & 4 && this.purpleLn(g);
+    };
+    e.prototype.logLn = function(g) {
+      e.logLevel & 8 && this.writeLn(g);
+    };
+    e.prototype.infoLn = function(g) {
+      e.logLevel & 16 && this.writeLn(g);
+    };
+    e.prototype.yellowLn = function(g) {
+      this.colorLn(e.YELLOW, g);
+    };
+    e.prototype.greenLn = function(g) {
+      this.colorLn(e.GREEN, g);
+    };
+    e.prototype.boldRedLn = function(g) {
+      this.colorLn(e.BOLD_RED, g);
+    };
+    e.prototype.redLn = function(g) {
+      this.colorLn(e.RED, g);
+    };
+    e.prototype.purpleLn = function(g) {
+      this.colorLn(e.PURPLE, g);
+    };
+    e.prototype.colorLn = function(g, d) {
+      this._suppressOutput || (inBrowser ? this._out(this._padding + d) : this._out(this._padding + g + d + e.ENDC));
+    };
+    e.prototype.redLns = function(g) {
+      this.colorLns(e.RED, g);
+    };
+    e.prototype.colorLns = function(g, d) {
+      for (var c = (d || "").split("\n"), f = 0;f < c.length;f++) {
+        this.colorLn(g, c[f]);
+      }
+    };
+    e.prototype.enter = function(g) {
+      this._suppressOutput || this._out(this._padding + g);
       this.indent();
     };
-    e.prototype.leaveAndEnter = function(f) {
-      this.leave(f);
+    e.prototype.leaveAndEnter = function(g) {
+      this.leave(g);
       this.indent();
     };
-    e.prototype.leave = function(f) {
+    e.prototype.leave = function(g) {
       this.outdent();
-      !this._suppressOutput && f && this._out(this._padding + f);
+      !this._suppressOutput && g && this._out(this._padding + g);
     };
     e.prototype.indent = function() {
       this._padding += this._tab;
     };
     e.prototype.outdent = function() {
       0 < this._padding.length && (this._padding = this._padding.substring(0, this._padding.length - this._tab.length));
     };
-    e.prototype.writeArray = function(f, c, d) {
-      void 0 === c && (c = !1);
+    e.prototype.writeArray = function(g, d, c) {
       void 0 === d && (d = !1);
-      c = c || !1;
-      for (var q = 0, e = f.length;q < e;q++) {
-        var a = "";
-        c && (a = null === f[q] ? "null" : void 0 === f[q] ? "undefined" : f[q].constructor.name, a += " ");
-        var h = d ? "" : ("" + q).padRight(" ", 4);
-        this.writeLn(h + a + f[q]);
+      void 0 === c && (c = !1);
+      d = d || !1;
+      for (var f = 0, e = g.length;f < e;f++) {
+        var x = "";
+        d && (x = null === g[f] ? "null" : void 0 === g[f] ? "undefined" : g[f].constructor.name, x += " ");
+        var b = c ? "" : ("" + f).padRight(" ", 4);
+        this.writeLn(b + x + g[f]);
       }
     };
     e.PURPLE = "\u001b[94m";
     e.YELLOW = "\u001b[93m";
     e.GREEN = "\u001b[92m";
     e.RED = "\u001b[91m";
     e.BOLD_RED = "\u001b[1;91m";
     e.ENDC = "\u001b[0m";
     e.logLevel = 31;
-    e._consoleOut = console.info.bind(console);
-    e._consoleOutNoNewline = console.info.bind(console);
+    e._consoleOut = console.log.bind(console);
+    e._consoleOutNoNewline = console.log.bind(console);
     return e;
   }();
-  k.IndentingWriter = a;
-  var m = function() {
-    return function(e, f) {
+  k.IndentingWriter = b;
+  var q = function() {
+    return function(e, g) {
       this.value = e;
-      this.next = f;
-    };
-  }(), a = function() {
-    function e(f) {
-      this._compare = f;
+      this.next = g;
+    };
+  }(), b = function() {
+    function e(g) {
+      this._compare = g;
       this._head = null;
       this._length = 0;
     }
-    e.prototype.push = function(f) {
+    e.prototype.push = function(g) {
       this._length++;
       if (this._head) {
-        var c = this._head, d = null;
-        f = new m(f, null);
-        for (var q = this._compare;c;) {
-          if (0 < q(c.value, f.value)) {
-            d ? (f.next = c, d.next = f) : (f.next = this._head, this._head = f);
+        var d = this._head, c = null;
+        g = new q(g, null);
+        for (var f = this._compare;d;) {
+          if (0 < f(d.value, g.value)) {
+            c ? (g.next = d, c.next = g) : (g.next = this._head, this._head = g);
             return;
           }
-          d = c;
-          c = c.next;
-        }
-        d.next = f;
+          c = d;
+          d = d.next;
+        }
+        c.next = g;
       } else {
-        this._head = new m(f, null);
-      }
-    };
-    e.prototype.forEach = function(f) {
-      for (var c = this._head, d = null;c;) {
-        var q = f(c.value);
-        if (q === e.RETURN) {
+        this._head = new q(g, null);
+      }
+    };
+    e.prototype.forEach = function(g) {
+      for (var d = this._head, c = null;d;) {
+        var f = g(d.value);
+        if (f === e.RETURN) {
           break;
         } else {
-          q === e.DELETE ? c = d ? d.next = c.next : this._head = this._head.next : (d = c, c = c.next);
+          f === e.DELETE ? d = c ? c.next = d.next : this._head = this._head.next : (c = d, d = d.next);
         }
       }
     };
     e.prototype.isEmpty = function() {
       return !this._head;
     };
     e.prototype.pop = function() {
       if (this._head) {
         this._length--;
-        var f = this._head;
+        var g = this._head;
         this._head = this._head.next;
-        return f.value;
-      }
-    };
-    e.prototype.contains = function(f) {
-      for (var c = this._head;c;) {
-        if (c.value === f) {
+        return g.value;
+      }
+    };
+    e.prototype.contains = function(g) {
+      for (var d = this._head;d;) {
+        if (d.value === g) {
           return !0;
         }
-        c = c.next;
+        d = d.next;
       }
       return !1;
     };
     e.prototype.toString = function() {
-      for (var f = "[", c = this._head;c;) {
-        f += c.value.toString(), (c = c.next) && (f += ",");
-      }
-      return f + "]";
+      for (var g = "[", d = this._head;d;) {
+        g += d.value.toString(), (d = d.next) && (g += ",");
+      }
+      return g + "]";
     };
     e.RETURN = 1;
     e.DELETE = 2;
     return e;
   }();
-  k.SortedList = a;
-  a = function() {
-    function e(f, c) {
-      void 0 === c && (c = 12);
+  k.SortedList = b;
+  b = function() {
+    function e(g, d) {
+      void 0 === d && (d = 12);
       this.start = this.index = 0;
-      this._size = 1 << c;
+      this._size = 1 << d;
       this._mask = this._size - 1;
-      this.array = new f(this._size);
-    }
-    e.prototype.get = function(f) {
-      return this.array[f];
-    };
-    e.prototype.forEachInReverse = function(f) {
+      this.array = new g(this._size);
+    }
+    e.prototype.get = function(g) {
+      return this.array[g];
+    };
+    e.prototype.forEachInReverse = function(g) {
       if (!this.isEmpty()) {
-        for (var c = 0 === this.index ? this._size - 1 : this.index - 1, d = this.start - 1 & this._mask;c !== d && !f(this.array[c], c);) {
-          c = 0 === c ? this._size - 1 : c - 1;
-        }
-      }
-    };
-    e.prototype.write = function(f) {
-      this.array[this.index] = f;
+        for (var d = 0 === this.index ? this._size - 1 : this.index - 1, c = this.start - 1 & this._mask;d !== c && !g(this.array[d], d);) {
+          d = 0 === d ? this._size - 1 : d - 1;
+        }
+      }
+    };
+    e.prototype.write = function(g) {
+      this.array[this.index] = g;
       this.index = this.index + 1 & this._mask;
       this.index === this.start && (this.start = this.start + 1 & this._mask);
     };
     e.prototype.isFull = function() {
       return (this.index + 1 & this._mask) === this.start;
     };
     e.prototype.isEmpty = function() {
       return this.index === this.start;
     };
     e.prototype.reset = function() {
       this.start = this.index = 0;
     };
     return e;
   }();
-  k.CircularBuffer = a;
+  k.CircularBuffer = b;
   (function(e) {
-    function f(d) {
-      return d + (e.BITS_PER_WORD - 1) >> e.ADDRESS_BITS_PER_WORD << e.ADDRESS_BITS_PER_WORD;
-    }
-    function c(d, c) {
-      d = d || "1";
+    function g(f) {
+      return f + (e.BITS_PER_WORD - 1) >> e.ADDRESS_BITS_PER_WORD << e.ADDRESS_BITS_PER_WORD;
+    }
+    function d(f, c) {
+      f = f || "1";
       c = c || "0";
-      for (var q = "", f = 0;f < length;f++) {
-        q += this.get(f) ? d : c;
-      }
-      return q;
-    }
-    function d(d) {
-      for (var c = [], q = 0;q < length;q++) {
-        this.get(q) && c.push(d ? d[q] : q);
+      for (var d = "", g = 0;g < length;g++) {
+        d += this.get(g) ? f : c;
+      }
+      return d;
+    }
+    function c(f) {
+      for (var c = [], d = 0;d < length;d++) {
+        this.get(d) && c.push(f ? f[d] : d);
       }
       return c.join(", ");
     }
     e.ADDRESS_BITS_PER_WORD = 5;
     e.BITS_PER_WORD = 1 << e.ADDRESS_BITS_PER_WORD;
     e.BIT_INDEX_MASK = e.BITS_PER_WORD - 1;
-    var q = function() {
-      function d(c) {
-        this.size = f(c);
+    var f = function() {
+      function f(c) {
+        this.size = g(c);
         this.dirty = this.count = 0;
         this.length = c;
         this.bits = new Uint32Array(this.size >> e.ADDRESS_BITS_PER_WORD);
       }
-      d.prototype.recount = function() {
+      f.prototype.recount = function() {
         if (this.dirty) {
-          for (var d = this.bits, c = 0, q = 0, f = d.length;q < f;q++) {
-            var e = d[q], e = e - (e >> 1 & 1431655765), e = (e & 858993459) + (e >> 2 & 858993459), c = c + (16843009 * (e + (e >> 4) & 252645135) >> 24)
+          for (var f = this.bits, c = 0, d = 0, g = f.length;d < g;d++) {
+            var e = f[d], e = e - (e >> 1 & 1431655765), e = (e & 858993459) + (e >> 2 & 858993459), c = c + (16843009 * (e + (e >> 4) & 252645135) >> 24)
           }
           this.count = c;
           this.dirty = 0;
         }
       };
-      d.prototype.set = function(d) {
-        var c = d >> e.ADDRESS_BITS_PER_WORD, q = this.bits[c];
-        d = q | 1 << (d & e.BIT_INDEX_MASK);
-        this.bits[c] = d;
-        this.dirty |= q ^ d;
-      };
-      d.prototype.setAll = function() {
-        for (var d = this.bits, c = 0, q = d.length;c < q;c++) {
-          d[c] = 4294967295;
+      f.prototype.set = function(f) {
+        var c = f >> e.ADDRESS_BITS_PER_WORD, d = this.bits[c];
+        f = d | 1 << (f & e.BIT_INDEX_MASK);
+        this.bits[c] = f;
+        this.dirty |= d ^ f;
+      };
+      f.prototype.setAll = function() {
+        for (var f = this.bits, c = 0, d = f.length;c < d;c++) {
+          f[c] = 4294967295;
         }
         this.count = this.size;
         this.dirty = 0;
       };
-      d.prototype.assign = function(d) {
-        this.count = d.count;
-        this.dirty = d.dirty;
-        this.size = d.size;
-        for (var c = 0, q = this.bits.length;c < q;c++) {
-          this.bits[c] = d.bits[c];
-        }
-      };
-      d.prototype.clear = function(d) {
-        var c = d >> e.ADDRESS_BITS_PER_WORD, q = this.bits[c];
-        d = q & ~(1 << (d & e.BIT_INDEX_MASK));
-        this.bits[c] = d;
-        this.dirty |= q ^ d;
-      };
-      d.prototype.get = function(d) {
-        return 0 !== (this.bits[d >> e.ADDRESS_BITS_PER_WORD] & 1 << (d & e.BIT_INDEX_MASK));
-      };
-      d.prototype.clearAll = function() {
-        for (var d = this.bits, c = 0, q = d.length;c < q;c++) {
-          d[c] = 0;
+      f.prototype.assign = function(f) {
+        this.count = f.count;
+        this.dirty = f.dirty;
+        this.size = f.size;
+        for (var c = 0, d = this.bits.length;c < d;c++) {
+          this.bits[c] = f.bits[c];
+        }
+      };
+      f.prototype.clear = function(f) {
+        var c = f >> e.ADDRESS_BITS_PER_WORD, d = this.bits[c];
+        f = d & ~(1 << (f & e.BIT_INDEX_MASK));
+        this.bits[c] = f;
+        this.dirty |= d ^ f;
+      };
+      f.prototype.get = function(f) {
+        return 0 !== (this.bits[f >> e.ADDRESS_BITS_PER_WORD] & 1 << (f & e.BIT_INDEX_MASK));
+      };
+      f.prototype.clearAll = function() {
+        for (var f = this.bits, c = 0, d = f.length;c < d;c++) {
+          f[c] = 0;
         }
         this.dirty = this.count = 0;
       };
-      d.prototype._union = function(d) {
-        var c = this.dirty, q = this.bits;
-        d = d.bits;
-        for (var f = 0, e = q.length;f < e;f++) {
-          var u = q[f], a = u | d[f];
-          q[f] = a;
-          c |= u ^ a;
+      f.prototype._union = function(f) {
+        var c = this.dirty, d = this.bits;
+        f = f.bits;
+        for (var g = 0, e = d.length;g < e;g++) {
+          var x = d[g], y = x | f[g];
+          d[g] = y;
+          c |= x ^ y;
         }
         this.dirty = c;
       };
-      d.prototype.intersect = function(d) {
-        var c = this.dirty, q = this.bits;
-        d = d.bits;
-        for (var f = 0, e = q.length;f < e;f++) {
-          var u = q[f], a = u & d[f];
-          q[f] = a;
-          c |= u ^ a;
+      f.prototype.intersect = function(f) {
+        var c = this.dirty, d = this.bits;
+        f = f.bits;
+        for (var g = 0, e = d.length;g < e;g++) {
+          var x = d[g], y = x & f[g];
+          d[g] = y;
+          c |= x ^ y;
         }
         this.dirty = c;
       };
-      d.prototype.subtract = function(d) {
-        var c = this.dirty, q = this.bits;
-        d = d.bits;
-        for (var f = 0, e = q.length;f < e;f++) {
-          var u = q[f], a = u & ~d[f];
-          q[f] = a;
-          c |= u ^ a;
+      f.prototype.subtract = function(f) {
+        var c = this.dirty, d = this.bits;
+        f = f.bits;
+        for (var g = 0, e = d.length;g < e;g++) {
+          var x = d[g], y = x & ~f[g];
+          d[g] = y;
+          c |= x ^ y;
         }
         this.dirty = c;
       };
-      d.prototype.negate = function() {
-        for (var d = this.dirty, c = this.bits, q = 0, f = c.length;q < f;q++) {
-          var e = c[q], u = ~e;
-          c[q] = u;
-          d |= e ^ u;
-        }
-        this.dirty = d;
-      };
-      d.prototype.forEach = function(d) {
-        for (var c = this.bits, q = 0, f = c.length;q < f;q++) {
-          var u = c[q];
-          if (u) {
-            for (var a = 0;a < e.BITS_PER_WORD;a++) {
-              u & 1 << a && d(q * e.BITS_PER_WORD + a);
-            }
-          }
-        }
-      };
-      d.prototype.toArray = function() {
-        for (var d = [], c = this.bits, q = 0, f = c.length;q < f;q++) {
-          var u = c[q];
-          if (u) {
-            for (var a = 0;a < e.BITS_PER_WORD;a++) {
-              u & 1 << a && d.push(q * e.BITS_PER_WORD + a);
-            }
-          }
-        }
-        return d;
-      };
-      d.prototype.equals = function(d) {
-        if (this.size !== d.size) {
+      f.prototype.negate = function() {
+        for (var f = this.dirty, c = this.bits, d = 0, g = c.length;d < g;d++) {
+          var e = c[d], x = ~e;
+          c[d] = x;
+          f |= e ^ x;
+        }
+        this.dirty = f;
+      };
+      f.prototype.forEach = function(f) {
+        for (var c = this.bits, d = 0, g = c.length;d < g;d++) {
+          var x = c[d];
+          if (x) {
+            for (var y = 0;y < e.BITS_PER_WORD;y++) {
+              x & 1 << y && f(d * e.BITS_PER_WORD + y);
+            }
+          }
+        }
+      };
+      f.prototype.toArray = function() {
+        for (var f = [], c = this.bits, d = 0, g = c.length;d < g;d++) {
+          var x = c[d];
+          if (x) {
+            for (var y = 0;y < e.BITS_PER_WORD;y++) {
+              x & 1 << y && f.push(d * e.BITS_PER_WORD + y);
+            }
+          }
+        }
+        return f;
+      };
+      f.prototype.equals = function(f) {
+        if (this.size !== f.size) {
           return !1;
         }
         var c = this.bits;
-        d = d.bits;
-        for (var q = 0, f = c.length;q < f;q++) {
-          if (c[q] !== d[q]) {
+        f = f.bits;
+        for (var d = 0, g = c.length;d < g;d++) {
+          if (c[d] !== f[d]) {
             return !1;
           }
         }
         return !0;
       };
-      d.prototype.contains = function(d) {
-        if (this.size !== d.size) {
+      f.prototype.contains = function(f) {
+        if (this.size !== f.size) {
           return !1;
         }
         var c = this.bits;
-        d = d.bits;
-        for (var q = 0, f = c.length;q < f;q++) {
-          if ((c[q] | d[q]) !== c[q]) {
+        f = f.bits;
+        for (var d = 0, g = c.length;d < g;d++) {
+          if ((c[d] | f[d]) !== c[d]) {
             return !1;
           }
         }
         return !0;
       };
-      d.prototype.isEmpty = function() {
+      f.prototype.isEmpty = function() {
         this.recount();
         return 0 === this.count;
       };
-      d.prototype.clone = function() {
-        var c = new d(this.length);
+      f.prototype.clone = function() {
+        var c = new f(this.length);
         c._union(this);
         return c;
       };
-      return d;
+      return f;
     }();
-    e.Uint32ArrayBitSet = q;
-    var u = function() {
-      function d(c) {
+    e.Uint32ArrayBitSet = f;
+    var y = function() {
+      function f(c) {
         this.dirty = this.count = 0;
-        this.size = f(c);
+        this.size = g(c);
         this.bits = 0;
         this.singleWord = !0;
         this.length = c;
       }
-      d.prototype.recount = function() {
+      f.prototype.recount = function() {
         if (this.dirty) {
-          var d = this.bits, d = d - (d >> 1 & 1431655765), d = (d & 858993459) + (d >> 2 & 858993459);
-          this.count = 0 + (16843009 * (d + (d >> 4) & 252645135) >> 24);
+          var f = this.bits, f = f - (f >> 1 & 1431655765), f = (f & 858993459) + (f >> 2 & 858993459);
+          this.count = 0 + (16843009 * (f + (f >> 4) & 252645135) >> 24);
           this.dirty = 0;
         }
       };
-      d.prototype.set = function(d) {
+      f.prototype.set = function(f) {
         var c = this.bits;
-        this.bits = d = c | 1 << (d & e.BIT_INDEX_MASK);
-        this.dirty |= c ^ d;
-      };
-      d.prototype.setAll = function() {
+        this.bits = f = c | 1 << (f & e.BIT_INDEX_MASK);
+        this.dirty |= c ^ f;
+      };
+      f.prototype.setAll = function() {
         this.bits = 4294967295;
         this.count = this.size;
         this.dirty = 0;
       };
-      d.prototype.assign = function(d) {
-        this.count = d.count;
-        this.dirty = d.dirty;
-        this.size = d.size;
-        this.bits = d.bits;
-      };
-      d.prototype.clear = function(d) {
+      f.prototype.assign = function(f) {
+        this.count = f.count;
+        this.dirty = f.dirty;
+        this.size = f.size;
+        this.bits = f.bits;
+      };
+      f.prototype.clear = function(f) {
         var c = this.bits;
-        this.bits = d = c & ~(1 << (d & e.BIT_INDEX_MASK));
-        this.dirty |= c ^ d;
-      };
-      d.prototype.get = function(d) {
-        return 0 !== (this.bits & 1 << (d & e.BIT_INDEX_MASK));
-      };
-      d.prototype.clearAll = function() {
+        this.bits = f = c & ~(1 << (f & e.BIT_INDEX_MASK));
+        this.dirty |= c ^ f;
+      };
+      f.prototype.get = function(f) {
+        return 0 !== (this.bits & 1 << (f & e.BIT_INDEX_MASK));
+      };
+      f.prototype.clearAll = function() {
         this.dirty = this.count = this.bits = 0;
       };
-      d.prototype._union = function(d) {
+      f.prototype._union = function(f) {
         var c = this.bits;
-        this.bits = d = c | d.bits;
-        this.dirty = c ^ d;
-      };
-      d.prototype.intersect = function(d) {
+        this.bits = f = c | f.bits;
+        this.dirty = c ^ f;
+      };
+      f.prototype.intersect = function(f) {
         var c = this.bits;
-        this.bits = d = c & d.bits;
-        this.dirty = c ^ d;
-      };
-      d.prototype.subtract = function(d) {
+        this.bits = f = c & f.bits;
+        this.dirty = c ^ f;
+      };
+      f.prototype.subtract = function(f) {
         var c = this.bits;
-        this.bits = d = c & ~d.bits;
-        this.dirty = c ^ d;
-      };
-      d.prototype.negate = function() {
-        var d = this.bits, c = ~d;
+        this.bits = f = c & ~f.bits;
+        this.dirty = c ^ f;
+      };
+      f.prototype.negate = function() {
+        var f = this.bits, c = ~f;
         this.bits = c;
-        this.dirty = d ^ c;
-      };
-      d.prototype.forEach = function(d) {
+        this.dirty = f ^ c;
+      };
+      f.prototype.forEach = function(f) {
         var c = this.bits;
         if (c) {
-          for (var q = 0;q < e.BITS_PER_WORD;q++) {
-            c & 1 << q && d(q);
-          }
-        }
-      };
-      d.prototype.toArray = function() {
-        var d = [], c = this.bits;
+          for (var d = 0;d < e.BITS_PER_WORD;d++) {
+            c & 1 << d && f(d);
+          }
+        }
+      };
+      f.prototype.toArray = function() {
+        var f = [], c = this.bits;
         if (c) {
-          for (var q = 0;q < e.BITS_PER_WORD;q++) {
-            c & 1 << q && d.push(q);
-          }
-        }
-        return d;
-      };
-      d.prototype.equals = function(d) {
-        return this.bits === d.bits;
-      };
-      d.prototype.contains = function(d) {
+          for (var d = 0;d < e.BITS_PER_WORD;d++) {
+            c & 1 << d && f.push(d);
+          }
+        }
+        return f;
+      };
+      f.prototype.equals = function(f) {
+        return this.bits === f.bits;
+      };
+      f.prototype.contains = function(f) {
         var c = this.bits;
-        return (c | d.bits) === c;
-      };
-      d.prototype.isEmpty = function() {
+        return (c | f.bits) === c;
+      };
+      f.prototype.isEmpty = function() {
         this.recount();
         return 0 === this.count;
       };
-      d.prototype.clone = function() {
-        var c = new d(this.length);
+      f.prototype.clone = function() {
+        var c = new f(this.length);
         c._union(this);
         return c;
       };
-      return d;
+      return f;
     }();
-    e.Uint32BitSet = u;
-    u.prototype.toString = d;
-    u.prototype.toBitString = c;
-    q.prototype.toString = d;
-    q.prototype.toBitString = c;
-    e.BitSetFunctor = function(d) {
-      var c = 1 === f(d) >> e.ADDRESS_BITS_PER_WORD ? u : q;
+    e.Uint32BitSet = y;
+    y.prototype.toString = c;
+    y.prototype.toBitString = d;
+    f.prototype.toString = c;
+    f.prototype.toBitString = d;
+    e.BitSetFunctor = function(c) {
+      var d = 1 === g(c) >> e.ADDRESS_BITS_PER_WORD ? y : f;
       return function() {
-        return new c(d);
+        return new d(c);
       };
     };
   })(k.BitSets || (k.BitSets = {}));
-  a = function() {
+  b = function() {
     function e() {
     }
     e.randomStyle = function() {
       e._randomStyleCache || (e._randomStyleCache = "#ff5e3a #ff9500 #ffdb4c #87fc70 #52edc7 #1ad6fd #c644fc #ef4db6 #4a4a4a #dbddde #ff3b30 #ff9500 #ffcc00 #4cd964 #34aadc #007aff #5856d6 #ff2d55 #8e8e93 #c7c7cc #5ad427 #c86edf #d1eefc #e0f8d8 #fb2b69 #f7f7f7 #1d77ef #d6cec3 #55efcb #ff4981 #ffd3e0 #f7f7f7 #ff1300 #1f1f21 #bdbec2 #ff3a2d".split(" "));
       return e._randomStyleCache[e._nextStyle++ % e._randomStyleCache.length];
     };
-    e.gradientColor = function(f) {
-      return e._gradient[e._gradient.length * l.clamp(f, 0, 1) | 0];
-    };
-    e.contrastStyle = function(f) {
-      f = parseInt(f.substr(1), 16);
-      return 128 <= (299 * (f >> 16) + 587 * (f >> 8 & 255) + 114 * (f & 255)) / 1E3 ? "#000000" : "#ffffff";
+    e.gradientColor = function(g) {
+      return e._gradient[e._gradient.length * h.clamp(g, 0, 1) | 0];
+    };
+    e.contrastStyle = function(g) {
+      g = parseInt(g.substr(1), 16);
+      return 128 <= (299 * (g >> 16) + 587 * (g >> 8 & 255) + 114 * (g & 255)) / 1E3 ? "#000000" : "#ffffff";
     };
     e.reset = function() {
       e._nextStyle = 0;
     };
     e.TabToolbar = "#252c33";
     e.Toolbars = "#343c45";
     e.HighlightBlue = "#1d4f73";
     e.LightText = "#f5f7fa";
@@ -1569,2037 +1669,2086 @@ var START_TIME = performance.now();
     e.Orange = "#d96629";
     e.LightOrange = "#d99b28";
     e.Green = "#70bf53";
     e.BlueGrey = "#5e88b0";
     e._nextStyle = 0;
     e._gradient = "#FF0000 #FF1100 #FF2300 #FF3400 #FF4600 #FF5700 #FF6900 #FF7B00 #FF8C00 #FF9E00 #FFAF00 #FFC100 #FFD300 #FFE400 #FFF600 #F7FF00 #E5FF00 #D4FF00 #C2FF00 #B0FF00 #9FFF00 #8DFF00 #7CFF00 #6AFF00 #58FF00 #47FF00 #35FF00 #24FF00 #12FF00 #00FF00".split(" ");
     return e;
   }();
-  k.ColorStyle = a;
-  a = function() {
-    function e(f, c, d, q) {
-      this.xMin = f | 0;
-      this.yMin = c | 0;
-      this.xMax = d | 0;
-      this.yMax = q | 0;
-    }
-    e.FromUntyped = function(f) {
-      return new e(f.xMin, f.yMin, f.xMax, f.yMax);
-    };
-    e.FromRectangle = function(f) {
-      return new e(20 * f.x | 0, 20 * f.y | 0, 20 * (f.x + f.width) | 0, 20 * (f.y + f.height) | 0);
-    };
-    e.prototype.setElements = function(f, c, d, q) {
-      this.xMin = f;
-      this.yMin = c;
-      this.xMax = d;
-      this.yMax = q;
-    };
-    e.prototype.copyFrom = function(f) {
-      this.setElements(f.xMin, f.yMin, f.xMax, f.yMax);
-    };
-    e.prototype.contains = function(f, c) {
-      return f < this.xMin !== f < this.xMax && c < this.yMin !== c < this.yMax;
-    };
-    e.prototype.unionInPlace = function(f) {
-      f.isEmpty() || (this.extendByPoint(f.xMin, f.yMin), this.extendByPoint(f.xMax, f.yMax));
-    };
-    e.prototype.extendByPoint = function(f, c) {
-      this.extendByX(f);
-      this.extendByY(c);
-    };
-    e.prototype.extendByX = function(f) {
-      134217728 === this.xMin ? this.xMin = this.xMax = f : (this.xMin = Math.min(this.xMin, f), this.xMax = Math.max(this.xMax, f));
-    };
-    e.prototype.extendByY = function(f) {
-      134217728 === this.yMin ? this.yMin = this.yMax = f : (this.yMin = Math.min(this.yMin, f), this.yMax = Math.max(this.yMax, f));
-    };
-    e.prototype.intersects = function(f) {
-      return this.contains(f.xMin, f.yMin) || this.contains(f.xMax, f.yMax);
+  k.ColorStyle = b;
+  b = function() {
+    function e(g, d, c, f) {
+      this.xMin = g | 0;
+      this.yMin = d | 0;
+      this.xMax = c | 0;
+      this.yMax = f | 0;
+    }
+    e.FromUntyped = function(g) {
+      return new e(g.xMin, g.yMin, g.xMax, g.yMax);
+    };
+    e.FromRectangle = function(g) {
+      return new e(20 * g.x | 0, 20 * g.y | 0, 20 * (g.x + g.width) | 0, 20 * (g.y + g.height) | 0);
+    };
+    e.prototype.setElements = function(g, d, c, f) {
+      this.xMin = g;
+      this.yMin = d;
+      this.xMax = c;
+      this.yMax = f;
+    };
+    e.prototype.copyFrom = function(g) {
+      this.setElements(g.xMin, g.yMin, g.xMax, g.yMax);
+    };
+    e.prototype.contains = function(g, d) {
+      return g < this.xMin !== g < this.xMax && d < this.yMin !== d < this.yMax;
+    };
+    e.prototype.unionInPlace = function(g) {
+      g.isEmpty() || (this.extendByPoint(g.xMin, g.yMin), this.extendByPoint(g.xMax, g.yMax));
+    };
+    e.prototype.extendByPoint = function(g, d) {
+      this.extendByX(g);
+      this.extendByY(d);
+    };
+    e.prototype.extendByX = function(g) {
+      134217728 === this.xMin ? this.xMin = this.xMax = g : (this.xMin = Math.min(this.xMin, g), this.xMax = Math.max(this.xMax, g));
+    };
+    e.prototype.extendByY = function(g) {
+      134217728 === this.yMin ? this.yMin = this.yMax = g : (this.yMin = Math.min(this.yMin, g), this.yMax = Math.max(this.yMax, g));
+    };
+    e.prototype.intersects = function(g) {
+      return this.contains(g.xMin, g.yMin) || this.contains(g.xMax, g.yMax);
     };
     e.prototype.isEmpty = function() {
       return this.xMax <= this.xMin || this.yMax <= this.yMin;
     };
     Object.defineProperty(e.prototype, "width", {get:function() {
       return this.xMax - this.xMin;
-    }, set:function(f) {
-      this.xMax = this.xMin + f;
+    }, set:function(g) {
+      this.xMax = this.xMin + g;
     }, enumerable:!0, configurable:!0});
     Object.defineProperty(e.prototype, "height", {get:function() {
       return this.yMax - this.yMin;
-    }, set:function(f) {
-      this.yMax = this.yMin + f;
+    }, set:function(g) {
+      this.yMax = this.yMin + g;
     }, enumerable:!0, configurable:!0});
-    e.prototype.getBaseWidth = function(f) {
-      return Math.abs(Math.cos(f)) * (this.xMax - this.xMin) + Math.abs(Math.sin(f)) * (this.yMax - this.yMin);
-    };
-    e.prototype.getBaseHeight = function(f) {
-      return Math.abs(Math.sin(f)) * (this.xMax - this.xMin) + Math.abs(Math.cos(f)) * (this.yMax - this.yMin);
+    e.prototype.getBaseWidth = function(g) {
+      var d = Math.abs(Math.cos(g));
+      g = Math.abs(Math.sin(g));
+      return d * (this.xMax - this.xMin) + g * (this.yMax - this.yMin);
+    };
+    e.prototype.getBaseHeight = function(g) {
+      var d = Math.abs(Math.cos(g));
+      return Math.abs(Math.sin(g)) * (this.xMax - this.xMin) + d * (this.yMax - this.yMin);
     };
     e.prototype.setEmpty = function() {
       this.xMin = this.yMin = this.xMax = this.yMax = 0;
     };
     e.prototype.setToSentinels = function() {
       this.xMin = this.yMin = this.xMax = this.yMax = 134217728;
     };
     e.prototype.clone = function() {
       return new e(this.xMin, this.yMin, this.xMax, this.yMax);
     };
     e.prototype.toString = function() {
       return "{ xMin: " + this.xMin + ", xMin: " + this.yMin + ", xMax: " + this.xMax + ", xMax: " + this.yMax + " }";
     };
     return e;
   }();
-  k.Bounds = a;
-  a = function() {
-    function e(f, c, d, q) {
-      n.assert(r(f));
-      n.assert(r(c));
-      n.assert(r(d));
-      n.assert(r(q));
-      this._xMin = f | 0;
-      this._yMin = c | 0;
-      this._xMax = d | 0;
-      this._yMax = q | 0;
-    }
-    e.FromUntyped = function(f) {
-      return new e(f.xMin, f.yMin, f.xMax, f.yMax);
-    };
-    e.FromRectangle = function(f) {
-      return new e(20 * f.x | 0, 20 * f.y | 0, 20 * (f.x + f.width) | 0, 20 * (f.y + f.height) | 0);
-    };
-    e.prototype.setElements = function(f, c, d, q) {
-      this.xMin = f;
-      this.yMin = c;
-      this.xMax = d;
-      this.yMax = q;
-    };
-    e.prototype.copyFrom = function(f) {
-      this.setElements(f.xMin, f.yMin, f.xMax, f.yMax);
-    };
-    e.prototype.contains = function(f, c) {
-      return f < this.xMin !== f < this.xMax && c < this.yMin !== c < this.yMax;
-    };
-    e.prototype.unionInPlace = function(f) {
-      f.isEmpty() || (this.extendByPoint(f.xMin, f.yMin), this.extendByPoint(f.xMax, f.yMax));
-    };
-    e.prototype.extendByPoint = function(f, c) {
-      this.extendByX(f);
-      this.extendByY(c);
-    };
-    e.prototype.extendByX = function(f) {
-      134217728 === this.xMin ? this.xMin = this.xMax = f : (this.xMin = Math.min(this.xMin, f), this.xMax = Math.max(this.xMax, f));
-    };
-    e.prototype.extendByY = function(f) {
-      134217728 === this.yMin ? this.yMin = this.yMax = f : (this.yMin = Math.min(this.yMin, f), this.yMax = Math.max(this.yMax, f));
-    };
-    e.prototype.intersects = function(f) {
-      return this.contains(f._xMin, f._yMin) || this.contains(f._xMax, f._yMax);
+  k.Bounds = b;
+  b = function() {
+    function e(g, d, c, f) {
+      m.assert(p(g));
+      m.assert(p(d));
+      m.assert(p(c));
+      m.assert(p(f));
+      this._xMin = g | 0;
+      this._yMin = d | 0;
+      this._xMax = c | 0;
+      this._yMax = f | 0;
+    }
+    e.FromUntyped = function(g) {
+      return new e(g.xMin, g.yMin, g.xMax, g.yMax);
+    };
+    e.FromRectangle = function(g) {
+      return new e(20 * g.x | 0, 20 * g.y | 0, 20 * (g.x + g.width) | 0, 20 * (g.y + g.height) | 0);
+    };
+    e.prototype.setElements = function(g, d, c, f) {
+      this.xMin = g;
+      this.yMin = d;
+      this.xMax = c;
+      this.yMax = f;
+    };
+    e.prototype.copyFrom = function(g) {
+      this.setElements(g.xMin, g.yMin, g.xMax, g.yMax);
+    };
+    e.prototype.contains = function(g, d) {
+      return g < this.xMin !== g < this.xMax && d < this.yMin !== d < this.yMax;
+    };
+    e.prototype.unionInPlace = function(g) {
+      g.isEmpty() || (this.extendByPoint(g.xMin, g.yMin), this.extendByPoint(g.xMax, g.yMax));
+    };
+    e.prototype.extendByPoint = function(g, d) {
+      this.extendByX(g);
+      this.extendByY(d);
+    };
+    e.prototype.extendByX = function(g) {
+      134217728 === this.xMin ? this.xMin = this.xMax = g : (this.xMin = Math.min(this.xMin, g), this.xMax = Math.max(this.xMax, g));
+    };
+    e.prototype.extendByY = function(g) {
+      134217728 === this.yMin ? this.yMin = this.yMax = g : (this.yMin = Math.min(this.yMin, g), this.yMax = Math.max(this.yMax, g));
+    };
+    e.prototype.intersects = function(g) {
+      return this.contains(g._xMin, g._yMin) || this.contains(g._xMax, g._yMax);
     };
     e.prototype.isEmpty = function() {
       return this._xMax <= this._xMin || this._yMax <= this._yMin;
     };
     Object.defineProperty(e.prototype, "xMin", {get:function() {
       return this._xMin;
-    }, set:function(f) {
-      n.assert(r(f));
-      this._xMin = f;
+    }, set:function(g) {
+      m.assert(p(g));
+      this._xMin = g;
     }, enumerable:!0, configurable:!0});
     Object.defineProperty(e.prototype, "yMin", {get:function() {
       return this._yMin;
-    }, set:function(f) {
-      n.assert(r(f));
-      this._yMin = f | 0;
+    }, set:function(g) {
+      m.assert(p(g));
+      this._yMin = g | 0;
     }, enumerable:!0, configurable:!0});
     Object.defineProperty(e.prototype, "xMax", {get:function() {
       return this._xMax;
-    }, set:function(f) {
-      n.assert(r(f));
-      this._xMax = f | 0;
+    }, set:function(g) {
+      m.assert(p(g));
+      this._xMax = g | 0;
     }, enumerable:!0, configurable:!0});
     Object.defineProperty(e.prototype, "width", {get:function() {
       return this._xMax - this._xMin;
     }, enumerable:!0, configurable:!0});
     Object.defineProperty(e.prototype, "yMax", {get:function() {
       return this._yMax;
-    }, set:function(f) {
-      n.assert(r(f));
-      this._yMax = f | 0;
+    }, set:function(g) {
+      m.assert(p(g));
+      this._yMax = g | 0;
     }, enumerable:!0, configurable:!0});
     Object.defineProperty(e.prototype, "height", {get:function() {
       return this._yMax - this._yMin;
     }, enumerable:!0, configurable:!0});
-    e.prototype.getBaseWidth = function(f) {
-      return Math.abs(Math.cos(f)) * (this._xMax - this._xMin) + Math.abs(Math.sin(f)) * (this._yMax - this._yMin);
-    };
-    e.prototype.getBaseHeight = function(f) {
-      return Math.abs(Math.sin(f)) * (this._xMax - this._xMin) + Math.abs(Math.cos(f)) * (this._yMax - this._yMin);
+    e.prototype.getBaseWidth = function(g) {
+      var d = Math.abs(Math.cos(g));
+      g = Math.abs(Math.sin(g));
+      return d * (this._xMax - this._xMin) + g * (this._yMax - this._yMin);
+    };
+    e.prototype.getBaseHeight = function(g) {
+      var d = Math.abs(Math.cos(g));
+      return Math.abs(Math.sin(g)) * (this._xMax - this._xMin) + d * (this._yMax - this._yMin);
     };
     e.prototype.setEmpty = function() {
       this._xMin = this._yMin = this._xMax = this._yMax = 0;
     };
     e.prototype.clone = function() {
       return new e(this.xMin, this.yMin, this.xMax, this.yMax);
     };
     e.prototype.toString = function() {
-      return "{ xMin: " + this._xMin + ", xMin: " + this._yMin + ", xMax: " + this._xMax + ", yMax: " + this._yMax + " }";
+      return "{ xMin: " + this._xMin + ", yMin: " + this._yMin + ", xMax: " + this._xMax + ", yMax: " + this._yMax + " }";
     };
     e.prototype.assertValid = function() {
     };
     return e;
   }();
-  k.DebugBounds = a;
-  a = function() {
-    function e(f, c, d, q) {
-      this.r = f;
-      this.g = c;
-      this.b = d;
-      this.a = q;
-    }
-    e.FromARGB = function(f) {
-      return new e((f >> 16 & 255) / 255, (f >> 8 & 255) / 255, (f >> 0 & 255) / 255, (f >> 24 & 255) / 255);
-    };
-    e.FromRGBA = function(f) {
-      return e.FromARGB(t.RGBAToARGB(f));
+  k.DebugBounds = b;
+  b = function() {
+    function e(g, d, c, f) {
+      this.r = g;
+      this.g = d;
+      this.b = c;
+      this.a = f;
+    }
+    e.FromARGB = function(g) {
+      return new e((g >> 16 & 255) / 255, (g >> 8 & 255) / 255, (g >> 0 & 255) / 255, (g >> 24 & 255) / 255);
+    };
+    e.FromRGBA = function(g) {
+      return e.FromARGB(n.RGBAToARGB(g));
     };
     e.prototype.toRGBA = function() {
       return 255 * this.r << 24 | 255 * this.g << 16 | 255 * this.b << 8 | 255 * this.a;
     };
     e.prototype.toCSSStyle = function() {
-      return t.rgbaToCSSStyle(this.toRGBA());
-    };
-    e.prototype.set = function(f) {
-      this.r = f.r;
-      this.g = f.g;
-      this.b = f.b;
-      this.a = f.a;
-    };
-    e.randomColor = function() {
-      var f = .4;
-      void 0 === f && (f = 1);
-      return new e(Math.random(), Math.random(), Math.random(), f);
-    };
-    e.parseColor = function(f) {
+      return n.rgbaToCSSStyle(this.toRGBA());
+    };
+    e.prototype.set = function(g) {
+      this.r = g.r;
+      this.g = g.g;
+      this.b = g.b;
+      this.a = g.a;
+    };
+    e.randomColor = function(g) {
+      void 0 === g && (g = 1);
+      return new e(Math.random(), Math.random(), Math.random(), g);
+    };
+    e.parseColor = function(g) {
       e.colorCache || (e.colorCache = Object.create(null));
-      if (e.colorCache[f]) {
-        return e.colorCache[f];
-      }
-      var c = document.createElement("span");
-      document.body.appendChild(c);
-      c.style.backgroundColor = f;
-      var d = getComputedStyle(c).backgroundColor;
-      document.body.removeChild(c);
-      (c = /^rgb\((\d+), (\d+), (\d+)\)$/.exec(d)) || (c = /^rgba\((\d+), (\d+), (\d+), ([\d.]+)\)$/.exec(d));
-      d = new e(0, 0, 0, 0);
-      d.r = parseFloat(c[1]) / 255;
-      d.g = parseFloat(c[2]) / 255;
-      d.b = parseFloat(c[3]) / 255;
-      d.a = c[4] ? parseFloat(c[4]) / 255 : 1;
-      return e.colorCache[f] = d;
+      if (e.colorCache[g]) {
+        return e.colorCache[g];
+      }
+      var d = document.createElement("span");
+      document.body.appendChild(d);
+      d.style.backgroundColor = g;
+      var c = getComputedStyle(d).backgroundColor;
+      document.body.removeChild(d);
+      (d = /^rgb\((\d+), (\d+), (\d+)\)$/.exec(c)) || (d = /^rgba\((\d+), (\d+), (\d+), ([\d.]+)\)$/.exec(c));
+      c = new e(0, 0, 0, 0);
+      c.r = parseFloat(d[1]) / 255;
+      c.g = parseFloat(d[2]) / 255;
+      c.b = parseFloat(d[3]) / 255;
+      c.a = d[4] ? parseFloat(d[4]) / 255 : 1;
+      return e.colorCache[g] = c;
     };
     e.Red = new e(1, 0, 0, 1);
     e.Green = new e(0, 1, 0, 1);
     e.Blue = new e(0, 0, 1, 1);
     e.None = new e(0, 0, 0, 0);
     e.White = new e(1, 1, 1, 1);
     e.Black = new e(0, 0, 0, 1);
     e.colorCache = {};
     return e;
   }();
-  k.Color = a;
-  var t;
+  k.Color = b;
+  var n;
   (function(e) {
-    function f(d) {
-      var c, f, e = d >> 24 & 255;
-      f = (Math.imul(d >> 16 & 255, e) + 127) / 255 | 0;
-      c = (Math.imul(d >> 8 & 255, e) + 127) / 255 | 0;
-      d = (Math.imul(d >> 0 & 255, e) + 127) / 255 | 0;
-      return e << 24 | f << 16 | c << 8 | d;
-    }
-    e.RGBAToARGB = function(d) {
-      return d >> 8 & 16777215 | (d & 255) << 24;
-    };
-    e.ARGBToRGBA = function(d) {
-      return d << 8 | d >> 24 & 255;
-    };
-    e.rgbaToCSSStyle = function(d) {
-      return k.StringUtilities.concat9("rgba(", d >> 24 & 255, ",", d >> 16 & 255, ",", d >> 8 & 255, ",", (d & 255) / 255, ")");
-    };
-    e.cssStyleToRGBA = function(d) {
-      if ("#" === d[0]) {
-        if (7 === d.length) {
-          return parseInt(d.substring(1), 16) << 8 | 255;
+    function g(f) {
+      var c = f >> 0 & 255, d = f >> 8 & 255, g = f >> 24 & 255;
+      f = (Math.imul(f >> 16 & 255, g) + 127) / 255 | 0;
+      d = (Math.imul(d, g) + 127) / 255 | 0;
+      c = (Math.imul(c, g) + 127) / 255 | 0;
+      return g << 24 | f << 16 | d << 8 | c;
+    }
+    function d() {
+      if (!c) {
+        c = new Uint8Array(65536);
+        for (var f = 0;256 > f;f++) {
+          for (var d = 0;256 > d;d++) {
+            c[(d << 8) + f] = Math.imul(255, f) / d;
+          }
+        }
+      }
+    }
+    e.RGBAToARGB = function(f) {
+      return f >> 8 & 16777215 | (f & 255) << 24;
+    };
+    e.ARGBToRGBA = function(f) {
+      return f << 8 | f >> 24 & 255;
+    };
+    e.rgbaToCSSStyle = function(f) {
+      return k.StringUtilities.concat9("rgba(", f >> 24 & 255, ",", f >> 16 & 255, ",", f >> 8 & 255, ",", (f & 255) / 255, ")");
+    };
+    e.cssStyleToRGBA = function(f) {
+      if ("#" === f[0]) {
+        if (7 === f.length) {
+          return parseInt(f.substring(1), 16) << 8 | 255;
         }
       } else {
-        if ("r" === d[0]) {
-          return d = d.substring(5, d.length - 1).split(","), (parseInt(d[0]) & 255) << 24 | (parseInt(d[1]) & 255) << 16 | (parseInt(d[2]) & 255) << 8 | 255 * parseFloat(d[3]) & 255;
+        if ("r" === f[0]) {
+          var c = f.substring(5, f.length - 1).split(",");
+          f = parseInt(c[0]);
+          var d = parseInt(c[1]), g = parseInt(c[2]), c = parseFloat(c[3]);
+          return (f & 255) << 24 | (d & 255) << 16 | (g & 255) << 8 | 255 * c & 255;
         }
       }
       return 4278190335;
     };
-    e.hexToRGB = function(d) {
-      return parseInt(d.slice(1), 16);
-    };
-    e.rgbToHex = function(d) {
-      return "#" + ("000000" + (d >>> 0).toString(16)).slice(-6);
-    };
-    e.isValidHexColor = function(d) {
-      return /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(d);
-    };
-    e.clampByte = function(d) {
-      return Math.max(0, Math.min(255, d));
-    };
-    e.unpremultiplyARGB = function(d) {
-      var c, f, e = d >> 24 & 255;
-      f = Math.imul(255, d >> 16 & 255) / e & 255;
-      c = Math.imul(255, d >> 8 & 255) / e & 255;
-      d = Math.imul(255, d >> 0 & 255) / e & 255;
-      return e << 24 | f << 16 | c << 8 | d;
-    };
-    e.premultiplyARGB = f;
+    e.hexToRGB = function(f) {
+      return parseInt(f.slice(1), 16);
+    };
+    e.rgbToHex = function(f) {
+      return "#" + ("000000" + (f >>> 0).toString(16)).slice(-6);
+    };
+    e.isValidHexColor = function(f) {
+      return /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(f);
+    };
+    e.clampByte = function(f) {
+      return Math.max(0, Math.min(255, f));
+    };
+    e.unpremultiplyARGB = function(f) {
+      var c = f >> 0 & 255, d = f >> 8 & 255, g = f >> 24 & 255;
+      f = Math.imul(255, f >> 16 & 255) / g & 255;
+      d = Math.imul(255, d) / g & 255;
+      c = Math.imul(255, c) / g & 255;
+      return g << 24 | f << 16 | d << 8 | c;
+    };
+    e.premultiplyARGB = g;
     var c;
-    e.ensureUnpremultiplyTable = function() {
-      if (!c) {
-        c = new Uint8Array(65536);
-        for (var d = 0;256 > d;d++) {
-          for (var f = 0;256 > f;f++) {
-            c[(f << 8) + d] = Math.imul(255, d) / f;
-          }
-        }
-      }
-    };
-    e.tableLookupUnpremultiplyARGB = function(d) {
-      d |= 0;
-      var f = d >> 24 & 255;
-      if (0 === f) {
+    e.ensureUnpremultiplyTable = d;
+    e.getUnpremultiplyTable = function() {
+      d();
+      return c;
+    };
+    e.tableLookupUnpremultiplyARGB = function(f) {
+      f |= 0;
+      var d = f >> 24 & 255;
+      if (0 === d) {
         return 0;
       }
-      if (255 === f) {
-        return d;
-      }
-      var e, a, h = f << 8, p = c;
-      a = p[h + (d >> 16 & 255)];
-      e = p[h + (d >> 8 & 255)];
-      d = p[h + (d >> 0 & 255)];
-      return f << 24 | a << 16 | e << 8 | d;
-    };
-    e.blendPremultipliedBGRA = function(d, c) {
-      var f, e;
-      e = 256 - (c & 255);
-      f = Math.imul(d & 16711935, e) >> 8;
-      e = Math.imul(d >> 8 & 16711935, e) >> 8;
-      return ((c >> 8 & 16711935) + e & 16711935) << 8 | (c & 16711935) + f & 16711935;
-    };
-    var d = w.swap32;
-    e.convertImage = function(q, e, a, h) {
-      var p = a.length;
-      if (q === e) {
-        if (a !== h) {
-          for (q = 0;q < p;q++) {
-            h[q] = a[q];
+      if (255 === d) {
+        return f;
+      }
+      var g, e, b = d << 8, a = c;
+      e = a[b + (f >> 16 & 255)];
+      g = a[b + (f >> 8 & 255)];
+      f = a[b + (f >> 0 & 255)];
+      return d << 24 | e << 16 | g << 8 | f;
+    };
+    e.blendPremultipliedBGRA = function(f, c) {
+      var d = c & 16711935, g = c >> 8 & 16711935, e, b = f >> 8 & 16711935, a = 256 - (c & 255);
+      e = Math.imul(f & 16711935, a) >> 8;
+      b = Math.imul(b, a) >> 8;
+      return (g + b & 16711935) << 8 | d + e & 16711935;
+    };
+    var f = t.swap32;
+    e.convertImage = function(d, e, b, a) {
+      var l = b.length;
+      if (d === e) {
+        if (b !== a) {
+          for (d = 0;d < l;d++) {
+            a[d] = b[d];
           }
         }
       } else {
-        if (1 === q && 3 === e) {
-          for (k.ColorUtilities.ensureUnpremultiplyTable(), q = 0;q < p;q++) {
-            var m = a[q];
-            e = m & 255;
+        if (1 === d && 3 === e) {
+          for (k.ColorUtilities.ensureUnpremultiplyTable(), d = 0;d < l;d++) {
+            var h = b[d];
+            e = h & 255;
             if (0 === e) {
-              h[q] = 0;
+              a[d] = 0;
             } else {
               if (255 === e) {
-                h[q] = 4278190080 | m >> 8 & 16777215;
+                a[d] = 4278190080 | h >> 8 & 16777215;
               } else {
-                var b = m >> 24 & 255, l = m >> 16 & 255, m = m >> 8 & 255, t = e << 8, w = c, m = w[t + m], l = w[t + l], b = w[t + b];
-                h[q] = e << 24 | b << 16 | l << 8 | m;
+                var r = h >> 24 & 255, n = h >> 16 & 255, h = h >> 8 & 255, t = e << 8, q = c, h = q[t + h], n = q[t + n], r = q[t + r];
+                a[d] = e << 24 | r << 16 | n << 8 | h;
               }
             }
           }
         } else {
-          if (2 === q && 3 === e) {
-            for (q = 0;q < p;q++) {
-              h[q] = d(a[q]);
+          if (2 === d && 3 === e) {
+            for (d = 0;d < l;d++) {
+              a[d] = f(b[d]);
             }
           } else {
-            if (3 === q && 1 === e) {
-              for (q = 0;q < p;q++) {
-                e = a[q], h[q] = d(f(e & 4278255360 | e >> 16 & 255 | (e & 255) << 16));
+            if (3 === d && 1 === e) {
+              for (d = 0;d < l;d++) {
+                e = b[d], a[d] = f(g(e & 4278255360 | e >> 16 & 255 | (e & 255) << 16));
               }
             } else {
-              for (n.somewhatImplemented("Image Format Conversion: " + x[q] + " -> " + x[e]), q = 0;q < p;q++) {
-                h[q] = a[q];
+              for (m.somewhatImplemented("Image Format Conversion: " + v[d] + " -> " + v[e]), d = 0;d < l;d++) {
+                a[d] = b[d];
               }
             }
           }
         }
       }
     };
-  })(t = k.ColorUtilities || (k.ColorUtilities = {}));
-  a = function() {
-    function e(f) {
-      void 0 === f && (f = 32);
+  })(n = k.ColorUtilities || (k.ColorUtilities = {}));
+  b = function() {
+    function e(g) {
+      void 0 === g && (g = 32);
       this._list = [];
-      this._maxSize = f;
-    }
-    e.prototype.acquire = function(f) {
+      this._maxSize = g;
+    }
+    e.prototype.acquire = function(g) {
       if (e._enabled) {
-        for (var c = this._list, d = 0;d < c.length;d++) {
-          var q = c[d];
-          if (q.byteLength >= f) {
-            return c.splice(d, 1), q;
-          }
-        }
-      }
-      return new ArrayBuffer(f);
-    };
-    e.prototype.release = function(f) {
+        for (var d = this._list, c = 0;c < d.length;c++) {
+          var f = d[c];
+          if (f.byteLength >= g) {
+            return d.splice(c, 1), f;
+          }
+        }
+      }
+      return new ArrayBuffer(g);
+    };
+    e.prototype.release = function(g) {
       if (e._enabled) {
-        var c = this._list;
-        c.length === this._maxSize && c.shift();
-        c.push(f);
-      }
-    };
-    e.prototype.ensureUint8ArrayLength = function(f, c) {
-      if (f.length >= c) {
-        return f;
-      }
-      var d = Math.max(f.length + c, (3 * f.length >> 1) + 1), d = new Uint8Array(this.acquire(d), 0, d);
-      d.set(f);
-      this.release(f.buffer);
-      return d;
-    };
-    e.prototype.ensureFloat64ArrayLength = function(f, c) {
-      if (f.length >= c) {
-        return f;
-      }
-      var d = Math.max(f.length + c, (3 * f.length >> 1) + 1), d = new Float64Array(this.acquire(d * Float64Array.BYTES_PER_ELEMENT), 0, d);
-      d.set(f);
-      this.release(f.buffer);
-      return d;
+        var d = this._list;
+        d.length === this._maxSize && d.shift();
+        d.push(g);
+      }
+    };
+    e.prototype.ensureUint8ArrayLength = function(g, d) {
+      if (g.length >= d) {
+        return g;
+      }
+      var c = Math.max(g.length + d, (3 * g.length >> 1) + 1), c = new Uint8Array(this.acquire(c), 0, c);
+      c.set(g);
+      this.release(g.buffer);
+      return c;
+    };
+    e.prototype.ensureFloat64ArrayLength = function(g, d) {
+      if (g.length >= d) {
+        return g;
+      }
+      var c = Math.max(g.length + d, (3 * g.length >> 1) + 1), c = new Float64Array(this.acquire(c * Float64Array.BYTES_PER_ELEMENT), 0, c);
+      c.set(g);
+      this.release(g.buffer);
+      return c;
     };
     e._enabled = !0;
     return e;
   }();
-  k.ArrayBufferPool = a;
+  k.ArrayBufferPool = b;
   (function(e) {
-    (function(f) {
-      f[f.EXTERNAL_INTERFACE_FEATURE = 1] = "EXTERNAL_INTERFACE_FEATURE";
-      f[f.CLIPBOARD_FEATURE = 2] = "CLIPBOARD_FEATURE";
-      f[f.SHAREDOBJECT_FEATURE = 3] = "SHAREDOBJECT_FEATURE";
-      f[f.VIDEO_FEATURE = 4] = "VIDEO_FEATURE";
-      f[f.SOUND_FEATURE = 5] = "SOUND_FEATURE";
-      f[f.NETCONNECTION_FEATURE = 6] = "NETCONNECTION_FEATURE";
+    (function(g) {
+      g[g.EXTERNAL_INTERFACE_FEATURE = 1] = "EXTERNAL_INTERFACE_FEATURE";
+      g[g.CLIPBOARD_FEATURE = 2] = "CLIPBOARD_FEATURE";
+      g[g.SHAREDOBJECT_FEATURE = 3] = "SHAREDOBJECT_FEATURE";
+      g[g.VIDEO_FEATURE = 4] = "VIDEO_FEATURE";
+      g[g.SOUND_FEATURE = 5] = "SOUND_FEATURE";
+      g[g.NETCONNECTION_FEATURE = 6] = "NETCONNECTION_FEATURE";
     })(e.Feature || (e.Feature = {}));
-    (function(f) {
-      f[f.AVM1_ERROR = 1] = "AVM1_ERROR";
-      f[f.AVM2_ERROR = 2] = "AVM2_ERROR";
+    (function(g) {
+      g[g.AVM1_ERROR = 1] = "AVM1_ERROR";
+      g[g.AVM2_ERROR = 2] = "AVM2_ERROR";
     })(e.ErrorTypes || (e.ErrorTypes = {}));
+    (function(g) {
+      g[g.LoadSource = 0] = "LoadSource";
+      g[g.LoadWhitelistAllowed = 1] = "LoadWhitelistAllowed";
+      g[g.LoadWhitelistDenied = 2] = "LoadWhitelistDenied";
+      g[g.StreamAllowed = 3] = "StreamAllowed";
+      g[g.StreamDenied = 4] = "StreamDenied";
+      g[g.StreamCrossdomain = 5] = "StreamCrossdomain";
+    })(e.LoadResource || (e.LoadResource = {}));
     e.instance;
   })(k.Telemetry || (k.Telemetry = {}));
   (function(e) {
     e.instance;
   })(k.FileLoadingService || (k.FileLoadingService = {}));
   (function(e) {
     e[e.BuiltinAbc = 0] = "BuiltinAbc";
     e[e.PlayerglobalAbcs = 1] = "PlayerglobalAbcs";
     e[e.PlayerglobalManifest = 2] = "PlayerglobalManifest";
     e[e.ShellAbc = 3] = "ShellAbc";
   })(k.SystemResourceId || (k.SystemResourceId = {}));
   (function(e) {
     e.instance;
   })(k.SystemResourcesLoadingService || (k.SystemResourcesLoadingService = {}));
-  k.registerCSSFont = function(e, f, c) {
+  k.registerCSSFont = function(e, g, d) {
     if (inBrowser) {
-      var d = document.head;
-      d.insertBefore(document.createElement("style"), d.firstChild);
-      d = document.styleSheets[0];
-      f = "@font-face{font-family:swffont" + e + ";src:url(data:font/opentype;base64," + k.StringUtilities.base64ArrayBuffer(f) + ")}";
-      d.insertRule(f, d.cssRules.length);
-      c && (c = document.createElement("div"), c.style.fontFamily = "swffont" + e, c.innerHTML = "hello", document.body.appendChild(c), document.body.removeChild(c));
+      var c = document.head;
+      c.insertBefore(document.createElement("style"), c.firstChild);
+      c = document.styleSheets[0];
+      g = "@font-face{font-family:swffont" + e + ";src:url(data:font/opentype;base64," + k.StringUtilities.base64ArrayBuffer(g.buffer) + ")}";
+      c.insertRule(g, c.cssRules.length);
+      d && (d = document.createElement("div"), d.style.fontFamily = "swffont" + e, d.innerHTML = "hello", document.body.appendChild(d), document.body.removeChild(d));
+    } else {
+      m.warning("Cannot register CSS font outside the browser");
     }
   };
+  k.registerFallbackFont = function() {
+    var e = document.styleSheets[0];
+    e.insertRule('@font-face{font-family:AdobeBlank;src:url("data:font/opentype;base64,T1RUTwAKAIAAAwAgQ0ZGIDTeCDQAACFkAAAZPERTSUcAAAABAABKqAAAAAhPUy8yAF+xmwAAARAAAABgY21hcCRDbtEAAAdcAAAZ6GhlYWQFl9tDAAAArAAAADZoaGVhB1oD7wAAAOQAAAAkaG10eAPoAHwAADqgAAAQBm1heHAIAVAAAAABCAAAAAZuYW1lIE0HkgAAAXAAAAXrcG9zdP+4ADIAACFEAAAAIAABAAAAAQuFfcPHtV8PPPUAAwPoAAAAANFMRfMAAAAA0UxF8wB8/4gDbANwAAAAAwACAAAAAAAAAAEAAANw/4gAAAPoAHwAfANsAAEAAAAAAAAAAAAAAAAAAAACAABQAAgBAAAAAwPoAZAABQAAAooCWAAAAEsCigJYAAABXgAyANwAAAAAAAAAAAAAAAD3/67/+9///w/gAD8AAAAAQURCTwBAAAD//wNw/4gAAANwAHhgLwH/AAAAAAAAAAAAAAAgAAAAAAARANIAAQAAAAAAAQALAAAAAQAAAAAAAgAHAAsAAQAAAAAAAwAbABIAAQAAAAAABAALAAAAAQAAAAAABQA6AC0AAQAAAAAABgAKAGcAAwABBAkAAACUAHEAAwABBAkAAQAWAQUAAwABBAkAAgAOARsAAwABBAkAAwA2ASkAAwABBAkABAAWAQUAAwABBAkABQB0AV8AAwABBAkABgAUAdMAAwABBAkACAA0AecAAwABBAkACwA0AhsAAwABBAkADQKWAk8AAwABBAkADgA0BOVBZG9iZSBCbGFua1JlZ3VsYXIxLjA0NTtBREJPO0Fkb2JlQmxhbms7QURPQkVWZXJzaW9uIDEuMDQ1O1BTIDEuMDQ1O2hvdGNvbnYgMS4wLjgyO21ha2VvdGYubGliMi41LjYzNDA2QWRvYmVCbGFuawBDAG8AcAB5AHIAaQBnAGgAdAAgAKkAIAAyADAAMQAzACwAIAAyADAAMQA1ACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAKABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwApAC4AQQBkAG8AYgBlACAAQgBsAGEAbgBrAFIAZQBnAHUAbABhAHIAMQAuADAANAA1ADsAQQBEAEIATwA7AEEAZABvAGIAZQBCAGwAYQBuAGsAOwBBAEQATwBCAEUAVgBlAHIAcwBpAG8AbgAgADEALgAwADQANQA7AFAAUwAgADEALgAwADQANQA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADgAMgA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADYAMwA0ADAANgBBAGQAbwBiAGUAQgBsAGEAbgBrAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwB0AHkAcABlAC8AVABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABpAHMAIABsAGkAYwBlAG4AcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAFMASQBMACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgAgAFQAaABpAHMAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAaQBzACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAbwBuACAAYQBuACAAIgBBAFMAIABJAFMAIgAgAEIAQQBTAEkAUwAsACAAVwBJAFQASABPAFUAVAAgAFcAQQBSAFIAQQBOAFQASQBFAFMAIABPAFIAIABDAE8ATgBEAEkAVABJAE8ATgBTACAATwBGACAAQQBOAFkAIABLAEkATgBEACwAIABlAGkAdABoAGUAcgAgAGUAeABwAHIAZQBzAHMAIABvAHIAIABpAG0AcABsAGkAZQBkAC4AIABTAGUAZQAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUAIABmAG8AcgAgAHQAaABlACAAcwBwAGUAYwBpAGYAaQBjACAAbABhAG4AZwB1AGEAZwBlACwAIABwAGUAcgBtAGkAcwBzAGkAbwBuAHMAIABhAG4AZAAgAGwAaQBtAGkAdABhAHQAaQBvAG4AcwAgAGcAbwB2AGUAcgBuAGkAbgBnACAAeQBvAHUAcgAgAHUAcwBlACAAbwBmACAAdABoAGkA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wwDEAMUAxgDHAMgAyQDKAMsAzADNAM4AzwDQANEA0gDTANQA1QDWANcA2ADZANoA2wDcAN0A3gDfAOAA4QDiAOMA5ADlAOYA5wDoAOkA6gDrAOwA7QDuAO8A8ADxAPIA8wD0APUA9gD3APgA+QD6APsA/AD9AP4A/wEAAQEBAgEDAQQBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMBFAEVARYBFwEYARkBGgEbARwBHQEeAR8BIAEhASIBIwEkASUBJgEnASgBKQEqASsBLAEtAS4BLwEwATEBMgEzATQBNQE2ATcBOAE5AToBOwE8AT0BPgE/AUABQQFCAUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOAU8BUAFRAVIBUwFUAVUBVgFXAVgBWQFaAVsBXAFdAV4BXwFgAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgFvAXABcQFyAXMBdAF1AXYBdwF4AXkBegF7AXwBfQF+AX8BgAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AbgBuQG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHGAccByAHJAcoBywHMAc0BzgHPAdAB0QHSAdMB1AHVAdYB1wHYAdkB2gHbAdwB3QHeAd8B4AHhAeIB4wHkAeUB5gHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAfQB9QH2AfcB+AH5AfoB+wH8Af0B/gH/AgACAQICAgMCBAIFAgYCBwIIAgkCCgILAgwCDQIOAg8CEAIRAhICEwIUAhUCFgIXAhgCGQIaAhsCHAIdAh4CHwIgAiECIgIjAiQCJQImAicCKAIpAioCKwIsAi0CLgIvAjACMQIyAjMCNAI1AjYCNwI4AjkCOgI7AjwCPQI+Aj8CQAJBAkICQwJEAkUCRgJHAkgCSQJKAksCTAJNAk4CTwJQAlECUgJTAlQCVQJWAlcCWAJZAloCWwJcAl0CXgJfAmACYQJiAmMCZAJlAmYCZwJoAmkCagJrAmwCbQJuAm8CcAJxAnICcwJ0AnUCdgJ3AngCeQJ6AnsCfAJ9An4CfwKAAoECggKDAoQChQKGAocCiAKJAooCiwKMAo0CjgKPApACkQKSApMClAKVApYClwKYApkCmgKbApwCnQKeAp8CoAKhAqICowKkAqUCpgKnAqgCqQKqAqsCrAKtAq4CrwKwArECsgKzArQCtQK2ArcCuAK5AroCuwK8Ar0CvgK/AsACwQLCAsMCxALFAsYCxwLIAskCygLLAswCzQLOAs8C0ALRAtIC0wLUAtUC1gLXAtgC2QLaAtsC3ALdAt4C3wLgAuEC4gLjAuQC5QLmAucC6ALpAuoC6wLsAu0C7gLvAvAC8QLyAvMC9AL1AvYC9wL4AvkC+gL7AvwC/QL+Av8DAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZAxoDGwMcAx0DHgMfAyADIQMiAyMDJAMlAyYDJwMoAykDKgMrAywDLQMuAy8DMAMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDPAM9Az4DPwNAA0EDQgNDA0QDRQNGA0cDSANJA0oDSwNMA00DTgNPA1ADUQNSA1MDVANVA1YDVwNYA1kDWgNbA1wDXQNeA18DYANhA2IDYwNkA2UDZgNnA2gDaQNqA2sDbANtA24DbwNwA3EDcgNzA3QDdQN2A3cDeAN5A3oDewN8A30DfgN/A4ADgQOCA4MDhAOFA4YDhwOIA4kDigOLA4wDjQOOA48DkAORA5IDkwOUA5UDlgOXA5gDmQOaA5sDnAOdA54DnwOgA6EDogOjA6QDpQOmA6cDqAOpA6oDqwOsA60DrgOvA7ADsQOyA7MDtAO1A7YDtwO4A7kDugO7A7wDvQO+A78DwAPBA8IDwwPEA8UDxgPHA8gDyQPKA8sDzAPNA84DzwPQA9ED0gPTA9QD1QPWA9cD2APZA9oD2wPcA90D3gPfA+AD4QPiA+MD5APlA+YD5wPoA+kD6gPrA+wD7QPuA+8D8APxA/ID8wP0A/UD9gP3A/gD+QP6A/sD/AP9A/4D/wQABAEEAgQDBAQEBQQGBAcECAQJBAoECwQMBA0EDgQPBBAEEQQSBBMEFAQVBBYEFwQYBBkEGgQbBBwEHQQeBB8EIAQhBCIEIwQkBCUEJgQnBCgEKQQqBCsELAQtBC4ELwQwBDEEMgQzBDQENQQ2BDcEOAQ5BDoEOwQ8BD0EPgQ/BEAEQQRCBEMERARFBEYERwRIBEkESgRLBEwETQROBE8EUARRBFIEUwRUBFUEVgRXBFgEWQRaBFsEXARdBF4EXwRgBGEEYgRjBGQEZQRmBGcEaARpBGoEawRsBG0EbgRvBHAEcQRyBHMEdAR1BHYEdwR4BHkEegR7BHwEfQR+BH8EgASBBIIEgwSEBIUEhgSHBIgEiQSKBIsEjASNBI4EjwSQBJEEkgSTBJQElQSWBJcEmASZBJoEmwScBJ0EngSfBKAEoQSiBKMEpASlBKYEpwSoBKkEqgSrBKwErQSuBK8EsASxBLIEswS0BLUEtgS3BLgEuQS6BLsEvAS9BL4EvwTABMEEwgTDBMQExQTGBMcEyATJBMoEywTMBM0EzgTPBNAE0QTSBNME1ATVBNYE1wTYBNkE2gTbBNwE3QTeBN8E4AThBOIE4wTkBOUE5gTnBOgE6QTqBOsE7ATtBO4E7wTwBPEE8gTzBPQE9QT2BPcE+AT5BPoE+wT8BP0E/gT/BQAFAQUCBQMFBAUFBQYFBwUIBQkFCgULBQwFDQUOBQ8FEAURBRIFEwUUBRUFFgUXBRgFGQUaBRsFHAUdBR4FHwUgBSEFIgUjBSQFJQUmBScFKAUpBSoFKwUsBS0FLgUvBTAFMQUyBTMFNAU1BTYFNwU4BTkFOgU7BTwFPQU+BT8FQAVBBUIFQwVEBUUFRgVHBUgFSQVKBUsFTAVNBU4FTwVQBVEFUgVTBVQFVQVWBVcFWAVZBVoFWwVcBV0FXgVfBWAFYQViBWMFZAVlBWYFZwVoBWkFagVrBWwFbQVuBW8FcAVxBXIFcwV0BXUFdgV3BXgFeQV6BXsFfAV9BX4FfwWABYEFggWDBYQFhQWGBYcFiAWJBYoFiwWMBY0FjgWPBZAFkQWSBZMFlAWVBZYFlwWYBZkFmgWbBZwFnQWeBZ8FoAWhBaIFowWkBaUFpgWnBagFqQWqBasFrAWtBa4FrwWwBbEFsgWzBbQFtQW2BbcFuAW5BboFuwW8Bb0FvgW/BcAFwQXCBcMFxAXFBcYFxwXIBckFygXLBcwFzQXOBc8F0AXRBdIF0wXUBdUF1gXXBdgF2QXaBdsF3AXdBd4F3wXgBeEF4gXjBeQF5QXmBecF6AXpBeoF6wXsBe0F7gXvBfAF8QXyBfMF9AX1BfYF9wX4BfkF+gX7BfwF/QX+Bf8GAAYBBgIGAwYEBgUGBgYHBggGCQYKBgsGDAYNBg4GDwYQBhEGEgYTBhQGFQYWBhcGGAYZBhoGGwYcBh0GHgYfBiAGIQYiBiMGJAYlBiYGJwYoBikGKgYrBiwGLQYuBi8GMAYxBjIGMwY0BjUGNgY3BjgGOQY6BjsGPAY9Bj4GPwZABkEGQgZDBkQGRQZGBkcGSAZJBkoGSwZMBk0GTgZPBlAGUQZSBlMGVAZVBlYGVwZYBlkGWgZbBlwGXQZeBl8GYAZhBmIGYwZkBmUGZgZnBmgGaQZqBmsGbAZtBm4GbwZwBnEGcgZzBnQGdQZ2BncGeAZ5BnoGewZ8Bn0GfgZ/BoAGgQaCBoMGhAaFBoYGhwaIBokGigaLBowGjQaOBo8GkAaRBpIGkwaUBpUGlgaXBpgGmQaaBpsGnAadBp4GnwagBqEGogajBqQGpQamBqcGqAapBqoGqwasBq0GrgavBrAGsQayBrMGtAa1BrYGtwa4BrkGuga7BrwGvQa+Br8GwAbBBsIGwwbEBsUGxgbHBsgGyQbKBssGzAbNBs4GzwbQBtEG0gbTBtQG1QbWBtcG2AbZBtoG2wbcBt0G3gbfBuAG4QbiBuMG5AblBuYG5wboBukG6gbrBuwG7QbuBu8G8AbxBvIG8wb0BvUG9gb3BvgG+Qb6BvsG/Ab9Bv4G/wcABwEHAgcDBwQHBQcGBwcHCAcJBwoHCwcMBw0HDgcPBxAHEQcSBxMHFAcVBxYHFwcYBxkHGgcbBxwHHQceBx8HIAchByIHIwckByUHJgcnBygHKQcqBysHLActBy4HLwcwBzEHMgczBzQHNQc2BzcHOAc5BzoHOwc8Bz0HPgc/B0AHQQdCB0MHRAdFB0YHRwdIB0kHSgdLB0wHTQdOB08HUAdRB1IHUwdUB1UHVgdXB1gHWQdaB1sHXAddB14HXwdgB2EHYgdjB2QHZQdmB2cHaAdpB2oHawdsB20HbgdvB3AHcQdyB3MHdAd1B3YHdwd4B3kHegd7B3wHfQd+B38HgAeBB4IHgweEB4UHhgeHB4gHiQeKB4sHjAeNB44HjweQB5EHkgeTB5QHlQeWB5cHmAeZB5oHmwecB50HngefB6AHoQeiB6MHpAelB6YHpweoB6kHqgerB6wHrQeuB68HsAexB7IHswe0B7UHtge3B7gHuQe6B7sHvAe9B74HvwfAB8EHwgfDB8QHxQfGB8cHyAfJB8oHywfMB80HzgfPB9AH0QfSB9MH1AfVB9YH1wfYB9kH2gfbB9wH3QfeB98H4AfhB+IH4wfkB+UH5gfnB+gH6QfqB+sH7AftB+4H7wfwB/EH8gfzB/QH9Qf2B/cH+Af5B/oH+wf8B/0H/gf/CAAIAQgCCAMIBAgFCAYIBwgICAkICggLCAwIDQgOCA8IEAgRCBIIEwgUCBUIFggXCBgIGQgaCBsIHAgdCB4IHwggCCEIIggjCCQIJQgmCCcIKAgpCCoIKwgsCC0ILggvCDAIMQgyCDMINAg1CDYINwg4CDkIOgg7CDwIPQg+CD8IQAhBCEIIQwhECEUIRghHCEgISQhKCEsg+wy3+iS3AfcQt/kstwP3EPoEFf58+YT6fAf9WP4nFfnSB/fF/DMFprAV+8X4NwX49gamYhX90gf7xfgzBXBmFffF/DcF/PYGDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OAAEBAQr4HwwmmhwZLRL7joscBUaLBr0KvQv65xUD6AB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAA==");}', 
+    e.cssRules.length);
+  };
   (function(e) {
-    e.instance = {enabled:!1, initJS:function(f) {
-    }, registerCallback:function(f) {
-    }, unregisterCallback:function(f) {
-    }, eval:function(f) {
-    }, call:function(f) {
+    e.instance = {enabled:!1, initJS:function(g) {